【问题标题】:Distinguish between user generated and my own application generated mouse moves区分用户生成和我自己的应用程序生成的鼠标移动
【发布时间】:2014-01-14 09:29:07
【问题描述】:

我的 WinForms 应用程序只需通过在某种带有计时器的循环中设置 Cursor.Position 属性来移动鼠标光标。

我希望这种移动一直持续到用户自己不使用鼠标移动它为止。一旦他或她这样做,我希望我的代码停止。

因此,我需要一种方法来区分用户生成的鼠标移动发送的鼠标移动与我的应用程序生成的鼠标移动。

【问题讨论】:

  • 我不太喜欢它,但是......一个简单的标志呢?布尔 _mouseMovedByApplication。当 MouseMove 事件处理程序将被调用并且 _mouseMovedByApplication 为 false 时,它​​必须停止计时器。
  • @Adriano 这需要比单个布尔值更复杂,因为 WM_MOUSEMOVE 事件是异步的(已发布)。
  • @manuell tr​​ue,Queue 可能效果更好,但如果更简单的解决方案有效,我不会从(稍微)更复杂的解决方案开始。确保他应该分离事件处理程序,更改位置,清空消息队列,再次附加处理程序。可能太多了。

标签: c# winforms winapi windows-messages message-loop


【解决方案1】:

适用于 Windows 8 及更高版本的简单解决方案:使用 GetCurrentInputMessageSource 函数。

如果originId 是IMO_INJECTED,则模拟输入。否则,它通常等于IMO_HARDWARE。

【讨论】:

  • 这不会也检测到其他以编程方式移动鼠标的应用程序被注入吗?这可能是需要的,但我希望 OP 希望区分它们生成的动作和任何其他动作。
  • 是的,这也会检测到其他应用程序,除非它们具有 UIAccess 属性,如文档中的 here 所述。
【解决方案2】:

如果您使用 Win32 SendInput API 定位鼠标光标,您可以在MOUSEINPUT 结构中设置自定义dwExtraInfo 值。

在处理异步(发布)消息时,您可以使用 Win32 API GetMessageExtraInfo 来检索自定义值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多