CreateWindow()[Win32 API]:只有父窗口获取

时间:2009-11-10 14:48:59

标签: winapi wndproc

I asked a question,有些人评论说我的问题不明确, 所以这是一个新的。

我正在尝试使用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 个答案:

答案 0 :(得分:1)

听起来好像你期待两次WM_KEYDOWN消息......这不会发生。只有具有关键焦点的窗口才会收到WM_KEYDOWN消息。

答案 1 :(得分:0)

继承窗口有两个属性,父级和所有者。在OS / 2中,这些是单独的属性,但在Win32中它们合并为一个。看看这个SO thread

答案 2 :(得分:0)

您可以尝试使用挂钩或类似的方法来解决此问题,因为没有直接的方法可以在Windows上实现此目的。基本上,您需要监视拥有另一个窗口的线程上的按键事件并拦截它们。我从this one函数开始。