在NativeWindow中等待消息

本文关键字:消息 等待 NativeWindow | 更新日期: 2023-09-27 17:50:28

我想做的是在我的进程(尽管我无法控制)的窗口上捕获并等待WM_TIMER消息。

我正在尝试使用AutoResetEvent来等待消息。

WaitForMaterialUpdate方法将NativeWindow连接到窗口,并阻塞直到它接收到消息。

这是我使用的代码:

public class MaterialEditorWindow : NativeWindow
{
    private const int WM_TIMER = 0x0113;
    private AutoResetEvent waiter;
    public void WaitForMaterialUpdate(IntPtr handle)
    {
        waiter = new AutoResetEvent(false);
        AssignHandle(handle);
        waiter.WaitOne(5000);
        ReleaseHandle();
    }
    protected override void WndProc(ref Message m)
    {
         if (m.Msg == WM_TIMER) waiter.Set();
         base.WndProc(ref m);
    }
}

我不是在一个非常可调试的环境中,但我已经确认使用MessageBox,窗口实际上在等待期间接收WM_TIMER消息,但WaitOne总是等待完整的5000毫秒超时时间才返回。

你知道我哪里做错了吗?

在NativeWindow中等待消息

WaitOne()为阻塞呼叫。
UI线程在WaitOne()返回之前不会接收任何消息。因为你在UI线程接收到消息时设置了等待句柄,你就有了死锁。

您需要在后台线程中执行此操作,或者在收到消息时简单地调用回调。