Windows 有没有像PeekMessage这样的函数不';不处理消息?
我想打电话给你Windows 有没有像PeekMessage这样的函数不';不处理消息?,windows,windows-vista,peekmessage,Windows,Windows Vista,Peekmessage,我想打电话给你 PeekMessage(&msg, 0, WM_KEYDOWN, WM_KEYUP, PM_NOREMOVE | PM_NOYIELD); 而Windows Vista 64在PeekMessage调用中正在处理消息。结果是,我将重新进入我的绘画调用和其他各种代码 在我们的应用程序中,绘制可能需要几秒钟的时间,因此我们添加了peek消息调用以查看用户是否按了键,这样我们就可以中断绘制并启动下一个绘制。我们几乎没有意识到Windows可以开始处理我们身上的消息。这将是一个
PeekMessage(&msg, 0, WM_KEYDOWN, WM_KEYUP, PM_NOREMOVE | PM_NOYIELD);
而Windows Vista 64在PeekMessage调用中正在处理消息。结果是,我将重新进入我的绘画调用和其他各种代码
在我们的应用程序中,绘制可能需要几秒钟的时间,因此我们添加了peek消息调用以查看用户是否按了键,这样我们就可以中断绘制并启动下一个绘制。我们几乎没有意识到Windows可以开始处理我们身上的消息。这将是一个重大的重构,把真正的绘画作品放在一个单独的线程中。。。我们试图查看是否按下了特定的键,或者是否旋转了鼠标滚轮或单击了鼠标按钮来中断渲染
我已经尝试过专门添加代码以防止重入,然后将paint消息重新注入队列中,等等。这一切都非常困难,而且在某些情况下它不能很好地工作
有什么标志我可以添加到PeekMessage调用中吗?我在MSDN的文档中没有看到任何新内容。我真的需要一个不处理消息的
peek消息
。救命啊 也许我忽略了显而易见的东西,但它会这样做:
Peek消息功能发送
传入的已发送的消息,检查
已发布消息的线程消息队列
消息,并检索该消息(如果
任何存在)
在此调用过程中,系统将
挂起的非排队消息,即,
发送到所属windows的邮件
使用SendMessage调用线程,
SendMessageCallback,
SendMessageTimeout,或
SendNotifyMessage函数。然后
与
检索指定的筛选器最新版本
系统还可以处理内部事务
事件。如果未指定过滤器,
消息在中进行处理
顺序如下:
- 发送消息
- 发布消息
- 输入(硬件)消息和系统内部事件
- 已发送消息(再次)
- WM_PAINT消息
- WM_定时器消息
我想这就是PeekMessage应该做的。它与的唯一区别是GetMessage会一直阻塞直到消息到达,其中as peek消息将返回TRUE或FALSE,这取决于是否找到与筛选器匹配的消息。如果找到消息,它仍将处理它们。PeekMessage处理消息,因为PeekMessage就是这样做的
可能它的名称不正确,但是如果有可用的消息,PeekMessage会从队列中删除该消息。GetQueueStatus是检查是否有可用消息的最快方法。它只会检查几个标志,只接受1个参数,而peekmessage只有5个参数。如果有可用的消息,它将给出一个快速提示,它不会以任何方式处理消息
GetQueueStatus和GetInputStatus是相关函数。同意。这不是我写的代码。不幸的是,我不相信有任何函数调用可以满足我的需要-在不处理任何消息的情况下确定是否有按键或鼠标事件在队列中。您可以在WH_KEYBOARD/WH_KEAYBOARD_LL(和鼠标)上安装带有SetWindowsHookx的挂钩,但它需要一些特权,而且更难被编程反对:谢谢@Remus Rusanu!如果你把这个作为我问题的答案,我会接受的
GetAsyncKeyState
可能会让您摆脱困境。
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 )
}
}
}
}