Как определить, когда форма максимизируется? - PullRequest
8 голосов
/ 14 марта 2012

Я хотел бы определить, когда форма будет развернута, чтобы сохранить определенные настройки (не связанные с размером или положением) и немного изменить размер и положение.Есть ли универсальный способ сделать это?Я пытался поймать сообщение WM_SYSCOMMAND, как в этой статье .Он работает хорошо для максимизации из меню, с помощью кнопки максимизации, но не срабатывает при нажатии клавиши WIN + UP.Кто-нибудь знает универсальный способ, как перехватить событие максимизации, включая случай нажатия клавиши WIN + UP?

Спасибо

Ответы [ 3 ]

11 голосов
/ 14 марта 2012

Вы можете использовать сообщение 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;
7 голосов
/ 14 марта 2012

IMO, Вы не можете использовать WM_GETMINMAXINFO, чтобы "определить, когда операция максимизации собирается начать ", как указано @Remy.

Фактически единственное сообщение, которое может это 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;
7 голосов
/ 14 марта 2012

WIN + UP не генерирует WM_SYSCOMMAND сообщений, поэтому вы не можете их перехватить.Однако он генерирует сообщения WM_GETMINMAXINFO, WM_WINDOWPOSCHANGING, WM_NCCALCSIZE, WM_MOVE, WM_SIZE и WM_WINDOWPOSCHANGED.Как сказал RRUZ, используйте WM_GETMINMAXINFO, чтобы определить, когда начинается операция максимизации, и WM_SIZE, чтобы определить, когда она закончится.

...