在WindowProc中查找按钮单击事件的原因

时间:2015-07-27 13:45:12

标签: c++ windows winapi

我正在学习C ++中基于Windows的GUI,所以我设置了一个带有一个按钮内部窗口的简单项目(我能够检测到这个按钮被点击的时间)。 现在,在我的窗口WindowProc中,我想找到触发WM_COMMAND的“原因”,因为我的意思是我想查找是否用鼠标单击了按钮,或者用户是否设置了它在焦点上然后按Enter键(或空格键) 这是WindowProc

的一部分
    int UControl::WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        OutputDebugStringNewLine((UWindowsDebugHelper::GetMessageString(message) + TEXT(" ") + this->GetType()).c_str()); //This writes on the VS Output window the code of the message as string, for example it writes "WM_COMMAND" when it is received, instead of "273"
        switch (message)
        {
        case WM_CLOSE:
            DestroyWindow(hwnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        case WM_COMMAND:
            if(lParam != 0)
            {
                if(HIWORD(wParam) == BN_CLICKED)
                {
                    UControl* ctrl = this->FindControl((HWND)lParam);
                    __raise ctrl->Click(ctrl, UEventArgs::Empty);
                }
            }
            break;
        default:
            break;
        }
        if(this->_nativeWndProc != NULL)
            return this->_nativeWndProc(hwnd, message, wParam, lParam);
        else
            return DefWindowProc(hwnd, message, wParam, lParam);
    }
当我用鼠标点击按钮时,

HIWORD(wParam)为BN_CLICKED,但当我用空格键“点击”时,它也是BN_CLICKED。

我如何区分事件原因?

1 个答案:

答案 0 :(得分:0)

  

我如何区分事件原因?

BN_CLICKED未提供该信息。您必须分别跟踪WM_LBUTTON(DOWN/UP)WM_KEY(DOWN/UP)消息,以确定发生了什么。但这只能帮助您区分鼠标/键盘点击。正如DavidHeffernan所说,还有其他方法可以直接点击按钮和/或模拟BN_CLICKED,而无需通过鼠标/键盘。