Windows API Mousehook, захват правой кнопки мыши + Ctrl (WM_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, 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);
}

что мне здесь не хватает?


person yezy    schedule 12.10.2020    source источник
comment
когда я хочу попробовать случай, когда нажат только Ctrl и он должен что-то напечатать, он все равно не работает Вы прописали только хук мыши, чтобы цеплять клавишу ctrl, вам также нужно прописать крючок клавиатуры (WH_KEYBOARD_LL).   -  person Drake Wu    schedule 12.10.2020
comment
if (wParam == WM_RBUTTONDOWN & MK_CONTROL) делает не то, что вы думаете.   -  person Raymond Chen    schedule 12.10.2020
comment
@DrakeWu-MSFT, на самом деле моя функция mouseProc печатает имя / текст элемента пользовательского интерфейса, на который указывает курсор, он создается с использованием этого mouseHook = SetWindowsHookEx(WH_MOUSE_LL, &mouseProc, hInstance, 0);, поэтому в этой сложной ситуации, как я могу ввести хук клавиатуры + хук мыши?   -  person yezy    schedule 12.10.2020


Ответы (1)


Прежде всего, если вы хотите захватить правую кнопку + ctrl, вы можете проверить состояние клавиши Ctrl (нажата ли она) при обнаружении WM_RBUTTONDOWN.

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;
};
person Drake Wu    schedule 12.10.2020