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