Windows API Mousehook , Capture 鼠标右键 + Ctrl (WM_RBUTTONDOWN + MK_CONTROL) 一起点击

Windows API Mousehook , Capture rightmousebutton + Ctrl (WM_RBUTTONDOWN + MK_CONTROL) clicked togather

最初,当我只按下鼠标右键时,我能够打印一些东西 if (wParam == WM_RBUTTONDOWN)但是现在,我想要同样的效果,我想在按下鼠标右键 + Ctrl 键时打印一些东西。我怎样才能做到这一点?

我试过了


LRESULT CALLBACK MainWindow::mouseProc(int Code, WPARAM wParam, LPARAM lParam)
{
        auto& ms = *(const MSLLHOOKSTRUCT*)lParam;
        MSLLHOOKSTRUCT* pMouseStruct = (MSLLHOOKSTRUCT*)lParam;
        if (pMouseStruct != nullptr)
        {
            if (wParam == WM_RBUTTONDOWN & MK_CONTROL)  // Here, i added MK_CONTROL but it doesn't work
            {
                qDebug() << "Print something when Right mouse button and Ctrl button is pressed togather"; 
            }
        }
    return CallNextHookEx(NULL, Code, wParam, lParam);
}

更新

当我想尝试只按下 Ctrl 并且它应该打印一些东西的情况时,它仍然不起作用

LRESULT CALLBACK MainWindow::mouseProc(int Code, WPARAM wParam, LPARAM lParam)
{
        auto& ms = *(const MSLLHOOKSTRUCT*)lParam;
        MSLLHOOKSTRUCT* pMouseStruct = (MSLLHOOKSTRUCT*)lParam;
        if (pMouseStruct != nullptr)
        {
            if (wParam == MK_CONTROL)  // Here, i added only MK_CONTROL but it doesn't work
            {
                qDebug() << "Print something when  Ctrl button is pressed ";
            }
        }
    return CallNextHookEx(NULL, Code, wParam, lParam);
}

我在这里错过了什么?

首先,如果要捕获右键+ctrl,可以在检测到WM_RBUTTONDOWN时查看Ctrl键的状态(是否按下)

LRESULT CALLBACK mouseProc(int Code, WPARAM wParam, LPARAM lParam)
{
    auto& ms = *(const MSLLHOOKSTRUCT*)lParam;
    MSLLHOOKSTRUCT* pMouseStruct = (MSLLHOOKSTRUCT*)lParam;
    if (pMouseStruct != nullptr)
    {
        if (wParam == WM_RBUTTONDOWN && (GetAsyncKeyState(VK_LCONTROL)&0x8000))  //Left CONTROL key as example
        {
            std::cout << "ctrl + rbutton";
        }
    }
    return CallNextHookEx(NULL, Code, wParam, lParam);
}

如果要用键盘钩子钩子只有 "Ctrl":

LRESULT CALLBACK keyboardProc(int Code, WPARAM wParam, LPARAM lParam)
{
    KBDLLHOOKSTRUCT* pKeyboardStruct = (KBDLLHOOKSTRUCT*)lParam;
    if (pKeyboardStruct != nullptr)
    {
        if (pKeyboardStruct->vkCode == VK_LCONTROL)  
        {
            if(wParam == WM_KEYDOWN)
                std::cout << "  -ctrl-  ";
        }
    }
    return CallNextHookEx(NULL, Code, wParam, lParam);
}
void main(void)
{
    HHOOK hmouse = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, hInstance, 0);
    HHOOK hkeyboard = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardProc, hInstance, 0);

    MSG msg;
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    UnhookWindowsHookEx(hmouse);
    UnhookWindowsHookEx(hkeyboard);

    return;
};