在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毫秒超时时间才返回。
你知道我哪里做错了吗?
WaitOne()
为阻塞呼叫。
UI线程在WaitOne()
返回之前不会接收任何消息。因为你在UI线程接收到消息时设置了等待句柄,你就有了死锁。
您需要在后台线程中执行此操作,或者在收到消息时简单地调用回调。