我试图无辜地打电话
PeekMessage(&msg, 0, WM_KEYDOWN, WM_KEYUP, PM_NOREMOVE | PM_NOYIELD);
在PeekMessage调用中,和Windows Vista 64是处理消息。结果是我将重新加入我的绘画调用以及各种其他代码。
绘画在我们的应用程序中可能需要几秒钟,因此我们添加了PeekMessage调用以查看用户是否按下了某个键,因此我们可以中断该绘制并启动下一个绘制。我们几乎没有意识到Windows可以开始处理我们的消息。将绘画的真实作品放在一个单独的线程中是一个重大的重构...我们试图看看是否按下了特定键,或者是否旋转了鼠标滚轮或鼠标按钮来中断渲染。 / p>
我已经尝试专门添加代码以防止重新入侵,然后将绘制消息重新注入队列等等。这些都是非常危险的,并且有些情况下它不能正常工作。
我可以在PeekMessage调用中添加一些标志吗?我在MSDN上的文档中没有看到任何新内容。我真的需要一个不处理消息的PeekMessage
。救命啊!
答案 0 :(得分:5)
也许我错过了显而易见的事情,但是{em>它会{/ 3>} {/ 3>} :
PeekMessage函数调度 传入发送消息,检查 发布的线程消息队列 消息,并检索消息(如果 任何存在的。)
...
在此通话期间,系统会发送 待处理的非排队消息,即 邮件发送到Windows所拥有的 使用SendMessage调用线程, SendMessageCallback, SendMessageTimeout,或 SendNotifyMessage函数。那么 第一个排队的消息匹配 检索指定的过滤器。的的 系统也可以处理内部 事件即可。如果未指定过滤器, 消息在处理中 以下顺序:
- 已发送消息
- 已发布消息
- 输入(硬件)消息和系统内部事件
- 已发送消息(再次)
- WM_PAINT 消息
- WM_TIMER消息
之前检索输入消息 发布消息,使用wMsgFilterMin 和wMsgFilterMax参数。
答案 1 :(得分:2)
我认为这就是PeekMessage应该做的事情。它与GetMessage之间的唯一区别是GetMessage阻塞直到消息到达,而PeekMessage将返回TRUE或FALSE,具体取决于是否找到与筛选器匹配的消息。如果找到这些消息,它仍将处理消息。
答案 2 :(得分:1)
GetQueueStatus是检查是否有可用消息的最快方法。与5个peekmessage参数相比,它只会检查几个标志,只需要1个参数。如果有可用的消息,它会给出快速提示,它不会以任何方式处理消息。
GetQueueStatus和GetInputStatus是相关的函数。
答案 3 :(得分:0)
PeekMessage处理消息,因为PeekMessage就是这样做的。
可能它的命名很糟糕,但是如果有可用的话,PeekMessage会从队列中删除该消息。
答案 4 :(得分:-1)
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 )
}
}
}
}