【问题标题】:Mouse Global Hook - WM_MOUSEMOVE delay鼠标全局挂钩 - WM_MOUSEMOVE 延迟
【发布时间】:2020-09-18 21:27:23
【问题描述】:

好的,这里有很多鼠标全局挂钩的示例。

我的问题是如何为鼠标移动添加计时器/延迟。

这样做的方法是什么?我想也许我应该在检测 WM_MOUSEMOVE 时使用 Thread.Sleep() ?

if (MouseMessages.WM_MOUSEMOVE == (MouseMessages)wParam)
   {
     Thread.Sleep(delay)
   }

谢谢。

【问题讨论】:

  • 您要延迟什么操作?这个钩子怎么用?如果您从XY problem 告诉我们 X,可能会有更好的解决方案。
  • 正如我所说,我想延迟“鼠标移动”。我需要做的就是给它添加一个时间延迟。

标签: c# mouse-hook


【解决方案1】:

恐怕你不能以这种方式减慢鼠标的移动速度。 在这里,您只会收到有关新鼠标位置的通知,系统并不关心您对此通知做了什么,需要多长时间才能完成,或者它是否处于休眠状态。

我想你应该在每个“延迟”时间“记录”鼠标位置,然后每次新的 WM_MOUSEMOVE 事件到达(并且坐标与记录的坐标不同),那么你应该“重置”鼠标光标位置到保存的坐标。

当然,这直到 WM_MOUSEMOVE 在“延迟”时间内到达。否则只需记录一个新位置并等待下一个事件。

.NET 具有 Cursor.Position 属性,它应该允许您将鼠标光标移动到您想要的位置,其他语言应该有类似的,但我从未尝试过,我不确定它在您的“全局”上下文。

不管怎样,弄乱光标位置会让用户非常沮丧

也许您不想完全停止光标“延迟”时间,也许您想用

【讨论】:

  • Cursor.Position 实际上并未将鼠标位置移动到指定坐标。我试过了,我得到的是另一个鼠标图标,它以快速的方式在另一个位置出现和消失。
  • 奇怪,它对我来说移动正确,正如我所说的它可能无法在你的“全局”上下文中工作,你应该尝试使用来自 user32.dll pinvoke.net/default.aspx/user32/SetCursorPos.html 的 SetCursorPos 恐怕在你使用之后Cursor.Position 另一个事件到达并再次移动它,无论如何,您看到两个光标的事实证明光标正在移动,但是太胖以至于它们看起来是两个
  • 您好,抱歉回复晚了,是的,SetCurorPos 也一样,它在全局上下文中无法正常工作。就像鼠标移动事件一样,它将光标位置设置为我放置的位置,然后立即回到您所说的位置,这就是它们看起来是两个的原因。您还有其他建议吗?
  • 我不认为你可以用系统光标做更多的事情。也许您可以隐藏光标并使用您自己的鼠标光标显示全屏覆盖,您可以完全控制它。无论如何都不容易完成的任务。但是……如果我可以问的话,这一切的目的是什么?
猜你喜欢
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 2016-12-14
  • 2015-01-30
  • 2014-08-21
  • 1970-01-01
相关资源
最近更新 更多