没有 wndproc 的窗口

Posted

技术标签:

【中文标题】没有 wndproc 的窗口【英文标题】:window without wndproc 【发布时间】:2011-02-10 20:38:30 【问题描述】:

我很好奇可以不使用 WndProc 来创建窗口。

所以我想注册窗口类,并将 lpfnWndProc 字段设置为 NULL; 并以我自己的方式使用 msg(由 TranslateMessage(&msg) 给出)。

这样做有什么缺点吗?

在此先感谢,并为我的语法感到抱歉。

编辑#1: 好的,我有一个窗口,但我在某个地方错了。

 MSG msg;
    while(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE)) 
        if (msg.message == WM_QUIT) return false;
        else 
                TranslateMessage(&msg);
                switch (msg.message) 
                case WM_CREATE:
                    createContext();
                    break;
                default:
                    DispatchMessage(&msg);
                    break;
                
        
     
    return true;

createContext 没有被调用。 为什么?我哪里错了? 是的,也许 WM_CREATE 消息要发送到 WndProc(现在是 DefWindowProc),但是有什么方法可以从 WndProc 外部获取它?

【问题讨论】:

对于窗户来说,这是一种非常不寻常的事情。你为什么要这样做?可能有更合适的不同方法。 【参考方案1】:

AFAIK,您不能将其设置为 NULL。但是,您会注意到DefWindowProc 的签名与WindowProc 回调的签名相匹配。如果你想要一个合理的默认值,只需给它DefWindowProc

【讨论】:

谢谢,我会选择这个解决方案。【参考方案2】:

抱歉,这没有任何意义。如果没有 wndproc,你怎么能得到消息?

没有窗口进程的窗口不是窗口!

【讨论】:

【参考方案3】:

不,你会破坏 SendMessage()。只有 PostMessage() 可以工作。需要支持 SendMessage。

【讨论】:

以上是关于没有 wndproc 的窗口的主要内容,如果未能解决你的问题,请参考以下文章

子窗口没有收到 WM_DESTROY?

在 wndproc 和 MSG 中处理窗口消息,有啥区别?

单个 wndproc 如何让每个窗口知道它的序列号?

WndProc 消息 = 49619 - 它是啥?

WndProc和hook区别

DefWndProc/WndProc/IMessageFilter的区别