Вот сценарий:
У меня есть 2 приложения. Одно из них — мое основное приложение, а второе — диалоговое приложение, которое запускается из первого. Я пытаюсь захватить основной дескриптор диалогового приложения из моего основного приложения. Проблема в том, что я не могу найти его с помощью EnumWindows. Проблема исчезает, если я ставлю сон на секунду, непосредственно перед тем, как начать перечисление окон.
Это код:
...
BOOL res = ::CreateProcess( NULL, _T("MyApp.exe"), NULL, NULL, FALSE, NULL, NULL, NULL, &siStartInfo, &piProcInfo );
ASSERT(res);
dwErr = WaitForInputIdle(piProcInfo.hProcess, iTimeout);
ASSERT(dwErr == 0);
//Sleep(1000); //<-- uncomment this will fix the problem
DWORD dwProcessId = piProcInfo.dwProcessId;
EnumWindows(EnumWindowsProc, (LPARAM)&dwProcessId);
....
BOOL IsMainWindow(HWND handle)
{
return GetWindow(handle, GW_OWNER) == (HWND)0 && IsWindowVisible(handle);
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
DWORD* pParam = (DWORD*)lParam;
DWORD dwTargetProcessId = *pParam;
DWORD dwProcessId = 0;
::GetWindowThreadProcessId(hwnd, &dwProcessId);
if (dwProcessId == dwTargetProcessId )
{
TCHAR buffer[MAXTEXT];
::SendMessage(hwnd, WM_GETTEXT, (WPARAM)MAXTEXT,(LPARAM)buffer);
if( IsMainWindow(hwnd))
{
g_hDlg = hwnd;
return FALSE;
}
}
return TRUE;
}
Есть ровно 2 окна, которые принадлежат моему процессу, и отслеживание их текста показывает:
GDI+ Window
Default IME
Я не совсем уверен, что это значит. Это могут быть заголовки по умолчанию, назначенные окнам до их инициализации.... но я вызываю EnumWindows после WaitForInputIdle...
Любая помощь будет оценена.