是否有像PeekMessage这样的函数不处理消息?

Mat*_*ank 3 windows peekmessage windows-vista

我试图无辜地打电话

PeekMessage(&msg, 0, WM_KEYDOWN, WM_KEYUP, PM_NOREMOVE | PM_NOYIELD);
Run Code Online (Sandbox Code Playgroud)

PeekMessage调用中的Windows Vista 64正在处理消息.结果是我将重新加入我的绘画调用以及各种其他代码.

绘画在我们的应用程序中可能需要几秒钟,因此我们添加了PeekMessage调用以查看用户是否按下了一个键,因此我们可以中断该绘画并启动下一个绘画.我们几乎没有意识到Windows可以开始处理我们的消息.将绘画的真实作品放在一个单独的线程中是一个重大的重构...我们试图看看是否按下了特定键,或者是否旋转了鼠标滚轮或鼠标按钮来中断渲染.

我已经尝试专门添加代码以防止重新入侵,然后将绘制消息重新注入队列等等.这些都是非常困难的,并且有些情况下它不能正常工作.

是否有一些我可以添加到PeekMessage调用的标志?我在MSDN上的文档中没有看到任何新内容.我真的需要一个PeekMessage不处理消息的东西.救命!

Rem*_*anu 5

也许我错过了显而易见的事情,但规范是非常冗长的,它会这样做:

PeekMessage函数调度传入的已发送消息,检查线程消息队列中是否有已发布的消息,并检索消息(如果存在).

...

在此调用期间,系统会使用SendMessage,SendMessageCallback,SendMessageTimeout或SendNotifyMessage函数传递挂起的非排队消息,即发送到调用线程拥有的窗口的消息.然后检索与指定过滤器匹配的第一个排队消息.系统还可以处理内部事件.如果未指定过滤器,则按以下顺序处理消息:

  • 发送信息
  • 发布消息
  • 输入(硬件)消息和系统内部事件
  • 已发送消息(再次)
  • WM_PAINT消息
  • WM_TIMER消息

要在发布消息之前检索输入消息,请使用wMsgFilterMin和wMsgFilterMax参数.