CreateWindow () [Win32 API]: получает только родительское окно - PullRequest
0 голосов
/ 10 ноября 2009

Я задал вопрос , и некоторые люди отметили, что мой вопрос не ясен, Итак, вот новый.

Я пытаюсь создать приложение с несколькими окнами, используя WIN32 API. Я создал два окна, одно из которых является дочерним по отношению к родителю. Тогда у меня есть цикл сообщений, Но, к сожалению, только родительский WndProc получает сообщение, а дочерний - нет. - тот является то, что wndProc вызывается только один раз, а не дважды. (это ожидаемое поведение?)

Я также попытался создать другую функцию WndProcChild для дочернего окна и зарегистрировать собственный класс, но все еще безрезультатно.

Ниже приведен фрагмент кода (только объявление дочернего окна и цикл сообщений)

Я новичок в Win32, так что будь осторожен ... Спасибо, Дэн

wcEdit.lpfnWndProc   = WndProcChild;  
wcEdit.style         = CS_HREDRAW | CS_VREDRAW;  
wcEdit.cbClsExtra    = 0;  
wcEdit.cbWndExtra    = 0;  
wcEdit.hInstance     = hInstance;;  
wcEdit.hCursor       = 0;  
wcEdit.lpszMenuName  = 0;  
wcEdit.lpszClassName = L"child";  
RegisterClass(&wcEdit);  
edit_hwnd = CreateWindow(L"child",  L"child_title", NULL,    
     0, 0, 0, 0, ParentWindow,    
     NULL, global_instance, NULL);    

UpdateWindow(edit_hwnd);
while (GetMessage(&msg, NULL, 0, 0))  
{  
     TranslateMessage(&msg);  
     DispatchMessage(&msg);  
}  

Просто чтобы еще раз объяснить, чего я хочу достичь - я хочу обработать сообщение WM_KEYDOWN дважды - один раз в родительском окне и один раз в дочернем окне. Я на самом деле не нуждаюсь в том, чтобы они были родителями, просто подумал, что это спасет меня от создания двух разных wndProcs

Ответы [ 3 ]

1 голос
/ 10 ноября 2009

Звучит так, будто вы ожидаете сообщения WM_KEYDOWN дважды ... Этого не произойдет. Только окно с ключевым фокусом получит сообщение WM_KEYDOWN.

0 голосов
/ 02 февраля 2016

Чтобы обойти эту проблему, вы можете попробовать ловушки или другой подобный подход, потому что в Windows нет прямого способа добиться этого. По сути, вам нужно отслеживать события нажатия клавиш в потоке, владеющем другим окном, и перехватывать их. Я бы начал с функции SetWinEventHook .

0 голосов
/ 10 ноября 2009

Унаследованные окна имеют два атрибута: родительский и владелец. В OS / 2 это были отдельные свойства, но в Win32 они объединялись в одно. Проверьте это SO поток :

...