你需要知道的:WM_WINDOWPOSCHANGED 的隐藏用法

你需要知道的:WM_WINDOWPOSCHANGED 的隐藏用法

作者:BlogUpdater |  时间:2024-05-27 |  浏览:113 |  评论已关闭 条评论

在 WM_SHOWWINDOW 消息的文档中,如果你仔细研究的话,文档里会指出:WM_SHOWWINDOW 消息在某些特殊情况下不会发出。

问题来了,如果您希望在这些特殊情况下,仍然想知道窗口的可见状态,应该怎么做?

可以试试这个:WM_WINDOWPOSCHANGED 消息。

此消息是窗口状态变化流程的的最后一个消息。它结合了其他状态变化通知,例如 WM_MOVE,WM_SIZE 和 WM_SHOWWINDOW 等消息。但它不像 WM_SHOWWINDOW 那样受到同样的限制,因此您可以可靠地使用它来对显示或隐藏的窗口做出反应。

我们来看一个例子代码:

另外,请注意,如果不将 WM_WINDOWPOSCHANGED 消息传递给 DefWindowProc,则您将不会收到 WM_MOVE 或 WM_SIZE 消息,因为 DefWindowProc 将 WM_WINDOWPOSCHANGED 转换为 WM_MOVE 和 WM_SIZE 消息。

问题来了:”如果 WM_WINDOWPOSCHANGED 可以实现 WM_MOVE,WM_SIZE 和 WM_SHOWWINDOW 这些消息的功能,那这些消息不是多余的吗?那么为什么我们还要有其他信息呢?”

答案:直到 Windows 3.1 才引入了 WM_WINDOWPOSCHANGED 消息。在此之前,您别无选择,只能对其他消息做出反应。您现在可以将其他三条消息视为旧消息。他们没有错,但他们现在有点过时了。

我们会在后面的文章中来介绍下它的兄弟:WM_WINDOWPOSCHANGING 消息。

后记:今天这篇文章的的灵感,来自一个实际的客户问题,该问题是这样的:如果程序以 SW_SHOWMAXIMIZED 状态运行,则窗口将不会收到 WM_SHOWWINDOW 消息的情况。不幸的是,我在客户的问题中遗漏了一个细节,即他们需要知道何时显示窗口,因为应用程序初始化和窗口的可见状态高度关联。

应该注意的是,在显示窗口时进行应用程序初始化会显得非常奇怪。如果窗口从未显示怎么办?这是否意味着程序永远不会初始化自身?(例如,有人可能以 SW_HIDE 状态运行您的程序)。

WM_NCCREATE 和 WM_CREATE 是执行窗口初始化的更传统的地方。

总结

所以,你可以管中窥豹:Win32 的底层细节如此之多,值得我们花费人生的大段时间好好研究。
而我一直沉迷于开发 拓扑梅尔智慧办公平台 (Topomel Box) 的一个原因:我可以每天徜徉在 Win32 这个巨大的知识海洋中,每天都可以知道点新东西。
重要的是,这些底层知识可以帮助您更好的理解上层系统,且它们很难过时。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Use WM_WINDOWPOSCHANGED to react to window state changes》

最近我写了个东西

正如你们所知道的,拓扑梅尔智慧办公平台(TopomelBox)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

标签:

评论已关闭。