首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待NativeWindow中的消息

等待NativeWindow中的消息
EN

Stack Overflow用户
提问于 2013-01-01 00:35:39
回答 1查看 860关注 0票数 1

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

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

WaitForMaterialUpdate方法将NativeWindow连接到窗口,并在收到消息之前一直阻塞。

这是我使用的代码:

代码语言:javascript
复制
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毫秒超时周期。

你知道我哪里错了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-01 00:49:28

WaitOne()是一个阻塞调用。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14103929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档