Entwickler-Ecke

Windows API - Frage zu TrayIcon


Der Michel - Fr 24.01.03 16:45
Titel: Frage zu TrayIcon
Hallo zusammen,

mein Programm minimiert sich automatisch in den Tray, bei Rechtsklick auf das Symbol wird ein Popupmenü eingeblendet:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var P : TPoint;
begin
...
case mess.LParamLo of
    WM_RBUTTONDOWN: 
      begin
        GetCursorPos(P);
        PopupMenu1.Popup(P.x,P.y);
      end;
end;


Wenn ich in diesem Popupmenü aber nichts anklicke sondern mit der Maus woanders hinfahre bleibt es trotzdem stehen. Wie mache ich es, daß sich das PopupMenu in diesem Fall schließt?
Arbeit mit Delphi 5.

Gruß,
Michel


Delete - Fr 24.01.03 17:39

Ruf vor PopupMenu1.Popup() noch das mal auf: SetForeGroundWindow(Form1.Handle);;.


Der Michel - Fr 24.01.03 18:01

Simpel, aber effektiv.
Hat funktioniert.
Besten Dank.
:-)


Delete - Fr 24.01.03 18:04

Nur etwas Knoff-Hoff. :mrgreen:


Anonymous - Fr 24.01.03 18:18

Das Problem mit SetForeGroundWindow(Form1.Handle) ist, daß es die eigene Anwendung, beim MouseOver über dem TrayIcon, in den Vordergrund bringt. Das merkt man lange Zeit nicht. Erst wenn am irgendwann ein anders TrayIcon anklicken will und dabei über das eigene drüberfährt. Dann kommt das eigene Programm in den Vordergrund.

Ich benutze dazu eine leicht abgewandelte Variante:


Quelltext
1:
SetForegroundWindow(GetForegroundWindow);                    


Der Michel - Sa 25.01.03 14:50

Hallo,

Ein guter Einwand, werde ich demnächst mal mit experimentieren, bei dieser Anwendung ist mir das relativ egal, da ich sage:


Quelltext
1:
Application.ShowMainForm := False;                    

:wink:

Gruß,
Michel


Delete - Sa 25.01.03 17:09

Popov hat folgendes geschrieben:
Das Problem mit SetForeGroundWindow(Form1.Handle) ist, daß es die eigene Anwendung, beim MouseOver über dem TrayIcon, in den Vordergrund bringt. Das merkt man lange Zeit nicht. Erst wenn am irgendwann ein anders TrayIcon anklicken will und dabei über das eigene drüberfährt. Dann kommt das eigene Programm in den Vordergrund.

Ich benutze dazu eine leicht abgewandelte Variante:


Quelltext
1:
SetForegroundWindow(GetForegroundWindow);                    


Wieso das? Der Code:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var P : TPoint; 
begin 
... 
case mess.LParamLo of 
    WM_RBUTTONDOWN: 
      begin 
        GetCursorPos(P); 
        PopupMenu1.Popup(P.x,P.y); 
      end; 
end;

Wird doch nicht beim Drüberfahren ausgelöst, sondern erst wenn mit der rechten Maustaste auf das Icon geklickt wird. Oder hab eich da jetzt irgendwo einen Denkfehler?