2009-07-11 7 views
4

Da ich endlich eine Antwort auf diese Frage habe: Can you send a signal to windows explorer to make it refresh the systray icons, die fragt, ob ich totes Systray-Icon loswerden könnte, würde ich gerne das Gegenteil verlangen.Kann ich ein Systray-Symbol einer laufenden App, die verloren gegangen ist, erneut gewinnen?

Gibt es eine Möglichkeit, eine Anwendung "anzustupsen", um ihr Systray-Symbol erneut anzuzeigen, wenn es verloren gegangen ist?

Das passiert mit meinem Apache Monitor, seit ich Avira AV installiert habe.
Ok, gewährt, es könnte nur ein Nebeneffekt sein, aber es ist ziemlich nervig, die laufende App zu beenden und dann neu zu starten, nur weil das Systray-Icon nicht richtig angezeigt wird.

Vielen Dank im Voraus,
Gus

Antwort

4

Ich habe ein Projekt geschrieben, das eine TaskbarCreated-Nachricht an alle sendet f die obersten Fenster im System. Wenn sie ein Taskleistensymbol registriert haben, sollten sie das Symbol wiederherstellen, nachdem der Explorer abgestürzt ist.

Ich habe the source unter der MIT-Lizenz freigegeben und einen Link zu the compiled console application (mit Lazarus) in der Readme-Datei bereitgestellt.

Es gibt sicherlich ein paar Verfeinerungen, die gemacht werden können, wie nicht die Nachricht zu senden, wenn das Symbol bereits im Tray ist, aber vorerst verursacht diese App die Icons, die ich bei einem Explorer Absturz vermisse wieder erscheinen.

+0

Ich werde einen Test dazu haben. Aber Sie schauen jetzt auf die neue gewinnende Antwort. Vielen Dank!! –

10

die Taskleiste Symbol Wiederherstellen ist etwas, das durch die Anwendung selbst (statt Explorer) umgesetzt wird. Es gibt eine Fenstermeldung namens "TaskbarCreated" (der Wert kann mit RegisterWindowMessage("TaskbarCreated") abgerufen werden), auf die eine Anwendung reagieren muss, um das Taskleistensymbol bei Bedarf wiederherzustellen.

Zum Beispiel kann die Anwendung dies tun:

const int uTaskbarCreatedMsg = RegisterWindowMessage("TaskbarCreated"); 

Dann in seiner WndProc Funktion:

LRESULT CALLBACK WndProc(HWND w, UINT msg, WPARAM wparam, LPARAM lparam) 
{ 
    // ... handle other messages 
    if (msg == uTaskbarCreatedMsg) { 
     NOTIFYICONDATA nid; 
     // fill in details to create icon 
     Shell_NotifyIcon(NIM_ADD, &nid); 
     return 0; 
    } 
    // ... default message handling 
} 

Also, um eine Anwendung zu zwingen, seine Taskleiste Symbol wiederherzustellen, müssen Sie um die gleiche TaskbarCreated Nachricht an das entsprechende Fenster innerhalb der Anwendung zu senden. Eine Möglichkeit, das HWND in das Fenster zu bekommen, ist die Verwendung von FindMessage (und da Apache Monitor Open Source ist, ist es einfach herauszufinden, welches Fenster gesucht werden soll).

+0

Ihre Lösung ist aus der Sicht der Anwendung, die das Symbol hat. Was ich suche, ist eine externe Möglichkeit, der App zu signalisieren, das Symbol zu aktualisieren oder SysTray zu signalisieren, um die Liste der Symbole zu aktualisieren. –

+3

Senden dieser App die TaskbarCreated-Nachricht könnte nur den Trick tun. Andernfalls, wenn die Apache Monitor-Anwendung diese Nachricht nicht unterstützt, können Sie die Funktion unter Verwendung des obigen Codes hinzufügen, da sie Open Source ist. –

+1

Ich suchte die Quelle für die Apache Monitor-Anwendung (hier: http://svn.apache.org/viewvc/httpd/httpd/trunk/support/win32/ApacheMonitor.c?view=log#rev90160) und es erscheint als Obwohl die TaskbarCreated-Nachricht seit ihrer ersten Version im Jahr 2001 unterstützt wurde. Wenn Sie also in eine Situation geraten, in der das Symbol verschwindet, sollten Sie diese Nachricht an Apache Monitor senden, damit das Symbol im Explorer neu erstellt wird. –

-3

Das ist für mich gearbeitet (Windows 7 - 64 Bit)

  1. Einführung Taskmanager
  2. Tötung apachemonitor Prozess
  3. Starten apachemonitor aus dem Startmenü

Sie jetzt das Symbol sehen sollte der Systray

+1

Ich habe abgelehnt, weil der Zweck meiner Frage war eigentlich zu vermeiden, was Sie gerade vorgeschlagen haben. –