创建后更改窗口的类?

时间:2014-02-18 22:50:49

标签: winapi internals

如何在创建后更改win32窗口的窗口类?我是出于好奇而问,因为我发现Spy ++中有一个来自Stardock的精美桌面定制工具就是这样做的。

免责声明(现在很遗憾):我搜索了文档但找不到任何内容。我知道这可能不是为了做,可能会导致很多奇怪的副作用,而且不应该在生产应用程序中完成。不过,我想知道他们是如何把它拉下来的。

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

我正在玩Stardock的ModernMix,它允许您在桌面模式下使用桌面上的Metro / Modern / Windows Store应用程序,我想知道他们是如何做到的。我很快发现Modern应用程序只能在常规的全屏Win32窗口中运行!您实际上可以更改窗口样式以使其最大化并为其指定标题栏等。但是,至少有一件事不起作用:您不能在窗口上使用aero snap,而在屏幕顶部使用热边缘仍将窗口视为现代应用程序。这个问题在ModernMix中不存在,所以我一直在寻找差异。

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

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

1 个答案:

答案 0 :(得分:3)

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