等待NativeWindow中的消息

时间:2012-12-31 16:35:39

标签: c# messaging wndproc autoresetevent nativewindow

我想要做的是捕捉并等待我的进程中的窗口上的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毫秒的超时时间。

知道我哪里出错了?

1 个答案:

答案 0 :(得分:1)

WaitOne()是阻止通话 在WaitOne()返回之前,UI线程不会收到任何消息。由于在UI线程收到消息时设置了等待句柄,因此会出现死锁。

您需要在后台线程上执行此操作,或者只是在收到消息时调用回调。