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

Mar*_*ner 8 windows delphi winapi event-handling delphi-xe2

我想检测表单何时最大化以保存某些设置(与大小和位置无关)并稍微修改大小和位置.有通用的方法吗?我试图像本文中那样捕获WM_SYSCOMMAND消息.通过最大化按钮,它可以很好地从菜单中最大化,但是当我按下WIN + UP按键时它不会被触发.有没有人知道如何捕捉最大化事件的通用方法,包括WIN + UP击键的情况?

谢谢

RRU*_*RUZ 11

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

在你的窗体中声明mesage处理程序,如下所示:

procedure WMSize(var Msg: TMessage); message WM_SIZE;
Run Code Online (Sandbox Code Playgroud)

和这样处理:

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


Rem*_*eau 7

WIN + UP不会生成WM_SYSCOMMAND消息,这就是为什么你无法捕获它们.它产生WM_GETMINMAXINFO,WM_WINDOWPOSCHANGING,WM_NCCALCSIZE,WM_MOVE,WM_SIZE,和WM_WINDOWPOSCHANGED的消息,虽然.像RRUZ所说,用于WM_GETMINMAXINFO检测何时开始最大化操作并WM_SIZE检测何时完成.


kob*_*bik 7

IMO,正如@Remy所说,你不能用WM_GETMINMAXINFO"检测何时开始最大化操作".

实际上唯一可以WM_SYSCOMMAND带有Msg.CmdType=SC_MAXIMIZE或没有记录的消息SC_MAXIMIZE2 = $F032- 但它不是通过Win+UP或通过使用ShowWindow(Handle, SW_MAXIMIZE)例如发送的.

我能够检测到窗口即将最大化的唯一方法是通过以下WM_WINDOWPOSCHANGING方式触发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;
Run Code Online (Sandbox Code Playgroud)