1

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

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

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 毫秒超时时间。

知道我哪里出错了吗?

4

1 回答 1

1

WaitOne()是阻塞调用。UI 线程在返回
之前不会收到任何消息。WaitOne()由于您在 UI 线程收到消息时设置了等待句柄,因此您遇到了死锁。

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

于 2012-12-31T16:49:27.917 回答