Jak wywołać zdarzenie po naciśnięciu klawisza minimalize lub maximalize? Tak żebym wiedział jaki klawisz został wciśnięty.
Nie wiem czy w delphi sie tak da, ale szukalbym czegos w applicationEvens.OnMnimized (strzelam, ze cos takiego jest - nawet jesli jest, to zadziala tylko przy minimalizacji glownego forma). Jako workaround mozesz wywalic domyslne przyciski do resiza i dodac i oprogramwoac swoje - wtedy bedzie to działać na kazdej formie
edit: specem od delphi jest tu na pewno @furious programming ;p
type
TForm1 = class(TForm)
mmo1: TMemo;
private
{ Private declarations }
public
procedure WMSysCommand(var msg: TWMSysCommand); message WM_SYSCOMMAND;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.WMSysCommand(var msg: TWMSysCommand);
begin
case msg.CmdType of
SC_MINIMIZE: mmo1.Lines.Add('Minimize');
SC_MAXIMIZE: mmo1.Lines.Add('Maximize');
end;
inherited;
end;
Z maksymalizacją okna jest łatwo, dlatego że wystarczy nadpisać sobie metodę WMSize
i sprawdzić wParam
rekordu komunikatu; Ewentualnie nadpisać WndProc
i tam nasłuchiwać za komunikatem WM_SIZE; Przykład dla pierwszego:
protected
procedure WMSize(var AMessage: TMessage); message WM_SIZE;
{...}
procedure TMainForm.WMSize(var AMessage: TMessage);
begin
case AMessage.WParam of
SIZE_MAXIMIZED: ; // zmaksymalizowano okno
SIZE_RESTORED: ; // przywrócono rozmiar okna
end;
inherited;
end;
Natomiast z minizalizacją już to nie przejdzie i trzeba pokombinować inaczej; Można dodać metodę WMWindowPosChanging
i tam pobawić się z flagami:
protected
procedure WMWindowPosChanging(var AMessage: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
{...}
procedure TMainForm.WMWindowPosChanging(var AMessage: TWMWindowPosChanging);
const
HIDE_1 = (SWP_NOCOPYBITS or SWP_SHOWWINDOW or SWP_FRAMECHANGED or SWP_NOACTIVATE);
HIDE_2 = ((SWP_HIDEWINDOW or SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOMOVE or SWP_NOSIZE));
begin
if ((AMessage.WindowPos^.flags and HIDE_1) = HIDE_1) or
((AMessage.WindowPos^.flags and HIDE_2) = HIDE_2) then
begin
// zminimalizowano okno
end;
inherited;
end;
Dyskusja na ten temat znajduje się tutaj (wraz z przykładem) i z niej czerpałem inspirację co do drugiego przykładu.
skompilowany program.
BTW przydała by się możliwość dodawania załączników do komenta :p
Zrobiłem jak napisał abrakadaber i działa. Dziękuje wszystkim za pomoc.