【发布时间】:2014-03-18 23:58:27
【问题描述】:
win32窗口创建后如何更改窗口类?我是出于好奇而询问的,因为我使用 Spy++ 发现 Stardock 提供的这些精美的桌面定制工具之一正是这样做的。
免责声明(可悲的是现在有必要):我已经搜索了文档,但找不到任何东西。我知道这可能不打算这样做,可能会导致很多奇怪的副作用,并且不应该在生产应用程序中完成。不过,我想知道他们是如何做到的。
编辑:背景故事,可能很有趣。
我在玩 Stardock 的 ModernMix,它允许您在桌面上以窗口模式使用 Metro / Modern / Windows Store 应用程序,我想弄清楚它们是如何做到的。我很快发现现代应用程序只能在常规的全屏 Win32 窗口中运行!您实际上可以更改窗口样式以取消最大化它并给它一个标题栏等。但是,至少有一件事不起作用:您不能在窗口上使用 aero snap 和屏幕顶部的热边缘仍然将窗口视为现代应用程序。 ModernMix 中不存在这个问题,所以我一直在寻找不同之处。
我不断在我的应用程序中显示各种调试信息,包括 HWND、窗口样式,还使用 Spy++ 检查了窗口。事实证明,当 ModernMix 取消最大化窗口时,它的类从 Windows.UI.Core.CoreWindow “更改”为 Windows.UI.Core.CoreFramedWindow。然而,在我的窗口中显示的 HWND 并没有改变!所以我错误地得出结论,ModernMix 通过更改类来摆脱窗口的特殊行为......但事实证明,ModernMix 只是创建了另一个顶层,并以某种方式将原始窗口的内容重定向到新的顶层(至少看起来是这样)喜欢)。
(我仍然将问题留在这里,即使只是作为无法完成的参考。)
【问题讨论】:
-
当然没有官方支持的方法。您可以对窗口进行子类化并更改其
WndProc,但类本身不会更改。 -
我严重怀疑 Spy++ 是否正在改变任何东西。你认为它到底在改变什么?具体一点。
-
@RemyLebeau:不,我认为 工具 (ModernMix) 正在改变窗口类。我用 Spy++ 发现了它。事实证明,ModernMix 正在创建一个 additional 窗口,并且可能会镜像原始窗口的内容。当我在窗口内显示 HWND 时,它并没有改变,但是 Spy++ 中的类改变了。