Как получить hWnd окна, открытого ShellExecuteEx.. hProcess?
эта "простая" проблема, похоже, чревата побочными проблемами.
например. Открывает ли новый процесс несколько окон; имеет ли он заставку?
Есть ли простой способ? (Я запускаю новый экземпляр Notepad++)
...
std::tstring tstrNotepad_exe = tstrProgramFiles + _T("Notepad++notepad++.exe");
SHELLEXECUTEINFO SEI={0};
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.hwnd = hWndMe; // This app's window handle
sei.lpVerb = _T("open");
sei.lpFile = tstrNotepad_exe.c_str();
sei.lpParameters = _T(" -multiInst -noPlugins -nosession -notabbar ";
sei.lpDirectory = NULL;
sei.nShow = SW_SHOW;
sei.hInstApp = NULL;
if( ShellExecuteEx(&sei) )
{ // I have sei.hProcess, but how best to utilize it from here?
}
...
1 ответов
первым использованием WaitForInputIdle
чтобы приостановить программу до запуска приложения и ожидания ввода пользователем (главное окно должно быть создано к тому времени), затем используйте EnumWindows
и GetWindowThreadProcessId
чтобы определить, какие окна в системе, принадлежат к созданному процессу.
например:
struct ProcessWindowsInfo
{
DWORD ProcessID;
std::vector<HWND> Windows;
ProcessWindowsInfo( DWORD const AProcessID )
: ProcessID( AProcessID )
{
}
};
BOOL __stdcall EnumProcessWindowsProc( HWND hwnd, LPARAM lParam )
{
ProcessWindowsInfo *Info = reinterpret_cast<ProcessWindowsInfo*>( lParam );
DWORD WindowProcessID;
GetWindowThreadProcessId( hwnd, &WindowProcessID );
if( WindowProcessID == Info->ProcessID )
Info->Windows.push_back( hwnd );
return true;
}
....
if( ShellExecuteEx(&sei) )
{
WaitForInputIdle( sei.hProcess, INFINITE );
ProcessWindowsInfo Info( GetProcessId( sei.hProcess ) );
EnumWindows( (WNDENUMPROC)EnumProcessWindowsProc,
reinterpret_cast<LPARAM>( &Info ) );
// Use Info.Windows.....
}