我想要检测何时将最大化表单来保存某些设置(与大小和位置无关)并修改大小和位置。 有一个通用的方法来做到这一点? 我试图捕捉像这篇文章中的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_GETMINMAXINFO
, WM_WINDOWPOSCHANGING
, WM_NCCALCSIZE
, WM_MOVE
, WM_SIZE
和WM_WINDOWPOSCHANGED
消息。 就像RRUZ说的那样,使用WM_GETMINMAXINFO
来检测最大化操作何时开始, WM_SIZE
何时检测完成。
国际海事组织,你不能使用WM_GETMINMAXINFO
“检测什么时候最大化的操作即将开始 ”@Remy说。
事实上唯一的消息可能是WM_SYSCOMMAND
与Msg.CmdType=SC_MAXIMIZE
或未记录的SC_MAXIMIZE2 = $F032
– 但它不是通过Win+UP
发送,或通过使用ShowWindow(Handle, SW_MAXIMIZE)
例如。
我可以检测到一个窗口将被最大化的唯一方法是通过WM_WINDOWPOSCHANGING
WM_GETMINMAXINFO
后WM_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;