如何检测一个窗口已经被最大化?

Posted

技术标签:

【中文标题】如何检测一个窗口已经被最大化?【英文标题】:How to detect a window has been maximized? 【发布时间】:2012-11-21 02:01:44 【问题描述】:

有谁知道窗口最大化时发送的 WM_MESSAGE(通过在标题栏中按下最大化按钮,或者通过双击标题栏?)

是否有关于按下最大化按钮的 Windows 消息?

Win32/C++,谢谢。

【问题讨论】:

这个信息非常有用是不寻常的......这是为了什么? (要正确保存窗口的最大化状态以供以后恢复,请使用GetWindowPlacement/SetWindowPlacement 而不是GetWindowRect/SetWindowPos。要删除最大化按钮,请省略CreateWindow 中的WS_MAXIMIZEBOX 标志。限制窗口大小,处理WM_SIZING。等等。)很抱歉试图猜测一个简单的问题,因为我讨厌人们这样做。 我已经从我的程序中禁用了 WM_PAINT 和 WM_ERASEBKGRND,以便能够显示非双缓冲图像而不会闪烁。我需要知道在窗口最大化时发送的窗口消息,因为在我单击最大化按钮后,图像没有出现在我想要的位置(所以我想处理最大化按钮事件以将图像放置在我想要的位置新闻)。 我打赌你忘记了CS_VREDEAW | CS_HREDRAW 样式。 无论我是否将这些样式更改为空,问题仍然存在(我都尝试了)。我不知道为什么在 WM_SIZE(窗口最大化)上调用 WM_MOVE。不过,我猜想窗口在最大化时会移动(有点)。 【参考方案1】:

您会在 wParam 中收到带有 SIZE_MAXIMIZED 值的 WM_SIZE 消息

编辑

下面的@jamesdlin 评论让我注意到WM_WINDOWPOSCHANGED 文档,其中指出(强调我的):

备注 默认情况下,DefWindowProc 函数将 WM_SIZE 和 WM_MOVE 消息发送到窗口。 如果应用程序在未调用 DefWindowProc 的情况下处理 WM_WINDOWPOSCHANGED 消息,则不会发送 WM_SIZE 和 WM_MOVE 消息。在 WM_WINDOWPOSCHANGED 消息期间执行任何移动或大小更改处理而不调用 DefWindowProc 会更有效。

谢谢詹姆斯!

【讨论】:

通常,您是对的,但是,因为我正在处理 WM_MOVE 消息,由于某种原因,当窗口最大化时,发送的是 WM_MOVE 消息而不是 WM_SIZE。我会接受这个答案,因为它实际上是我正在寻找的答案,但我不知道为什么在窗口最大化事件中调用 WM_MOVE。 请注意,如果窗口处理和使用WM_WINDOWPOSCHANGED,则不会发送WM_SIZE @jamesdlin 我更新了问题以包含来自文档的引用。谢谢! @JamesDiaz 希望它能解释你所知道的经验。 :)【参考方案2】:

我最近处理了这个问题,我确定的方法是检查IsZoomed以响应WM_WINDOWPOSCHANGED,将其结果与上一个结果进行比较以检测何时发生转换,然后将WM_WINDOWPOSCHANGED转发到默认窗口过程。

如果您可以完全控制应用程序中的消息处理,并且知道不存在(也永远不会存在)抑制 WM_MOVE/WM_SIZEWM_WINDOWPOSCHANGED 处理程序,那么您应该能够直接在WM_SIZE 处理程序中处理它,如jachguate's answer 中所述。

【讨论】:

以上是关于如何检测一个窗口已经被最大化?的主要内容,如果未能解决你的问题,请参考以下文章

检测浏览器窗口是否最大化并且默认(100%)缩放

js中怎样设置在窗口一打开时就限定窗口大小?

如何在管理模式和最大化窗口中启动.exe?

如何chrome打开新窗口就最大化?

请问窗口最大化最小化的快捷键是啥?

如何给无标题栏窗口加上标题栏(例如给某些无标题栏游戏加上 包括最小化 最大化 关闭按钮)