如何用WH_KEYBOARD处理LowLevelKeyboardProc上的按键关闭状态
How to process key down state on LowLevelKeyboardProc with WH_KEYBOARD?
当使用钩子过程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
}
}
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- std::future_error:无关联状态
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 试图在崇高中奔跑. 错误 已发生: 收集2.exe: 错误: ld 返回 1 退出状态
- 在容器上移动分配:以前包含的对象的状态
- collect2:错误:ld 返回 1 个退出状态未定义的引用
- 具有动态大小的特征矩阵的默认初始状态
- 如何从Clojure调用C++程序,以使程序保持打开状态?
- q网络回复 无状态码或错误,但失败