[Delphi] OnDeactivate nie działa jak należy

0

Witam.
Chce zrobić coś takiego: Mam aplikację która nie ma belki na pasku zadań, okno pokazywane jest po kliknięciu na ikonę w trayu. Jakakolwiek utrata focusu tego okna (kliknięcie w pulpit, w okno innej aplikacji - w cokolwiek) powinna chować tą formę. Niby działa ale nie do końca. Mam Trubo Delphi, myślałem że to wina komponentu TrayIcon ale przy "ręcznym" tworzeniu ikony w trayu jest ten sam problem który wygląda następująco:

  1. Klikam w ikone w trayu, pojawia się forma
  2. Klikam w pulpit. Forma nie znika.
  3. Klikam w coś na formie, potem znowu w pulpit i forma znika

Inna kombinacja:

  1. Klikam w ikone w trayu, pojawia się forma
  2. Klikam w X na formie zamykając ją.
  3. Klikam w ikone w trayu, forma się pojawia
  4. Klikam w pulpit, forma znika.
  5. Klikam w ikone, forma sie pojawia.
  6. Klikam w pulpit, forma nie znika

Kod:

//zamykanie formy
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caNone;
  Self.Hide;
end;

//pokazanie formy - przy kliknięciu na ikonę w trayu
procedure TMainForm.TrayIcon1Click(Sender: TObject);
begin
  Self.Show;
end;

//chowanie formy przy gubieniu focusu
procedure TMainForm.ApplicationEvents1Deactivate(Sender: TObject);
begin
  Self.Close;
end;

Domyślam się że coś nie tak jest z komponentem TApplicationEvents bo jak debuguje to nie wchodzi w ogóle do metody OnDeactivate w tych wymienionych przypadkach. Już próbowałem w OnShow formy dawać SetFocus na jakimś komponencie ale to nie pomaga. Ktoś ma jakiś pomysł? Może jakoś samemu przechwytywać komunikaty które przychodzą do aplikacji i je obsługiwać?

0

Forma też ma chyba to zdarzenie, więc jego użyj

0

Tak, ale to działa tylko przy przełączaniu się między formami mojej aplikacji

0

Już sobie poradziłem, niesamowite, ale znalazłem to przypadkowo na subforum C++ kiedy szukałem coś zupełnie innego :D

Po pokazaniu formy trzeba wywołać:

SetForegroundWindow(Self.Handle);

0

wcale nie niesamowite - wystarczy wiedzieć jak działają okienka. Jakbyś sobie do AEActivate dał np. MessageBox to byś zobaczył, że pokazanie okna to NIE jest aktywowanie aplikacji.

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