繁体   English   中英

如何将事件添加到Windows消息泵队列中?

[英]How to add an event into the Windows Message Pump queue?

使用VB.NET/C#-.Net Framework 3.5。 我目前在WinForms事件的处理程序中(例如)。 在处理程序中,我想为Windows消息泵放置我自己的事件,但将其放在队列的末尾(假设它将消息FIFO泵入)。 我希望我的处理程序以及当前事件的所有其他处理程序都可以执行,之后再取回插入队列中的自定义事件并调用其处理程序。 关于如何将事件插入Windows事件队列的任何示例代码(不在乎什么语言)?

如果要将消息添加到队列中, PostMessage需要P / Invoke PostMessage函数 如文档所述,此功能:

将消息放置(张贴)在与创建指定窗口的线程相关联的消息队列中,并在不等待线程处理消息的情况下返回消息。

示例P / Invoke声明:

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32", SetLastError = true)]
static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
  • hWnd是窗口的句柄,其窗口过程应接收到该消息的句柄。 在WinForms中,可以使用Handle属性来检索它。

  • msg是您要发布的消息。 当然,您需要弄清楚在这里使用哪个。 如果标准消息之一适合您的目的,那么您可以使用它。 否则,只需定义用户定义的消息即可。 用户定义的消息的值范围> = WM_USER 所以:

     const uint WM_USER = 0x0400; const uint UWM_MYGREATMESSAGE = WM_USER + 1; const uint UWM_MYOTHERMESSAGE = WM_USER + 2; 
  • 显然, wParamlParam包含特定于消息的信息。 如果您使用的是标准消息之一,则他们的文档将告诉您在此处指定什么。 如果您使用的是用户定义的消息,那么您几乎可以在此处传递任何内容,包括不需要任何自定义数据的IntPtr.Zero

我真的很喜欢@CodyGray给出的工程示例。 自从我在Delphi中进行Win32编程以来已经有一段时间了:)。

仍然我无法坚持不懈,不得不分享我对丹尼斯可能需要的想法,因为我认为这可能会更简单一些。

假设您有一段代码。 我们称它为A。 假设它由10条语句组成。 我们称它们为a0a9 所以我们的代码块看起来像这样:

{
    a0;
    a1;
    ...
    a4;
    a5;
    ...
    a8;
    a9;
}

现在说您最终将此代码编写为Windows Forms控件的事件处理程序:

void button1_Click(object sender, EventArgs e) {
    a0;
    a1;
    ...
    a8;
    a9;
}

突然,您意识到您想立即执行a0至a4,并将a5至a9的执行推迟到以后的时间。 后来的意思是尽快但在消息泵变得空闲之后。

您需要做的只是:

void button1_Click(object sender, EventArgs e) {
    a0;
    a1;
    a2;
    a3;
    a4;

    this.BeginInvoke( () => {
        a5;
        a6;
        a7;
        a8;
        a9;
    } );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM