C++ 关于WM_MOUSEMOVE,我错过了什么?

C++ 关于WM_MOUSEMOVE,我错过了什么?,c++,windows,winapi,mouse,C++,Windows,Winapi,Mouse,我要做的很简单,如果移动或单击不动,我想在1秒后隐藏鼠标光标 我搜索并看到有人推荐使用WM_MOUSEMOVE。然而,在我的应用程序中,WM_MOUSEMOVE只是检测鼠标是否在客户端区域。如果是,应用程序将持续接收WM_MOUSEMOVE。我已经阅读了MSDN页面,但仍然感到困惑。建议是正确的。您需要做的是定义一个计时器(例如,触发WM_定时器消息的计时器)。 在第一次鼠标移动(WM_MOUSEMOVE)时激活它。如果在为计时器定义的时间间隔内未发生鼠标移动,将触发WM_timer事件,然后您

我要做的很简单,如果移动或单击不动,我想在1秒后隐藏鼠标光标


我搜索并看到有人推荐使用WM_MOUSEMOVE。然而,在我的应用程序中,WM_MOUSEMOVE只是检测鼠标是否在客户端区域。如果是,应用程序将持续接收WM_MOUSEMOVE。我已经阅读了MSDN页面,但仍然感到困惑。

建议是正确的。您需要做的是定义一个计时器(例如,触发WM_定时器消息的计时器)。 在第一次鼠标移动(WM_MOUSEMOVE)时激活它。如果在为计时器定义的时间间隔内未发生鼠标移动,将触发WM_timer事件,然后您可以隐藏鼠标

每次触发WM_MOUSEMOVE事件时,只需重新启动计时器(使用其专用API)。因此WM_MOUSEMONVE事件可防止计时器过期。如果WM_MOUSEMOVE停止到达(因为您不再移动鼠标),计时器将不间断地滴答作响,直到它消失并触发。

使用WM_SETCURSOR

使用WM_SETCURSOR进行与光标相关的工作。此消息就是为此目的而发出的。您提到的客户端区域表明您可能还需要使用
SetCapture
API


另一种方法(或更现代的方法)是使用
TrackMouseEvent
。它提供了。

我同意Windows消息令人困惑。但是WM_MOUSEMOVE包含发送消息时鼠标的坐标。因此,每次捕获事件时,将坐标与上一条消息(存储在全局中)的坐标进行比较,如果它们相同且至少持续了1秒,则隐藏光标,但如果它们不同,则鼠标已移动,因此可以重置用于跟踪时间的任何内容。这就是WM_MOUSEMOVE的含义?为什么我看到人们说简单地检测WM_MOUSEMOVE就可以了?这不是问题所在。我的意思是,如果鼠标在客户端区域,我总是会收到WM_MOUSEMOVE,而不管它的实际移动。如果鼠标不移动,窗口层次结构稳定,那么如果你仍然收到源源不断的
WM_MOUSEMOVE
消息,这很可能是由于鼠标驱动程序有问题造成的。@jonhopkins,我明白了。但还有一件事,因为我是stackoverflow新手,我不知道如何将您的“注释”设置为问题的答案。@LeOpArD comments不能被选为答案。我重新阅读了我发布的MSDN中的文本,意识到其措辞并不意味着WM_MOUSEMOVE将像我最初认为的那样不断发送。为什么它会在你的应用程序中这样做,我不知道。但是,如果你在鼠标未移动的情况下仍收到消息,那么检查坐标并结合CodeChord的答案似乎是最好的选择。@Adam Rosenfield,这似乎比我想象的要复杂。但是我的电影播放器和PowerPoint幻灯片在隐藏光标方面效果很好。如果鼠标不移动,WM_SETCURSOR通常不会被发送,因此它不适合超时情况。@Mark Ooch,你说得对。我只想写一些关于在不考虑setcusor消息的情况下处理游标的警告。在用WM_SETCURSOR替换WM_MOUSEMOVE后得到完全相同的不希望得到的结果。我记得在这里看到一篇帖子,上面说这两条信息通常是成对的。