Вот сценарий:Невозможно найти ручку главного окна только что прочитанного Диалог APP
У меня 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;
}
Есть ровно два окна, которые принадлежат к моему процессу и отслеживание их текста показывает:
GDI+ Window
Default IME
Я не совсем уверен, что это значит. Это могут быть заголовки по умолчанию, назначенные для окон, до их инициализации .... но я вызываю EnumWindows после WaitForInputIdle ...
Любая помощь будет оценена.
Вы должны объяснить, что "главное окно"? Как он отличается от другого окна верхнего уровня? –
Привет, В главном окне я имею в виду главное окно :). Те, кто справляется со всеми остальными. В этом случае основным окном является диалоговое окно. – Kiko
Это как сказать «этим окном я имею в виду это окно» :) Что особенного в окне, которое вы назвали «основным»? Как вы можете отличить его от других окон, таких как «GDI + Window»? –