【问题标题】:CreateWindow() [Win32 API] : Only parent window getsCreateWindow() [Win32 API] : 只有父窗口获取
【发布时间】:2010-12-15 01:49:13
【问题描述】:

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

【问题讨论】:

  • 再次解释我想要实现的目标 - 我想处理 WM_KEYDOWN 消息两次 - 一次在父窗口中,一次在子窗口中。我实际上并不需要他们成为父子,只是认为这样可以节省我创建两个不同的 wndProcs...
  • 您应该只编辑原始帖子,而不是发布新问题。

标签: winapi wndproc


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 您可以让父/子窗口链接消息处理。不过,您必须注意递归事件处理。
      • 您可以使用 SetFocus 设置您想要获得键盘焦点的窗口。标准控件(如编辑框)将在其周围绘制一个焦点矩形并显示一个插入符号以表明它们是 将接收键盘输入的窗口。
      猜你喜欢
      • 2010-10-05
      • 1970-01-01
      • 2012-09-19
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 2011-08-04
      相关资源
      最近更新 更多