2009-11-10 3 views
0

I asked a question, и некоторые люди прокомментировали, что мой вопрос не ясен, Итак, вот новый.CreateWindow() [Win32 API]: только родительское окно получает

Я пытаюсь создать приложение с несколькими окнами, используя API WIN32. Я создал два окна, один из которых является потомком родителя. Тогда у меня есть цикл сообщений, Но, к сожалению, только родительский 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.

+0

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

+3

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

ответ

1

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

+0

Вы можете получить родительские/дочерние окна для обработки сообщений цепочки. Однако вы должны следить за рекурсивной обработкой событий. –

+0

Вы можете использовать SetFocus для установки окна, в котором вы хотите получить фокус клавиатуры. Стандартные элементы управления (например, окна редактирования) будут рисовать фокус прямо вокруг себя и отображать каретку, чтобы показать, что они являются * * окном, которое будет получать ввод с клавиатуры. –

0

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

0

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

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