Всем привет.
Есть следующая проблема:
— Создаю приложение как Windows Application
— Удаляю всё из WinMain (точнее, создаю Empty Project)
— Пишу туда свой код, состоящий из:
CreateProcess( ... ) с установкой STARTF_USESHOWWINDOW и SW_SHOWMAXIMIZED (то есть окно создаваемого процесса должно выйти на передний план и максимизироваться)
WaitForSingleObject( pi.hProcess, INFINITE ); — жду завершения запущенного процесса
— Проблема в следующем: при запуске из эксплорера окно эксплорера получается активным!, то есть перекрывает окно созданного процесса. Если WaitForSingleObject убрать (то есть прога-родитель завершается), эксплорер оказывается под окном вызванного процесса. Если вместо WaitForSingleObject просто поставить пустой цикл, проблема остаётся, эксплорер наверху. То есть получается, что сама моя безоконная прога делает эксплорер столь активным.
Подскажите, плиз, как можно эту проблему решить.
Вот исходник:
#include <windows.h>
int __stdcall wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd ) {
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &pi, sizeof(pi) );
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWMAXIMIZED;
if( !CreateProcessW( L"proga.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ) ) {
DWORD err = GetLastError();
return -1;
}
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
return 0;
}
28.10.08 19:06: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Здравствуйте, <Аноним>, Вы писали:
А>Всем привет.
А>Есть следующая проблема:
А>- Создаю приложение как Windows Application
А>- Удаляю всё из WinMain (точнее, создаю Empty Project)
А>- Пишу туда свой код, состоящий из:
А>CreateProcess( ... ) с установкой STARTF_USESHOWWINDOW и SW_SHOWMAXIMIZED (то есть окно создаваемого процесса должно выйти на передний план и максимизироваться)
А>WaitForSingleObject( pi.hProcess, INFINITE ); — жду завершения запущенного процесса
А>- Проблема в следующем: при запуске из эксплорера окно эксплорера получается активным!, то есть перекрывает окно созданного процесса. Если WaitForSingleObject убрать (то есть прога-родитель завершается), эксплорер оказывается под окном вызванного процесса. Если вместо WaitForSingleObject просто поставить пустой цикл, проблема остаётся, эксплорер наверху. То есть получается, что сама моя безоконная прога делает эксплорер столь активным.
А>Подскажите, плиз, как можно эту проблему решить.
Можно или поднять приоритет создаваемого процесса на 1, или найти главное окно это процесса и передвинуть его наверх. Второе, имхо лучше.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
R>Можно или поднять приоритет создаваемого процесса на 1, или найти главное окно это процесса и передвинуть его наверх. Второе, имхо лучше.
Поднятие приоритета не спасает. Ставил реалтайм, всё равно приложение под эксплорером.
А как найти главное окно созданного процесса и передвинуть его наверх? У меня ведь только процесс хэндл есть.
Вообще я в вин апи не очень силён...
Здравствуйте, TheRoSS, Вы писали:
TRS>А как найти главное окно созданного процесса и передвинуть его наверх? У меня ведь только процесс хэндл есть.
TRS>Вообще я в вин апи не очень силён...
FindWindow, по заголовку и/или классу окна.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Rocky, спасибо

Всё сделал.
Всем, кому интересно, вот код:
BOOL CALLBACK EnumProc( HWND hwnd, LPARAM lparam ) {
ShowWindow( hwnd, SW_SHOWMAXIMIZED );
return TRUE;
}
И после создания процесса в тело основной функции вставить:
EnumThreadWindows( (DWORD)pi.hThread, EnumProc, 0 );