2009-11-10 136 views
0

I asked a question,有人评论说我的问题不清楚, 所以这里是一个新的。CreateWindow()[Win32 API]:只有父窗口得到

我想用多个窗口使用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

+0

只是为了再次解释我想达到的目的 - 我想要处理WM_KEYDOWN消息两次 - 一次在父窗口中,一次在子窗口中。我其实并不需要他们成为父母子女,只是认为这将节省我创建两个不同的wndProcs ... – dan 2009-11-10 14:52:09

+3

而不是发布一个新的问题,你应该刚刚编辑原始帖子。 – Aaron 2009-11-10 15:00:23

回答

1

这听起来像你期待两次WM_KEYDOWN消息......这不会发生。只有重点关注的窗口才会显示WM_KEYDOWN消息。

+0

您可以获取父/子窗口以链接消息处理。尽管如此,你必须小心递归事件处理。 – 2009-11-10 15:29:52

+0

您可以使用SetFocus设置想要获得键盘焦点的窗口。标准控件(如编辑框)将围绕自己绘制焦点矩形,并显示一个插入符号以显示它们是将接收键盘输入的*窗口。 – 2009-11-10 15:30:36

0

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

0

你可以尝试挂钩或类似的方法来解决这个问题,因为没有直接的方法可以在Windows上实现这一点。基本上,您需要监视拥有其他窗口的线程上的关键事件并拦截它们。我会从SetWinEventHook函数开始。