Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Programmicon verschwendet bei Mouseover aus der TNA (https://www.delphipraxis.net/112267-programmicon-verschwendet-bei-mouseover-aus-der-tna.html)

Svenkan 17. Apr 2008 22:06


Programmicon verschwendet bei Mouseover aus der TNA
 
Hallo!
Ich lasse bei meinem Programm, wenn es minimiert wird, dass Icon in die TNA packen. Ein Anwender hat nun das Problem, dass das Icon bei einem Mouseover verschwindet und er kann nicht mehr auf das Programm zugreifen. Ich habe damals mal einen Code dafür gefunden.

Delphi-Quellcode:
uses CoolTrayIcon
Delphi-Quellcode:
const
  WM_TASKBAREVENT = WM_USER + 1;
Delphi-Quellcode:
   procedure WndProc(var Msg: TMessage); override;
   procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
Delphi-Quellcode:
////////////////////////////////////////////////////////////////////////////////
// auf Mausklicks reagieren, Fensterprozedur erweitern

procedure THauptform.WndProc(var Msg: TMessage);
var
  Point: TPoint;
begin
  // WM_USER + 20 ist unsere TNA Icon Nachricht
  if Msg.Msg = WM_USER + 20 then
  begin
    // im lParam steht die Nachricht
    case Msg.lParam of
      // rechte Taste für Menü
      WM_RBUTTONDOWN:
        begin
          SetForegroundWindow(Handle);
          GetCursorPos(Point);
          PopUpMenu1.PopUp(Point.X, Point.Y);
        end;
      // linke Taste
      WM_LBUTTONDOWN:
        begin
          //ShowMessage('links runter');
        end;
      // Doppelklick
      WM_LBUTTONDBLCLK:
        begin
          // Fenster anzeigen
          Hauptform.Show;
          // Icon entfernen
          Shell_NotifyIcon(NIM_DELETE, @IconData);
        end;
    end;
  end
  // Taskbar wurde im System registriert, Icon einfügen
  else if Msg.Msg = TaskBarNewReg then
  begin
    Shell_NotifyIcon(NIM_ADD, @IconData);
  end;
  inherited;
end;

////////////////////////////////////////////////////////////////////////////////
// beim Minimieren Form verstecken und Icon in die TNA

procedure THauptform.WMSysCommand(var Message: TWMSysCommand);
begin
  // Fenster wurde minimiert
  if Message.CmdType and $FFF0 = SC_MINIMIZE then
  begin
    Hide;
    // Icon in der TNA anzeigen
    Shell_NotifyIcon(NIM_ADD, @IconData);
  end
  else
    inherited;
end;

////////////////////////////////////////////////////////////////////////////////
// Beim Beenden Icon entfernen

procedure THauptform.FormDestroy(Sender: TObject);
begin
  Shell_NotifyIcon(NIM_DELETE, @IconData);
end;

////////////////////////////////////////////////////////////////////////////////
// Beim Erstellen des Formulares TNotifyIconData-Struktur initialisieren
Im Form-Create:

Delphi-Quellcode:
  // Message ID für Message merken, die gesendet wird, wenn die Taskbar im
  // System registriert wird.
  TaskBarNewReg := RegisterWindowMessage('TaskbarCreated');
  ///IconData Struktur füllen
  IconData.cbSize := SizeOf(IconData);
  IconData.Wnd := Handle;
  IconData.uID := 100;
  IconData.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
  IconData.uCallBackMessage := WM_USER + 20;
  IconData.hIcon := Application.Icon.Handle;
  IconData.szTip := 'VPlan+ v1.2.3 /8';
  // Icon einfügen. Bei Bedarf sofort
  //Shell_NotifyIcon(NIM_ADD, @IconData);
Er benutzt, genau wie ich, WindowsXP SP2.
Hat vlt jemand ähnlcihe Erfahrungen und kann mir sagen, wie man das Problem löst?

SirThornberry 17. Apr 2008 22:26

Re: Programmicon verschwendet bei Mouseover aus der TNA
 
in aller Regel verschwindet das Icon wenn eine Interaktion mit dem Trayicon erfolgt (Mouseover etc.) und die Nachricht dafür nicht an das angegebene Handle gesendet werden kann. Das kommt vor wenn zum Beispiel das angegebene Handle aus deinem FormCreate nicht mehr existent ist weil intern das Fenster neu erzeugt wurde.

Was mich wundert. Du bindest in den Uses das CoolTrayIcon ein aber am Ende nutzt du die Komponente gar nicht sondern machst trotzdem alles direkt (Icon registrieren etc.). Wenn du die Komponente verwendest sollte dein Problem verschwunden sein weil die Komponente intern ein eigenes Fenster erzeugt was über die ganze Zeit erhalten bleibt und nicht durch Anzeigen des Fensters eventuell neu erstellt wird.

Svenkan 18. Apr 2008 11:55

Re: Programmicon verschwendet bei Mouseover aus der TNA
 
Mal ganz davon abgesehn, dass du vollkommen Recht hast, habe ich jetzt komplett auf's CoolTrayIcon umgestellt. Das Problem besteht bei diesem User aber immer noch.

RavenIV 18. Apr 2008 12:20

Re: Programmicon verschwendet bei Mouseover aus der TNA
 
Hat der User vielleicht Dein Programm komplett geschlossen?
Dann bleibt nämlich manchmal das Icon in der TNA, obwohl das Programm nicht mehr läuft.
Erst bei Drüberfahren merkt Windows schliesslich, dass dieses Icon entfernt werden muss.

Als guter Tip kommt da immer:
"Das Kreuz oben rechts soll das Programm in die TNA minimieren, nicht komplett schliessen".

Luckie 18. Apr 2008 12:35

Re: Programmicon verschwendet bei Mouseover aus der TNA
 
Zitat:

Zitat von RavenIV
Hat der User vielleicht Dein Programm komplett geschlossen?
Dann bleibt nämlich manchmal das Icon in der TNA, obwohl das Programm nicht mehr läuft.

Aber nur, wenn der Programmierer Mist gebaut hat.

Zitat:

Als guter Tip kommt da immer:
"Das Kreuz oben rechts soll das Programm in die TNA minimieren, nicht komplett schliessen".
Das war jetzt hoffentlich ironisch gemeint. Wenn ich auf das Keruz klicke, dann erwarte ich, dass sich das Hauptfenster schliesst und der Prozess beendet wird.

RavenIV 18. Apr 2008 12:59

Re: Programmicon verschwendet bei Mouseover aus der TNA
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von RavenIV
Als guter Tip kommt da immer:
"Das Kreuz oben rechts soll das Programm in die TNA minimieren, nicht komplett schliessen".

Das war jetzt hoffentlich ironisch gemeint. Wenn ich auf das Keruz klicke, dann erwarte ich, dass sich das Hauptfenster schliesst und der Prozess beendet wird.

Meine User haben sich mehrfach beschwert, weil das so war.
Nun gehen alle meine TNA-Programm nicht mehr komplett weg, sondern werden in die TNA minimiert.

Und ich hab's so eigentlich auch lieber.

s-off 18. Apr 2008 13:05

Re: Programmicon verschwendet bei Mouseover aus der TNA
 
Zitat:

Zitat von RavenIV
Und ich hab's so eigentlich auch lieber.

Ich auch. Dennoch sollte man diese Entscheidung dem Anwender überlassen.

Svenkan 20. Apr 2008 00:20

Re: Programmicon verschwendet bei Mouseover aus der TNA
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von RavenIV
Hat der User vielleicht Dein Programm komplett geschlossen?
Dann bleibt nämlich manchmal das Icon in der TNA, obwohl das Programm nicht mehr läuft.

Aber nur, wenn der Programmierer Mist gebaut hat.

Der Fehler tritt nur bei dem einen Anwender auf, sonst hab ich bisher keinerlei solcher Meldungen bekommen und auch bei mir selbst läuft es (ebenfalls unter WinXP SP2) wunderbar. Das ist ja das seltsame. Und das Programm ist nicht abgestürzt, da es im Taskmanager immer noch vorhanden ist (denn darüber muss er das Programm dann zwangsweise beenden).


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz