如何在子窗口上检测 WM_KEYDOWN?

问题描述

对于按钮、编辑等标准控件,我可以将其子类化,但是如何为子窗口完成此操作(我用作容器)?我知道 mainpage 被发送到父窗口,但我无法直接从相应的子窗口获取它。我已经尝试对它进行子类化(不确定这是否有意义,因为它是一个窗口并且在 WM_KEYDOWN 成员中已经有自己的窗口过程)但是这个子过程无论如何都没有收到 WNDCLASSW.lpfnWndProc 消息。我可以通过使用 WM_KEYDOWNGetCursorPos() 如下所示从光标位置获取控件的 hwnd(我也需要考虑键盘焦点),但我觉得它很笨拙。这样做的正确方法是什么?

目前看起来像这样:

WindowFromPoint()

窗口看起来像这样:

enter image description here

目标是在用户键入内容的相应窗口上捕获 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);
    }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...