创建后更改窗口的类?

jdm*_*jdm 3 winapi internals

创建后如何更改 win32 窗口的窗口类?我出于好奇而问这个问题,因为我发现 Stardock 的 Spy++ 中的一款精美的桌面定制工具确实可以做到这一点。

免责声明(遗憾的是现在是必要的):我搜索了文档但找不到任何东西。我知道这可能不是本意要做的,可能会导致很多奇怪的副作用,并且不应该在生产应用程序中完成。不过,我还是想知道他们是如何做到这一点的。

编辑:背景故事,可能很有趣。

我正在尝试 Stardock 的 ModernMix,它允许您在桌面上以窗口模式使用 Metro / Modern / Windows Store 应用程序,我想弄清楚它们是如何做到的。我很快发现现代应用程序只能在常规的全屏 Win32 窗口中运行!您实际上可以更改窗口样式以取消最大化它并给它一个标题栏等。但是,至少有一件事不起作用:您不能在窗口上使用航空捕捉,以及屏幕顶部的热边缘仍然将窗口视为现代应用程序。ModernMix 中不存在这个问题,所以我正在寻找差异。

我不断地在我的应用程序中显示各种调试信息,包括 HWND、窗口样式,并使用 Spy++ 检查了窗口。事实证明,当 ModernMix 取消最大化窗口时,它的类从 Windows.UI.Core.CoreWindow“更改”为 Windows.UI.Core.CoreFramedWindow。然而,我的窗口中显示的 HWND 没有改变!所以我错误地得出结论,ModernMix 通过更改类来摆脱窗口的特殊行为...但事实证明,ModernMix 只是创建了另一个顶层,并以某种方式将原始窗口的内容重定向到新的顶层(至少看起来是这样)喜欢)。

(我仍然把问题留在这里,即使只是作为无法完成的参考。)

Rem*_*eau 5

无法更改现有窗口的类。唯一的选择是销毁原始窗口并使用不同的类创建新窗口。