2012-11-29 134 views
-2

我要做的事很简单,如果移动不移动或点击,我想在1秒后隐藏鼠标光标。我错过了什么WM_MOUSEMOVE?

我搜索了一下,看到有人推荐使用WM_MOUSEMOVE。然而,在我的应用程序中,WM_MOUSEMOVE只是检测鼠标是否在客户区域。如果是,应用程序会不断收到WM_MOUSEMOVE。我读过MSDN页面,但我仍然感到困惑。

+0

我同意Windows消息很混乱。但WM_MOUSEMOVE包含消息发送时的鼠标坐标。因此,每次捕获事件时,将坐标与前一条消息(以全局值存储)的坐标进行比较,如果它们相同且至少1秒,则隐藏光标,但如果它们不同,则鼠标无论你用什么来追踪时间,它都会重置。 – jonhopkins

+0

这就是WM_MOUSEMOVE的含义?为什么我看到人们只是简单地检测WM_MOUSEMOVE会做什么? – LeOpArD

回答

0

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

每次WM_MOUSEMOVE事件触发时,只需重新启动计时器(使用其专用的API)。所以WM_MOUSEMONVE事件可以防止计时器过期。如果WM_MOUSEMOVE停止到达(因为您不再移动鼠标),计时器将在没有中断的情况下进行打勾,直到它消失并触发。

+0

这不是问题所在。我的意思是,如果鼠标位于客户区域,我总是会收到WM_MOUSEMOVE,而不管真正的移动动作如何。 – LeOpArD

+1

如果鼠标没有移动并且窗口层次结构稳定,那么如果您仍然收到一个持续的WM_MOUSEMOVE消息流,很可能是由于[第三方所谓的增强软件](http:// blogs .msdn.com/b/oldnewthing/archive/2009/06/17/9763416.aspx),或者可能是一个错误的鼠标驱动程序。 –

+0

@jonhopkins,我明白了。但是,还有一件事,因为我是新的stackoverflow,我不知道如何设置你的“评论”作为问题的答案。 – LeOpArD

1

使用WM_SETCURSOR。

对于与光标相关的作品使用WM_SETCURSOR。此消息是为此目的而制作的。您提到的客户区域表明您可能还需要使用SetCapture API。

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

+0

如果鼠标不移动,WM_SETCURSOR通常不会被发送,所以它不适用于超时场景。 –

+0

@Mark Ooch,你是对的。我只想写一些关于处理光标的警告,而不考虑setcusor消息。 – 9dan

+0

使用WM_SETCURSOR替换WM_MOUSEMOVE后得到完全相同的不需要的结果。我记得在这里看到一个帖子,说这两条消息通常是成对的。 – LeOpArD