Win32中缺少鼠标移动消息

Missing mouse movement messages in Win32

本文关键字:移动 消息 鼠标 Win32      更新时间:2023-10-16

我正在编写一个Win32 OpenGL应用程序,用于处理所有鼠标移动至关重要的绘图。碰巧的是,有时我的程序中的绘制操作无法实时执行——这对我来说很好,只要所有鼠标事件都在队列中,以后可以处理。现在,我本以为这只是调用PeekMessage以确保处理所有事件的问题,但当我这样做时,很明显,我的应用程序接收到的鼠标移动与Windows显示的鼠标移动的保真度不同。

这是Windows的一个功能吗?当应用程序是劳动密集型时,鼠标事件是否被丢弃?还是我错过了什么?无论哪种情况,我该怎么做才能补救这种情况?我想避免多线程,部分原因是,据我所知,Win32要求消息回调在主线程中,我不确定是否将OpenGL内容分离到不同的上下文中。

至于代码示例,我主要使用下面链接中的模板代码。我正在检查的消息是WM_MOUSEMOVE

http://nehe.gamedev.net/tutorial/creating_an_opengl_window_(win32)/13001/

这是Windows的一个功能吗?当应用程序是劳动密集型时,鼠标事件是否被丢弃?

是的,这是一个功能。WM_MOUSEMOVE消息不会被丢弃,它们是合成的。换句话说,它们实际上并没有发布到消息队列中。这在实践中效果不太好,用户可能会在一秒钟内生成大量鼠标移动,并在程序繁忙时快速填充消息队列。

自上次调用GetMessage()以来,当鼠标被移动时,您会得到一条WM_MOUSEMOVE消息。你得到了最后一个已知的位置。因此,获取它们的速率以及它们之间的像素数直接取决于调用GetMessage()的频率。

另一种选择是使用原始输入。

WM_MOUSEMOVE的特殊之处在于它没有排队;当消息队列为空时,它会根据需要自动生成。(WM_PAINTWM_TIMER的行为相同。)

如果需要额外的鼠标输入数据,Raymond Chen建议使用GetMouseMovePointsEx

附加读数:

  • 为什么我会收到虚假的WM_MOUSEMOVE消息
  • 油漆信息会以你允许的速度传入