【问题标题】:GetLastInputInfo does not correctly work?GetLastInputInfo 不能正常工作?
【发布时间】:2014-10-13 00:54:48
【问题描述】:

我使用 GetLastInputInfo 来检查鼠标和键盘的最后输入信息。 在我的 PC 上的系统上工作正常,但是当我在笔记本电脑上运行我的程序时它不工作。 我看到 LASTINPUTINFO 每 10-15 秒更改一次。

现在,我正在编写示例程序,用于检查来自鼠标和键盘的所有输入,并保存此设备的上次输入时间,但如果我空闲,这次不会改变。

如何检查谁在生成 Activity(设备/程序)并更改结构 LASTINPUTINFO?

【问题讨论】:

  • 为什么你期望它在“空闲”时改变?只有当确实有键盘/鼠标消息时,它才能更新,并且只有当它们被发送到 your 窗口时。

标签: c++ windows winapi


【解决方案1】:

您可以使用Raw Input 查看活动是否来自实际的鼠标/键盘本身。如果是这样,您可能有一个错误的设备驱动程序,或者一个正在运行某种内部计时器以生成稳定的输入事件流的驱动程序。

如果GetLastInputInfo() 更新时未报告原始活动,则运行的应用程序很可能使用mouse_event()keybd_event()SendInput() 等输入注入API。您必须直接挂钩它们才能找出调用它们的应用程序。

【讨论】:

  • 我用这个Example 来检测鼠标/键盘输入。我可以看到这个应用程序使用钩子(WH_KEYBOARD_LL / WH_MOUSE_LL)并且这个应用程序运行良好(但不是GetLastInputInfo)。如何找到调用 SendInput() 的应用程序?很抱歉,但我不明白如何找到带有调用此函数(SendInput 等)的钩子的应用程序。
  • 使用 SetWindowsHookEx() 与使用原始输入 API 不同。原始输入直接从设备本身为您提供通知,而SetWindowsHookEx() 为您提供来自应用程序消息队列正在处理的输入消息的通知(包括注入的输入)。不仅如此,SetWindowsHookEx() 还要求您编写单独的 32 位/64 位 DLL 以挂钩其他进程,而原始输入 API 则不需要。
  • 至于挂钩SendInput(),您必须将自己的代码注入到每个正在运行的进程中,并让该代码修补每个进程的PE Imports 表以重定向SendInput()(和GetProcAddress(),当SendInput() 是动态加载而不是静态加载)到您自己的实现中,该实现在调用时将信息发送回您的主应用程序。 API 挂钩是一种高级技术。
猜你喜欢
  • 2013-03-30
  • 2010-11-30
  • 2021-10-02
  • 2017-08-06
  • 2013-11-22
  • 1970-01-01
  • 2013-09-10
  • 2017-04-05
  • 2013-07-25
相关资源
最近更新 更多