Как определить, когда форма максимизируется?



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



Спасибо

647   3  

3 ответов:

Вы можете использовать WM_GETMINMAXINFO сообщение для сохранения состояния окна и последующего использования WMSize сообщение, чтобы проверить, развернуто ли окно.

В форме вы объявляете обработчик mesage следующим образом:

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 сообщения, хотя. Как сказал РУз, используйте WM_GETMINMAXINFO, чтобы определить, когда операция максимизации вот-вот начнется, и WM_SIZE, чтобы определить, когда она закончится.

IMO, вы не можете использовать 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;

Comments

    Ничего не найдено.