跟踪鼠标输入事件

时间:2017-06-06 17:25:28

标签: c++ winapi sendinput

目前使用SendInput(MOUSEEVENTF_MOVE)来模拟鼠标移动。 SendInput在处理之前将新的鼠标事件添加到线程输入队列。

是否可以跟踪/检查特定事件是否已实际处理过?

WM_MOUSEMOVE中的跟踪WndProc无法选择,因为用户可以同时发出非模拟鼠标移动。

1 个答案:

答案 0 :(得分:0)

  

是否可以跟踪/检查特定事件是否已实际处理过?

一般来说:不。

  

SendInput在处理之前向线程输入队列添加一个新的鼠标事件。

嗯,不。 SendInput将输入事件放入硬件输入队列,在那里它们被原始输入线程拾取,并被分派到相应的线程中。输入队列。

  

WM_MOUSEMOVE中的跟踪WndProc无法选择,因为用户可以同时发出非模拟鼠标移动。

正确。但是,您可以安装low-level mouse hook,您可以在其中识别注入的输入 1 。注入的输入在MSLLHOOKSTRUCT结构的标记成员中设置了LLMHF_INJECTEDLLMHF_LOWER_IL_INJECTED个标记之一。

一个简单的解决方案,允许您在应用程序的窗口过程的鼠标消息处理程序中识别注入的输入,是通过MOUSEINPUT传递特定的 dwExtraInfo 值结构体。可以通过调用GetMessageExtraInfo在消息处理程序中查询此值。但是,这是不可靠的,因为系统也使用这些值。应用程序无法使用任何值,但保证不会与系统使用的值发生冲突。

<小时/> 1 在输入事件从硬件输入队列中出列后,低级别鼠标挂钩运行。事件尚未由应用程序处理,甚至未被放入相应的线程中。此时输入队列。