相关疑难解决方法(0)

了解低级鼠标和键盘钩子(win32)

我正在尝试捕获全局鼠标和键盘输入.

LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
  if (nCode >= 0) {
    if (wParam == WM_RBUTTONDOWN) printf("right mouse down\n");
    if (wParam == WM_RBUTTONUP) printf("right mouse up\n");
  }
  return CallNextHookEx(0, nCode, wParam, lParam);
}

HHOOK mousehook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, NULL, 0);
while(true) {
  MSG msg;
  if (PeekMessage(&msg,0,0,0,PM_REMOVE)) {
    printf("msg recvd\n");
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
#ifdef TEST
  Sleep(50);
#endif
}
Run Code Online (Sandbox Code Playgroud)

所以一切都在这里工作,除非我#define TEST放入Sleep,鼠标变得非常迟钝,如果我突然只允许鼠标每秒更新20次,可能会出现这种情况.没有睡眠,我将CPU固定在100%.但是现在这没关系(如果我使用的话就会消失GetMessage).

根据我的理解,低级钩子通过上下文切换到安装它的进程,然后发送进程某种消息让它执行钩子回调.令我困惑的是,为什么我的程序永远不会打印"msg recvd",但只要我点击鼠标右键,就会打印"鼠标右键/向上".这使我得出结论,我MouseHookProcPeekMessage呼叫期间被调用.它恰好是某种特殊的消息,并PeekMessage返回0.但我仍然需要打电话PeekMessage或一些等价物.

由于我的程序需要做很多事情,我显然不能通过PeekMessage …

c++ winapi multithreading

13
推荐指数
2
解决办法
2万
查看次数

在Electron app之外收听键盘事件和鼠标移动

我已经进入了一些Electron项目,我正在试图弄清楚如何在应用程序处于后台时监听任何按键或跟踪鼠标移动.我正在使用菜单栏插件,因此应用程序仍然在后台运行.

我尝试使用全局快捷方式 API,但它看起来只是用于快捷方式而且您无法注册单个按键.我还查看了API,还没有在应用程序主屏幕外找到键击和鼠标移动的事件.

javascript keyboard-events dom-events electron

11
推荐指数
1
解决办法
2545
查看次数

while循环使用了大量的CPU时间

我正在为个人兴趣创建一个击键记录器,并且想要知道如何捕获它们并将它们用作函数(如关键快捷键).

我得到了代码,以了解keylogger和GetAsyncKeyState()如何在这里工作.

我让它在Code :: Blocks下运行,但最奇怪的是当我检查我的任务管理器时,我的CPU使用率上升到100%.当我关闭程序时,它会回落,当我重新打开时,它会回到100%.

我认为这是因为无限循环不断检查输入,但我想知道是否有任何方法可以在不丢失功能的情况下降低CPU使用率.

PS我如何制作关键捷径?例如,按Ctrl+ E键退出程序.

c++ keylogger

2
推荐指数
1
解决办法
3916
查看次数