有没有像PeekMessage函数不处理消息?

我试图无辜地打电话

PeekMessage(&msg, 0, WM_KEYDOWN, WM_KEYUP, PM_NOREMOVE | PM_NOYIELD); 

而在PeekMessage调用中,Windows Vista 64正在处理消息 。 结果是,我要重新进入我的绘画调用,以及其他各种代码。

在我们的应用程序中,绘画可能需要几秒钟的时间,所以我们添加了PeekMessage调用来查看用户是否击中了一个键,所以我们可以中断这个绘画并启动下一个。 我们没有意识到Windows可以开始处理我们的信息。 将绘画的真实工作放在一个单独的线程中将是一个重大的重构…我们试图查看是否按下了特定的按键,或者如果鼠标滚轮旋转或鼠标button被单击,中断呈现。

我已经尝试添加代码来防止重新进入,然后重新向队列中注入油漆消息等等。这些都非常糟糕,并且有些情况下效果不好。

有一些标志可以添加到PeekMessage调用吗? 在MSDN上的文档中我没有看到任何新东西。 我真的需要一个不处理消息的PeekMessage 。 帮帮我!

Solutions Collecting From Web of "有没有像PeekMessage函数不处理消息?"

也许我错过了显而易见的,但规范是相当详细的 , 它会这样做

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

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

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

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

我认为这是PeekMessage应该做的。 它和GetMessage唯一的区别是GetMessage阻塞,直到消息到达,PeekMessage将返回TRUE或FALSE取决于是否找到匹配过滤器的消息。 它仍然会处理消息,如果他们被发现。

GetQueueStatus是检查是否有可用消息的最快方法。 它只会检查几个标志,并且只有一个参数,与peekmessage的5个参数相比。 如果有可用的消息,它会给出一个快速提示,它不会以任何方式处理消息。

GetQueueStatus和GetInputStatus是相关的功能。

PeekMessage处理消息,因为这是PeekMessage所做的。

也许这是命名不好,但是PeekMessage会从队列中删除消息,如果有任何可用的。

 Just modified the PM_REMOVE flag for the PM_NOREMOVE using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace PROJECT_NAME { class cUtil { //=============================== cUtil() { } //================================ ~cUtil() { } //================================= public struct Message { public IntPtr handle; public uint msg; public IntPtr wParam; public IntPtr lParam; public uint time; public System.Drawing.Point p; } [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern bool PeekMessage(out Message lpMsg, Int32 hwnd, Int32 wMsgFilterMin, Int32 wMsgFilterMax, uint wRemoveMsg); [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern bool TranslateMessage(out Message lpMsg); //(ref Message lpMsg); [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern Int32 DispatchMessage(out Message lpMsg); //(ref Message lpMsg); //private static uint PM_NOREMOVE = 0x0000; private static uint PM_REMOVE = 0x0001; //private static uint PM_NOYIELD = 0x0002; public static void Peek() { Message winMsg; while (PeekMessage(out winMsg, (Int32)0, (Int32)0, (Int32)0, PM_REMOVE)) { TranslateMessage(out winMsg); DispatchMessage(out winMsg); } } } } //================================ //================================ //=============================== using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace PROJECT_NAME { public partial class foNAME : Form { //=================================== public foRAMQ() { InitializeComponent(); } //=================================== private void Job() { int cnt = 0; while( reading_DBMS() ) { cUtil.Peek(); . . . . . cnt++; lable_count.Text = string.Format("Count: {0}", cnt ) } } } }