如何检测一个窗口已经被最大化?
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_SIZE
的 WM_WINDOWPOSCHANGED
处理程序,那么您应该能够直接在WM_SIZE
处理程序中处理它,如jachguate's answer 中所述。
【讨论】:
以上是关于如何检测一个窗口已经被最大化?的主要内容,如果未能解决你的问题,请参考以下文章