微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

按住Windows API的Mousehook,捕获鼠标右键+ CtrlWM_RBUTTONDOWN + MK_CONTROL

如何解决按住Windows API的Mousehook,捕获鼠标右键+ CtrlWM_RBUTTONDOWN + MK_CONTROL

最初,当我只使用鼠标右键按下时,我能够打印某些内容 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,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,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,LPARAM lParam)
{
    KBDLLHOOKSTRUCT* pKeyboardStruct = (KBDLLHOOKSTRUCT*)lParam;
    if (pKeyboardStruct != nullptr)
    {
        if (pKeyboardStruct->vkCode == VK_LCONTROL)  
        {
            if(wParam == WM_KEYDOWN)
                std::cout << "  -ctrl-  ";
        }
    }
    return CallNextHookEx(NULL,lParam);
}
void main(void)
{
    HHOOK hmouse = SetWindowsHookEx(WH_MOUSE_LL,mouseProc,hInstance,0);
    HHOOK hkeyboard = SetWindowsHookEx(WH_KEYBOARD_LL,keyboardProc,0);

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

    return;
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。