问题描述
对于按钮、编辑等标准控件,我可以将其子类化,但是如何为子窗口完成此操作(我用作容器)?我知道 mainpage
被发送到父窗口,但我无法直接从相应的子窗口获取它。我已经尝试对它进行子类化(不确定这是否有意义,因为它是一个窗口并且在 WM_KEYDOWN
成员中已经有自己的窗口过程)但是这个子过程无论如何都没有收到 WNDCLASSW.lpfnWndProc
消息。我可以通过使用 WM_KEYDOWN
和 GetCursorPos()
如下所示从光标位置获取控件的 hwnd(我也需要考虑键盘焦点),但我觉得它很笨拙。这样做的正确方法是什么?
目前看起来像这样:
WindowFromPoint()
窗口看起来像这样:
目标是在用户键入内容的相应窗口上捕获 WM_KEYDOWN,然后调用函数来处理此事件,例如 case WM_KEYUP:
case WM_KEYDOWN:
{
POINT p;
if(GetCursorPos(&p))
{
HWND control = WindowFromPoint(p);
if(control)
{
// just testing it
int len = GetwindowTextLength(control);
wchar_t buffer[len + 1];
GetwindowText(control,buffer,sizeof(buffer));
MessageBox(NULL,L"",MB_OK);
}
}
}
break;
、window1_onKeyDown()
等。
完整代码如下:
window2_onKeyDown()
解决方法
您可以在子窗口中使用 SetFocus
。
一些代码:
case WM_KEYDOWN:
{
POINT p;
HWND control = GetFocus();
if (control)
{
int len = GetWindowTextLength(control);
wchar_t* buffer = new wchar_t[len + 1];
GetWindowText(control,buffer,len + 1);
MessageBox(NULL,L"",MB_OK);
}
}
break;
LRESULT CALLBACK WndProc1(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch (msg)
{
case WM_CREATE:
CreateWindow(L"Button",L"Button A",WS_VISIBLE | WS_TABSTOP | WS_CHILD,5,80,25,hwnd,NULL,0);
break;
case WM_LBUTTONDOWN:
SetFocus(hwnd);
break;
case WM_KEYUP:
case WM_KEYDOWN:
MessageBox(NULL,L"hello from proc1",MB_OK);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProcW(hwnd,msg,wParam,lParam);
}
也可以使用当前方法,然后使用PostMessage/SendMessage将WM_KEYDOWN
消息转发到子窗口:
if (control)
{
int len = GetWindowTextLength(control);
wchar_t* buffer = new wchar_t[len + 1];
GetWindowText(control,len + 1);
MessageBox(NULL,MB_OK);
PostMessage(hwnd_child,lParam);
}