在Win32中丢失鼠标移动消息

Joh*_*nas 1 c++ opengl mouse winapi

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

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

至于代码示例,我实际上是在下面的链接中使用模板代码.我正在检查的消息是WM_MOUSEMOVE.

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

Han*_*ant 6

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

是的,这是一个功能.不删除WM_MOUSEMOVE消息,它们是合成的.换句话说,它们实际上并未发布到消息队列中.这在实践中不会很好地工作,用户可以在一秒钟内生成大量鼠标移动,并在程序繁忙时快速填充消息队列.

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

另一种方法是使用原始输入.


jam*_*lin 5

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

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

补充阅读: