Tray, forma na wierzchu

0

Witam, mam program z ikonka w tray'u. Korzystam z popularnego komponentu Psq, TrayIcon. Po kliknieciu na ikonke w tray'u forma ma sie zachowywac tak:

  • gdy jest na wierzchu to niech sie zrobi hide
  • gdy visible = true ale forma znajduje sie pod oknami albo forma jest hide to niech sie zrobi show i wysunie na wierzch

Nie wiem co robie zle, jesli ktos moze to niech rzuci na to okiem:

procedure TForm1.TrayButtonDown(Sender: TObject; Button: TMouseButton;
  Msg: TMessage);
begin                                                          

  if form1.Visible and (Button = mbLeft) and (form1.Handle = GetForeGroundWindow) then
    begin
     form1.hide;
     ZapiszDane;
    end
  else if  (Button = mbLeft)  then
  begin
    form1.Show;
    SetForegroundWindow(form1.Handle); // wysun na wierzch
   end;

end;
0

Popularna.. dzięki.

Jako autor tegoż komponentu odpowiem, iż wydaje mi się, że błąd jest w GetForegroundWindow. Po kliknięciu na ikonę, oknem aktywnym jest pasek zadań z klikniętą ikoną, a nie okno programu.

0

też miałem taki problem aby aplikacja wyskoczyła na wierzch nad inne okienka windosowskie i nikt nie znał odpowiedzi na to :( <ort>więdz </ort>dałem sobie spokój

0

Myślę, że będzie działać, choć nie gwarantuję - robiłem na szybko.

//Funkcja zwraca wartosc logiczna, pokazujaca, czy okno jest na wierzchu (pomijajac pasek zadan).
function WasActiveWindow(Handle:THandle):boolean;
var ForeHandle:THandle;
    TrayHandle:THandle;
begin
result:=FALSE;
TrayHandle:=FindWindow('Shell_TrayWnd', nil);
ForeHandle:=GetTopWindow(0);
while (ForeHandle<>0) do
  begin
  if (GetParent(ForeHandle)=0) and (IsWindowVisible(ForeHandle)) and (ForeHandle<>TrayHandle) then
    begin
    if (Handle=ForeHandle) then
      result:=TRUE;
    exit;
    end;
  ForeHandle:=GetNextWindow(ForeHandle, GW_HWNDNEXT);
  end;
end;

//Obsluga zdazenia nacisniecia ikony w zasobniku systemowym
procedure TForm1.TrayIcon1ButtonDown(Sender: TObject; Button: TMouseButton;
  Msg: TMessage);
begin
if Button<>mbLeft then
  exit;
if (WasActiveWindow(Handle)) then
  Hide()
else
  begin
  Show();
  SetForeGroundWindow(Handle);
  end;
end;
0

Dzieki za kodzik, jak tylko wroce do domu to sprawdze czy dziala, pozdrawiam i jeszcze raz dzieki

funkcyja nie dziala zawsze zwraca false:P

0

No mi działa zawsze prawidłowo, ale jak mówiłem pisałem na szybko - sprawdź pełną listę okien w systemie i ewentualnie ogranicz znajdowane okna jeszcze do takich, które są głównymi aplikacji oraz nie są oknami narzędziowymi.

Sprawdź kod w tej postaci:

//Funkcja zwraca wartosc logiczna, pokazujaca, czy okno jest na wierzchu (pomijajac pasek zadan).
function WasActiveWindow(Handle:THandle):boolean;
var ForeHandle:THandle;
    TrayHandle:THandle;
begin
result:=FALSE;
TrayHandle:=FindWindow('Shell_TrayWnd', nil);
ForeHandle:=GetTopWindow(0);
while (ForeHandle<>0) do
  begin
  if (ForeHandle<>TrayHandle) and (GetParent(ForeHandle)=0) and
     (IsWindowVisible(ForeHandle)) and (IsWindowEnabled(ForeHandle)) and
     (GetWindowLong(ForeHandle, GWL_EXSTYLE)<>WS_EX_TOOLWINDOW) then
    begin
    if (Handle=ForeHandle) then
      result:=TRUE;
    exit;
    end;
  ForeHandle:=GetNextWindow(ForeHandle, GW_HWNDNEXT);
  end;
end;

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