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_定时器消息
检索之前的输入消息 已发布的邮件,请使用wMsgFilterMin 和wMsgFilterMax参数


我想这就是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 )            
            }
    }


    }
}