1

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

这是Windows的功能吗?当应用程序是劳动密集型时,鼠标事件是否被丢弃?还是我错过了什么?在这两种情况下,我能做些什么来纠正这种情况?我想避免多线程,部分原因是,据我了解,Win32 要求消息回调位于主线程中,我不确定将 OpenGL 的东西分离到不同的上下文中。

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

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

4

2 回答 2

6

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

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

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

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

于 2013-07-07T14:57:19.577 回答
5

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

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

补充阅读:

于 2013-07-07T18:39:00.713 回答