Die Community zu .NET und Classic VB.
Menü

Ausschreibung: Systemtray

 von 

Beschreibung  

Kurzinfo

  • Titel: Systemtray
  • Ausschreibungsbeginn: 28.07.2003
  • Einsendeschluß: 28.08.2003
  • Auftraggeber:
  • Jury: Florian Rittmeier, Mario Zeller, Johannes Faget
  • Preisgeld: 20 Euro

Aufgabenstellung

Wenn eine Anwendung beim Beenden ihr ShellNotifyIcon nicht aus dem Systemtray entfernt, muss man meistens erst die Maus darüber bewegen, damit das Icon verschwindet.

Ziel dieser Ausschreibung ist es, dass dies nicht mehr notwendig ist. Dies bedeutet, dass die Aktualisierung des Systemtrays per Code erfolgen muss.

Anmerkungen

Zur Aktualisierung des Systemtrays darf die Maus nicht bewegt werden.

Gewünscht ist VB5/VB6 Code mit API-Funktionen.

Der Code muss unter allen gängigen MS-Betriebssystemen funktionieren. Dies umfasst Windows 95 und Nachfolger sowie die NT-Reihe beginnend mit NT4.

Nochmal genauer(03.08.03)

Da im Forum einige Leute nach eine genaueren Spezifikation gefragt haben, hier noch ein paar Zeilen.

Eine fremde Anwendung(die nicht modifiziert werden kann), wird auf die harte Art beendet und entfernt dadurch nicht ihr ShellNotifyIcon.

Die fremde Anwendung wird durch die eigene Anwendung beendet.

Nachdem das eigene Programm die andere Anwendung beendet hat, wird eine Funktion aufgerufen, welche das ShellNotifyIcon der anderen (bereits beendeten) Anwendung, aus dem Systemtray entfernen soll.

Diese Funktion gilt es zu schreiben.

Ermittlung des Gewinners

Es werden alle Einsendungen ausgewertet, die bis zum Einsendeschluss eingegangen sind. Der Gewinner wird durch die Vergabe von Punkten ermittelt. Jedes der 3 Mitglieder der Jury vergibt 0-60 Punkte.

Strukturierung15 Punkte
Verständlichkeit15 Punkte
Eleganz15 Punkte
Kommentierung15 Punkte

Weitere Regelungen

Einsendungen müssen per Email an gesandt werden.

Das Thema darf im Forum diskutiert werden, Einsendungen werden jedoch bis zum Einsendeschluß geheimgehalten.

Preisgeld

Das Preisgeld beträgt 20 Euro und wird per Überweisung an den Gewinner ausgezahlt.

Anmerkung

Alle Einsendungen dürfen nach Einsendeschluß von ActiveVB.de veröffentlicht werden.

Lösung

Zu dieser Ausschreibung erreichten uns acht Einsendungen!

Leider schieden sofort zwei Einsendungen aus, da bei diesen das Problem nicht richtig erkannt wurde.

Die in den restlichen Ausschreibungen verwendete Methode zur Lösung des Problems bestand zumeist darin, dass man sich zunächst unter Zuhilfenahme der FindWindowEx API-Funktion das richtige Fenster ermittelte und anschließend mit PostMessage bzw. SendMessage Mausbewegungsnachrichten an das betreffende Fenster sendete um so das nicht entfernte Icon zu entfernen.

Christoph von Wittich ging einen anderen Weg. Er verwendete eine undokumentierte API-Funktion um das Schließen eines Fensters zu bemerken. Diese API lieferte ihm die hWnd jedes sich schließenden Fensters wodurch er in der Lage war, die reguläre API-Funktion zum Entfernen von Icons aus dem Systemtray zu verwenden. Allerdings funktionierte diese Methode nur unter Windows XP und auch dort nur bei bestimmten Anwendungen.

Wir raten jedoch explizit davon ab, diese Methode zu verwenden, da die Verwendung von undokumentierten API-Funktionen die Gefahr birgt, dass die Funktion nach dem nächsten Bugfix oder ServicePack nicht mehr genauso funktioniert oder vorhanden ist.

Auf unseren zahlreichen Testsystemen funktionierten leider ein Teil der Einsendungen überhaupt nicht. In die engere Wahl gelangten schließlich drei Einsendungen, aus welchen Kai Liebenau, durch Vergabe von Punkten als Gewinner ermittelt wurde. Kai hat zugunsten von ActiveVB auf das Preisgeld verzichtet, wofür wir ihm recht herzlich danken.

Einsendungen zur Ausschreibung 

12.10.03 - Universelle Lösung

Kai Liebenau, Johannes Faget und Konrad Rudolph haben mit Code von ihnen und Felix Horstbrink eine neue Version des Programms erstellt. Der Code ist nun unter allen gängigen Windows-Versionen einsetzbar. Getestet wurde er unter:

  • Windows 95b
  • Windows 98 SE
  • Windows ME
  • Windows NT4 SP6
  • Windows 2000 SP4
  • Windows XP SP1
  • Windows Server 2003

Universelle Lösung