如何检测表单何时被最大化?

我想要检测何时将最大化表单来保存某些设置(与大小和位置无关)并修改大小和位置。 有一个通用的方法来做到这一点? 我试图捕捉像这篇文章中的WM_SYSCOMMAND消息。 它可以很好地用于从菜单最大化,通过最大化button,但是当我按下WIN + UP键时,它不会被触发。 有没有人知道如何捕捉最大化事件包括WIN + UP键盘的情况下的普遍方式?

谢谢

您可以使用WM_GETMINMAXINFO消息来保存窗口的状态,然后使用WMSize消息来检查窗口是否被最大化。

在你的窗体中声明这样的消息处理程序:

 procedure WMSize(var Msg: TMessage); message WM_SIZE; 

并像这样处理:

 procedure TForm57.WMSize(var Msg: TMessage); begin if Msg.WParam = SIZE_MAXIMIZED then ShowMessage('Maximized'); end; 

WIN + UP不会生成WM_SYSCOMMAND消息,这就是为什么你无法捕捉它们。 它确实生成了WM_GETMINMAXINFOWM_WINDOWPOSCHANGINGWM_NCCALCSIZEWM_MOVEWM_SIZEWM_WINDOWPOSCHANGED消息。 就像RRUZ说的那样,使用WM_GETMINMAXINFO来检测最大化操作何时开始, WM_SIZE何时检测完成。

国际海事组织,你不能使用WM_GETMINMAXINFO “检测什么时候最大化的操作即将开始 ”@Remy说。

事实上唯一的消息可能是WM_SYSCOMMANDMsg.CmdType=SC_MAXIMIZE或未记录的SC_MAXIMIZE2 = $F032 – 但它不是通过Win+UP发送,或通过使用ShowWindow(Handle, SW_MAXIMIZE)例如。

我可以检测到一个窗口将被最大化的唯一方法是通过WM_WINDOWPOSCHANGING WM_GETMINMAXINFOWM_GETMINMAXINFO

 type TForm1 = class(TForm) private procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING; end; implementation const SWP_STATECHANGED = $8000; procedure TForm1.WMWindowPosChanging(var Message: TWMWindowPosChanging); begin inherited; if (Message.WindowPos^.flags and (SWP_STATECHANGED or SWP_FRAMECHANGED)) <> 0 then begin if (Message.WindowPos^.x < 0) and (Message.WindowPos^.y < 0) then ShowMessage('Window state is about to change to MAXIMIZED'); end; end;