[英]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_KEYDOWN
或WM_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.