Przechwycenie naciśnięcia klawisza resize

0

Jak wywołać zdarzenie po naciśnięciu klawisza minimalize lub maximalize? Tak żebym wiedział jaki klawisz został wciśnięty.

0

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

3
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;
1

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.

0

skompilowany program.
BTW przydała by się możliwość dodawania załączników do komenta :p

0

Zrobiłem jak napisał abrakadaber i działa. Dziękuje wszystkim za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1