Если я использую CreateEx() после создания главного окна, я не могу найти FindWindow().

У меня есть следующий код для создания окна "только сообщение", окно всегда создается нормально, проблема возникает когда оно создается.

Процесс А

...
auto hInstance = ::GetModuleHandle( nullptr );
WNDCLASSEX wcx;
wcx.cbSize = sizeof(wcx);
wcx.style = 0;
wcx.lpfnWndProc = MyWinProc;
wcx.cbClsExtra = 0;
wcx.cbWndExtra = 0;
wcx.hInstance = hInstance;
wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
wcx.hCursor = LoadCursor(NULL, IDC_ARROW);
wcx.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH);
wcx.lpszMenuName = L"MainMenu";
wcx.lpszClassName = L"MyDummyClass";
wcx.hIconSm = (HICON)LoadImage(hInstance,
              MAKEINTRESOURCE(5),
              IMAGE_ICON,
              GetSystemMetrics(SM_CXSMICON),
              GetSystemMetrics(SM_CYSMICON),
              LR_DEFAULTCOLOR);

if (!RegisterClassEx(&wcx))
{
  throw "Bad 1.";
}

if (!this->CWnd::CreateEx(0, L"MyDummyClass", L"MyDummyWindow", 0, 0, 0, 0, 0, HWND_MESSAGE, nullptr))
{
  throw "Bad 2.";
}

Процесс Б

 auto myWnd = FindWindow( L"MyDummyClass");

Теперь у меня проблема: если process A создать окно до вызова OnInitDialog, то process B сможет найти окно.

Но если process A создаст окно в любое другое время после создания главного окна, process B больше не сможет найти это окно.

В обоих случаях насос сообщений вызывается нормально, окно создается как положено, я просто не могу FindWindow создать его после запуска основного приложения.

Почему это может быть, и как я могу обойти это?


person Simon Goodman    schedule 29.06.2016    source источник
comment
Почему бы не передать объект HWND или Class процессу B?   -  person Joel    schedule 29.06.2016
comment
@JonnyHenly, я имею в виду, что в любом случае окно создается без ошибок, но если оно создано до создания главного окна, его можно «найти», но если оно создано после создания основного диалога, его больше нельзя найти .   -  person Simon Goodman    schedule 29.06.2016
comment
@Joel, эти два процесса являются отдельными исполнителями.   -  person Simon Goodman    schedule 29.06.2016
comment
Можете ли вы использовать spyxx.exe, чтобы увидеть, создано ли окно, как ожидалось? Чем отличаются оба случая? Является ли его родитель одинаковым в обоих случаях?   -  person David Thomas    schedule 29.06.2016


Ответы (1)


Вместо этого используйте FindWindowEx:

Чтобы найти окна только для сообщений, укажите HWND_MESSAGE в параметре hwndParent функции FindWindowEx. Кроме того, FindWindowEx ищет окна только для сообщений, а также окна верхнего уровня, если оба параметра hwndParent и hwndChildAfter равны NULL.

person Ari0nhh    schedule 29.06.2016
comment
Я только что попробовал, и окно также не найдено с помощью FindWindowEx, оно «найдено», если я создаю окно до создания основного диалога, но не после. - person Simon Goodman; 29.06.2016