如何在WPF/C#中检测鼠标是否在窗口范围内外移动?

4
我有一个小型视频应用程序,希望能够实现类似VLC的功能。也就是说,在鼠标移动或不移动时,让某个元素消失和出现。我大致了解如何做到这一点,但我不知道如何检测鼠标是否正在移动。我考虑使用GetPosition函数,但那只会给我鼠标的位置,而不能告诉我光标是否在移动。我想使用定时器,在鼠标停止移动后倒计时2-3秒,然后淡出控件或仅使其折叠而无需进一步操作。我无法每毫秒检查位置变量的值。还有其他方法吗?
2个回答

3
您可以使用钩子功能,这样当鼠标移动时会有通知。我曾经使用过这个免费开源库:this
使用方法如下:
using Gma.UserActivityMonitor.GlobalEventProvider;

GlobalEventProvider _globalEventProvider1 
                                 = new Gma.UserActivityMonitor.GlobalEventProvider();

this.globalEventProvider1.MouseMove += HookMouseMove;//to listen to mouse move

谢谢提供链接和库。我会尝试一下并告诉你,但除非万不得已,否则我不想使用hooking。 - lorddarq
我将使用这个开源库。它似乎是最好的选择。 - lorddarq
值得的。但是需要注意的是,如果你只想钩住你的应用程序而不是整个系统,那么你应该将使用 WH_MOUSE_LL 的那一行改为 WH_MOUSE,将使用 WH_KEYBOARD_LL 的那一行改为 WH_KEYBOARD。我记得这只是库中的几行代码。 - Jalal Said

0

捕获鼠标。如果用户在其他地方实际点击,则释放捕获。然后,您可以使用标准的WPF鼠标移动事件。

myElement.MouseMove += (my MouseMove handler)
Mouse.Capture(myElement);

我认为捕获鼠标并不是必要的,即使你的鼠标在其他元素上,如MediaElement等,PreviewMouseMove仍然会到达Window。或者还有其他情况我没有考虑到吗? - Fredrik Hedblad
如果您完全没有使用该应用程序,则不会发生这种情况。我使用捕获,因为例如用户将选择拖出应用程序。 - Ed Bayiates
啊,好的,你说得对。在这种情况下,我认为你也可以使用WindowMouseEnter/MouseLeave事件。 - Fredrik Hedblad
你可以这样做,但是如果没有捕获,你实际上无法跟踪鼠标在窗口外的移动,而这在某些情况下非常重要。 - Ed Bayiates
是的,没错。如果这是一个要求,那么确实需要鼠标捕获。 - Fredrik Hedblad
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接