控制子类的过程不起作用。为什么?

The procedure of control subclassed does not work. Why?

我最近尝试使用 SetWindowSubclass() 函数对控件进行子类化。令我惊讶的是,它一开始运行得很顺利。我创建了控制程序,但它没有收到 WM_LBUTTONDOWNWM_KEYDOWN 之类的消息,我不明白为什么!我昨天一直在搜索,我承认我正在失去希望。

这是我的代码,经过简化(平时很长!):

HWND button = CreateWindow("BUTTON", NULL, WS_VISIBLE | WS_CHILD | BS_OWNERDRAW, 100, 200, 250, 50, hwnd, (HMENU)ID_B_JOUER, instance, NULL);
SetWindowSubclass(boutton, ControlProc, ID_B_JOUER, 0);

这里是控制程序:

LRESULT CALLBACK ControlProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
    switch(msg)
    {
        case WM_...:
        {
            MessageBox(hwnd, "Bonjour!", "Message", MB_ICONINFORMATION); // Here it does not work!!! Something be the message.
            break;
        }
        default:
        {
            DefSubclassProc(hwnd, msg, wParam, lParam);
        }
    }

    return 0;
}

我想澄清一下,我正在使用 GetLastError() 函数并且它返回了 0(没问题)。我希望有人有解决方案,因为它很奇怪。

您正在创建一个新的 BUTTON 控件并将其分配给一个名为 button 的变量,但您正在使用另一个名为 boutton 的变量进行子类化。

假设这只是一个拼写错误,您的 ControlProc() 对每条消息都是 returning 0,它忽略了 DefSubclassProc() 的 return 值,这可能不会为 0。对于未处理的消息,您必须 return DefSubclassProc() return。

HWND button = CreateWindow("BUTTON", NULL, WS_VISIBLE | WS_CHILD | BS_OWNERDRAW, 100, 200, 250, 50, hwnd, (HMENU)ID_B_JOUER, instance, NULL);
SetWindowSubclass(button, &ControlProc, ID_B_JOUER, 0);

...

LRESULT CALLBACK ControlProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
    switch (msg)
    {
        case WM_LBUTTONDOWN:
        case WM_KEYDOWN:
        {
            MessageBox(hwnd, "Bonjour!", "Message", MB_ICONINFORMATION);
            break;
        }

        default:
        {
            return DefSubclassProc(hwnd, msg, wParam, lParam);
        }
    }

    return 0;
}