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

时间:2012-03-14 14:38:57

标签: windows delphi winapi event-handling delphi-xe2

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

由于

3 个答案:

答案 0 :(得分:11)

您可以使用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;

答案 1 :(得分:7)

WIN + UP不会生成WM_SYSCOMMAND消息,这就是您无法捕获它们的原因。但它会生成WM_GETMINMAXINFOWM_WINDOWPOSCHANGINGWM_NCCALCSIZEWM_MOVEWM_SIZEWM_WINDOWPOSCHANGED消息。与RRUZ说的一样,使用WM_GETMINMAXINFO来检测最大化操作何时开始,WM_SIZE来检测何时完成。

答案 2 :(得分:7)

IMO,你不能使用WM_GETMINMAXINFO来“检测最大化操作 即将开始 ”,正如@Remy所述。

事实上唯一可能是WM_SYSCOMMAND Msg.CmdType=SC_MAXIMIZE或未记录SC_MAXIMIZE2 = $F032的邮件 - 但不会通过Win+UP或使用{{1}发送例如。

我能够检测到窗口即将最大化的唯一方法是通过ShowWindow(Handle, SW_MAXIMIZE)之后立即触发的WM_WINDOWPOSCHANGING

WM_GETMINMAXINFO