我正在编写一个用于绘画的Win32 OpenGL应用程序,其中处理所有鼠标移动至关重要。碰巧的是,有时我程序中的绘制操作无法实时执行 - 这对我来说很好,只要所有鼠标事件都排队并且可以稍后处理。现在我认为这只是调用PeekMessage
确保处理所有事件的问题,但是当我这样做时,很明显我的应用程序收到的鼠标移动与它的保真度不同。那些由Windows显示。
这是Windows的功能吗?当应用程序是劳动密集型时,是否会丢弃鼠标事件或者我错过了什么?在任何一种情况下,我该怎么做才能解决这种情况?我想避免多线程,部分原因是,据我所知,Win32要求消息回调在主线程中,我不确定将OpenGL内容分离到不同的上下文。
至于代码示例,我实际上是在下面的链接中使用模板代码。我要检查的邮件是WM_MOUSEMOVE
。
http://nehe.gamedev.net/tutorial/creating_an_opengl_window_(win32)/13001/
答案 0 :(得分:6)
这是Windows的功能吗?当应用程序是劳动密集型时,是否会丢弃鼠标事件?
是的,这是一个功能。 WM_MOUSEMOVE消息不会被删除,它们是合成的。换句话说,它们实际上并未发布到消息队列中。这在实践中不会很好用,用户可以在一秒钟内生成大量鼠标移动,并在程序繁忙时快速填充消息队列中的容量。
自上次调用GetMessage()以来移动鼠标时,会收到WM_MOUSEMOVE消息。你得到了最后的已知位置。因此,获取它们的速率以及它们之间的像素数直接取决于您调用GetMessage()的频率。
另一种方法是使用raw input。
答案 1 :(得分:5)
WM_MOUSEMOVE
的特殊之处在于它没有排队;当消息队列为空时,它会根据需要自动生成。 (WM_PAINT
和WM_TIMER
的行为方式相同。)
Raymond Chen suggests using GetMouseMovePointsEx
如果您需要额外的鼠标输入数据。
补充阅读: