c++ - 使用 SetWindowsHookEx 时灵敏度下降
问题描述
当我把钩子放在鼠标上时,我会周期性地失去灵敏度,它会增加约 0.3 秒(大约两倍)。我怎样才能解决这个问题?我的处理程序代码:
LRESULT CALLBACK mouseProc(int Code, WPARAM wParam, LPARAM lParam){
MOUSEHOOKSTRUCT* pMouseStruct = (MOUSEHOOKSTRUCT*)lParam;
if (pMouseStruct != nullptr) {
switch (wParam) {
case WM_LBUTTONDOWN:
std::cout << "WM_LBUTTONDOWN";
break;
case WM_LBUTTONUP:
std::cout << "WM_LBUTTONUP";
break;
case WM_RBUTTONDOWN:
std::cout << "WM_RBUTTONDOWN";
break;
case WM_RBUTTONUP:
std::cout << "WM_RBUTTONUP";
break;
default:
break;
}
}
return CallNextHookEx(NULL, Code, wParam, lParam);}
我把钩子这样放:
HHOOK hook = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, NULL, 0);
MSG message;
while (GetMessage(&message, NULL, 0, 0) > 0)
{
TranslateMessage(&message);
DispatchMessage(&message);
}
UnhookWindowsHookEx(hook);
解决方案
你在这段代码中失去了敏感性,因为std::cout
它很慢。您需要对这种挂钩做出非常快速的反应,否则您显然会失去敏感性。
如果您真的需要登录您的钩子,请使用spdlog 之类的东西并异步记录所有内容。
此外,正如理查德在评论中提到的,你需要在你的钩子开始时这样的东西:
if (nCode < 0) // do not process message
return CallNextHookEx(hhook, nCode, wParam, lParam);
推荐阅读
- sequelize.js - sequelize 没有将关联的表数据作为对象返回
- css - Firefox 中滚动元素中的文本总是省略号
- angular - Angular 构建未正确编译 GitHub Actions
- c++ - 梯度不符合有限差分
- fortran - 重置(解除分配/无效)已损坏的 Fortran 可分配数组
- javascript - jQuery Ajax 自动在日期上添加时间戳
- uproot - uproot4可以写TTrees吗?
- angular - 使用 Input 装饰器将对象的特定属性传递给子组件
- javascript - 在页面加载时获取 safe-area-inset-bottom
- python-3.x - 无法将子包中的模块导入另一个子包