winapi - 创建后更改窗口的类?

标签 winapi internals

如何在创建后更改 win32 窗口的窗口类?我问是出于好奇,因为我发现 Spy++ 来自 Stardock 的这些奇特的桌面定制工具之一正是这样做的。

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

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

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

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

(我还是把问题留在这里,哪怕只是作为一个做不到的引用。)

最佳答案

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

关于winapi - 创建后更改窗口的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21867196/

相关文章:

java - 按需初始化持有者习语 - 何时加载类?

php - 类型无知是如何在 PHP 内部实现的

c++ - 如何刷新图形避免黑屏?

c++ - 当用于 Windproc 内部的参数时,HWND 地址会发生变化

c++ - SignalObjectAndWait 考虑有 SetEvent 和 WaitForSingleObject 的目的是什么?

c++ - 线程参数现状

debugging - 调试器如何工作?

python - 为什么我不能在 Python 中使用 '+' 运算符将元组添加到列表中?

PHP 内部数组

winapi - 通过 Windows 的 API(用户模式)检索 PCI 坐标