Service und Tray Icon



  • Hallo - ich habe einen Service geschrieben, der über den Tray Icon bedienbar ist.
    Das funktioniert soweit auch ganz prima 🙂 - bis auf :

    Wenn das System hochfährt und der Service automatisch startet erscheint das Tray Icon nicht ...
    ebenso wenn ein User sich abmeldet und sich wieder neu anmeldet. 😞 😞

    Mein Service benötigt also eine Mitteilung vom System wenn sich ein User angemeldet hat. ( Dann kann ich den Tray Icon / Dialog erstellen und dann wird's auch klappen)
    Welche Klassen bzw. Messages oder Systemmiteilungen könnten mir da hilfreich sein ?
    Hat da jemand eine Idee ?? 😕

    thx
    Sönke



  • Hallo,

    ein Service wird vom System nicht wie ein normales Programm behandelt.
    Die gesamte GUI landet auf einer anderen Window Station, die von Ein- und Ausgabegeräten abgeschottet ist, sodass deine GUI nicht so ohne weiteres sichtbar wird.
    Unter XP konnte man da noch tricksen und den Services auf die "normale" Window Station holen, aber ab Windows 6 ist dies (fast) unmöglich.

    Gruß
    Fabian



  • du musst das auftrennen: Service + User-Programm



  • Hallo Jungs !!! ⚠

    Ich bin duraus in der Lage ein Tray Icon (incl. Dialog) zu erstellen.
    Alle diese Tricks sind mir durchaus bewußt. 👍

    Hier geht's es nur um eben oben beschriebenes :

    Ihr startet windows - bis zum Login -> dann loggt Ihr euch ein !
    Eurer Service läuft dort bereits .. Soweit logisch ?
    Was dann fehlt ist der Dialog/TrayIcon - warum 😕 ??
    Na klar - der Service ist natürlich schon viel früher durchgestartet als das restliche Windowssystem welches ja erst durch den Login vollständig gestartet wird. 🙂
    Dann könntet Ihr den Service stoppen und wieder starten ->
    Voila ! schon klappt's mit service/TrayIcon. 😃

    So sollte es aber natürlich nicht funktionieren. 😞
    Nach dem Einloggen sollte das TrayIcon natürlich wie all die anderen dort befindlichen Tray Icon's auftauchen - nur der Service ist halt kein Autostart-prg und einen Zusatz in den Run - Eintrag in der Registry wollte ich auch nicht vornehmen. - gewünscht ist -ich muß wissen wie ich erkenne das ein User sich gerade angemeldet hat oder wie erkenne ich das Windows komplett hochgefahren wurde/ist. Darüber kann ich dann den Tray/Icon /Dialog später instanzieren und dann klappt's auch mit dem Nachbarn. 🤡

    Irgendeine Idee ?



  • Hallo,

    Sönke schrieb:

    Irgendeine Idee ?

    So wie bereits oben empfohlen. Du hast den Windowsdienst der unabhängig von dem Benutzerlogin und vor allem Deiner Konfigurations-GUI läuft. Dazu eine Helperapplikation die sich mit dem Dienst verbindet und im Autostart/Registry der Benutzerprofile liegen.

    Wenn Du das von der Anmeldung abhängig machen willst, wirst Du bei Terminalservices evtl. ein Problem haben.

    Gruß
    foodax



  • So wie ich Dich verstehe startet Dein Dienst dieses TrayIcon-Programm. Richtig? Das ist schon aus dem Grund nicht gut, da dieses dann mit den Rechten des Dienstes läuft, die meist höher sind, als die User-Rechte.

    Warum eigentlich kein Run-Eintrag? Dein Programm kann doch dann selbst checken, ob der Dienst läuft oder nicht und sich anzeigen oder nicht!?



  • Gut, ich muß gestehen die Möglichkeit gibt's - ich hatte halt mehr an de Variante VNC (Remote Administration etc.) gedacht.
    Hier taucht das VNC-Server Icon auch ohne Run Eintrag auf.

    Hierbei benötige ich halt nur eine Exe und das Projekt bleibt noch überschaubar.

    Meine Applikation benötigt ebenfalls entsprechende Rechte - also kein Problem - der aktuelle User muß entsprechend eingreifen können.(Er hat sowieso nur die Rechte die ich Ihm gebe.)

    Wenn Ihr sonst keine weiteren Ideen habt - probiere ich mal die Run-Variante aus - zusätzlich forste ich mal den Open-Source von VNC durch - mal schauen ob ich da was passendes finde....



  • Hier taucht das VNC-Server Icon auch ohne Run Eintrag auf.

    Bist du sicher?

    Davon abgesehen...

    Wenn man sicher sein kann, dass das Service mit Admin-/System-Rechten läuft, kann es leicht sein, dass es ohne "Run Eintrag" für die Tray-Helper-Applikation geht.

    Du kannst ja z.B. alle paar Sekunden die Window-Stations und/oder Desktops enumerieren, und gucken ob was neues dazugekommen ist. Oder noch ein wenig weiter suchen ob es einen passenden Event oder eine Window-Message gibt, der/die das Entstehen eines neuen Desktops verkündet.

    Wenn du dann einen neuen Desktop gefunden hat, machst du ihn auf, und zeigst dort ein Tray-Icon an.

    Entweder indem du einen neuen Thread rausstartest, und dann den "Current Desktop" dieses Threads änderst, oder (besser) indem du selbst die Helper-Applikation auf diesem Desktop rausstartest (was auch ohne Weiteres die Service .exe selbst sein kann - kannst ja einen Command-Line Parameter "-trayhelper" oder so verwenden).

    ----

    Eine eigene Tray-Helper Applikation zu verwenden ist soweit ich weiss die "Standard" Variante wie man sowas macht. Und bei Services die ohne Admin-/System-Rechte laufen müssen, wird es auch ziemlich sicher über einen Run-Eintrag gemacht, denn das Service hätte gar nicht die nötigen Rechte um auf einem fremden Desktop irgendwas zu machen.



  • Da muß ich jetzt ein wenig passen. Welche WM /Event wird denn geworfen wenn ein neues Desktop eröffnet wird ?? (hab in den MSDN's keine passende gefunden 😕 )

    Wie meinst du das mir Stations/Desktop enumerieren 😕

    Also wenn ich die Parameter geklärt habe krieg ich das wohl auch hin ....


Anmelden zum Antworten