我想要做的是捕捉并等待我的进程中的窗口上的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毫秒的超时时间。
知道我哪里出错了?
答案 0 :(得分:1)
WaitOne()
是阻止通话
在WaitOne()
返回之前,UI线程不会收到任何消息。由于在UI线程收到消息时设置了等待句柄,因此会出现死锁。
您需要在后台线程上执行此操作,或者只是在收到消息时调用回调。