2010-07-16 2 views
7

Эта «простая» проблема, похоже, чревата побочными проблемами.
например. Открывает ли новый процесс несколько окон; Есть ли заставка?
Есть ли простой способ? (Я начинаю новый экземпляр Notepad ++)Как получить hWnd окна, открытого ShellExecuteEx .. hProcess?

... 
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? 
} 
... 

ответ

12

Первое использование 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..... 
} 
+0

Спасибо Джон ... Так короткий интервал опроса является путь ... что имеет смысл :) –

+0

я теперь работает через ваш пример ... и PS к моему предыдущему комментарию: я только что заметил в MSDN: WaitForInputIdle можно использовать в любое время, а не только во время запуска приложения. Однако WaitForInputIdle ждет только один раз, когда процесс станет бездействующим; последующие вызовы WaitForInputIdle немедленно возвращаются, независимо от того, является ли процесс незанятым или занятым. * Кажется, опрос - не очень хорошая идея ... Я сделаю несколько тестов. –

+0

При создании процесса вам нужно использовать WaitForInputIdle. С этого момента просто опросите вызов EnumWindows, чтобы получить обновленный список окон. –

Смежные вопросы