Win32中缺少鼠标移动消息
Missing mouse movement messages in Win32
我正在编写一个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_PAINT
和WM_TIMER
的行为相同。)
如果需要额外的鼠标输入数据,Raymond Chen建议使用GetMouseMovePointsEx
。
附加读数:
- 为什么我会收到虚假的WM_MOUSEMOVE消息
- 油漆信息会以你允许的速度传入
- boost::进程间消息队列引发错误
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 如何通过参数抛出错误消息
- 可以使用移动语义更改或改进此C++代码吗?
- 发送到另一个窗口的鼠标移动消息不执行任何操作
- 移动窗口(),跳过,躲避或绕过消息传递
- Win32中缺少鼠标移动消息