如何用WH_KEYBOARD处理LowLevelKeyboardProc上的按键关闭状态

How to process key down state on LowLevelKeyboardProc with WH_KEYBOARD?

本文关键字:状态 LowLevelKeyboardProc WH 何用 KEYBOARD 处理      更新时间:2024-09-26

当使用钩子过程WH_KEYBOARD时,我如何知道LowLevelKeyboardProc处理的密钥是来自WM_KEYDOWN还是WM_KEYUP消息?

CCD_ 5正在返回CCD_ 6的值而不是CCD_。

我使用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
}
}