简体   繁体   English

如何使用 WH_KEYBOARD 在 LowLevelKeyboardProc 上处理按键 state?

[英]How to process key down state on LowLevelKeyboardProc with WH_KEYBOARD?

How i could know if the key processed by the LowLevelKeyboardProc is from a WM_KEYDOWN or WM_KEYUP message when using the hook procedure WH_KEYBOARD ?使用钩子程序WH_KEYBOARD时,我如何知道LowLevelKeyboardProc处理的密钥是否来自WM_KEYDOWNWM_KEYUP消息?

wParam is returning the value of vkCode instead of WM_KEYDOWN/UP . wParam返回vkCode而不是WM_KEYDOWN/UP的值。

I'm using WH_KEYBOARD because I want to intercept only the keypress into the given thread as WH_KEYBOARD_LL only works globally.我正在使用WH_KEYBOARD因为我只想将按键拦截到给定线程中,因为WH_KEYBOARD_LL仅在全局范围内有效。

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{

    if (nCode < 0 || nCode != HC_ACTION)
        return CallNextHookEx(g->KeyboardHook, nCode, wParam, lParam);

    KBDLLHOOKSTRUCT* pKeyBoard = (KBDLLHOOKSTRUCT*)lParam;

    // How to know if the msg is from a WM_KEYDOWN/KEYUP ?

    return CallNextHookEx(NULL, nCode, wParam, lParam);
}


int Main()
{
    WNDCLASSEX wc{};
    HWND hWnd = nullptr;
    MSG Msg;

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = 0;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = L"test";
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    hWnd = CreateWindowW(L"test", L"test",  WS_OVERLAPPED | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, 828, 492, nullptr, nullptr, nullptr, nullptr);

    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);

    g->KeyboardHook = SetWindowsHookEx(WH_KEYBOARD, LowLevelKeyboardProc, GetModuleHandle(NULL), GetWindowThreadProcessId(g->hWnd, NULL));

    while (GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return 0;
}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{

    if (nCode < 0 || nCode != HC_ACTION)
        return CallNextHookEx(g->KeyboardHook, nCode, wParam, lParam);
    
    WORD keyFlags = HIWORD(lParam);

    if ((wParam == VK_INSERT) && (keyFlags & KF_UP)) {
        // the key is up
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM