Announcement

Collapse
No announcement yet.

Windows Messages abfangen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Windows Messages abfangen

    Hallo zusammen,

    ich habe folgendes Problem:
    ich muss in einem selbstgeschriebenen Windows Dienst auf Windows Messages reagieren, genauer gesagt, ich muss zum Beispiel auf wm_devicechange reagieren um mitzubekommen, wenn jemand ein Kabel am Drucker abgezogen hat usw. Zu diesem Zweck wurde in der Anwendung eine hiddenForm implementiert (also künstlich ein Formular erzeugt und dann versteckt), um die WndProc zu implementieren und auf diese Ereignisse reagieren zu können. Das Problem ist, das ich bei Ab- und wieder Anmelden ein nicht mehr gültiges Fensterhandle in der Hand halte und infolgedessen nicht mehr auf diese Nachrichten horchen kann. Kann das irgendwie anders implementiert werden? (Ich habe die Anwendung übernommen, die Ursprungslösung ist nicht von mir) Wenns geht ein Lösung in C# als Beispiel.

    Vielen Dank!

  • #2
    Hallo,
    die technisch sauberste Lösung wird eine TBNA-Anwendung (die <i>Taskbar Notification Area</i> am rechten Rand der Taskleiste von Windows) sein, die im Kontext des interaktiven Benutzers automatisch gestartet wird. Im .NET-Framework ist die <b>NotifyIcon</b>-Klasse zuständig, wobei in der Regel ein verborgenes Formular im Spiel ist.

    Wenn der Dienst benötigt wird, um mit höheren Rechten als der interaktiv angemeldete Benutzer zu hantieren, kann die TBNA-Anwendung dem Dienst über eine Interprozesskommunikation die Info "Login" übermitteln, so dass der Dienst sein Fenster wegwerfen und neu initialisieren kann

    Comment


    • #3
      Ich weiss nicht ob das mein Problem löst, aber ich war vielleicht auch nicht detailliert genug. Der Dienst, der die hiddenform implementiert und damit die WndProc überschreibt um auf Events reagieren zu können (hauptsächlich auf Plug&Play), ist kein eigenständiger Dienst sondern ein Portmonitor. Dies ist ein Mechanismus des Windows Druckspoolers, mit dem man eigene Ports angliedern kann um auf unterster Ebene das Drucken und insbesondere auch die Druckstati abfangen zu können. D.h. also, dieses Teil ist abhängig vom Spooler-Dienst und läuft gewissermaßen in dessen Kontext. Bei Ab- und wieder Anmelden (im Gegensatz zum Neustart) wird jedoch der Spooler-Dienst nicht neu gestartet, sodaß der eigene Portmonitor zwar noch auf Druckanfragen reagiert, aber, weil das Handle der hiddenForm ungültig geworden ist, nicht mehr über Events informiert wird und somit auch nicht mehr mitbekommt, wenn beispielsweise jemand am Drucker ein Kabel abzieht (dann käme ein Plug&Play Event). Ich habe so das dunkle Gefühl, das die Architektur hier auch nicht so optimal ist. Hat jemand hier einen Vorschlag

      Comment


      • #4
        Wäre es denn eventuell möglich, das ungültigwerden eines Fensterhandles bei Ab- und wieder anmelden (nicht neustart!) zu verhindern

        Comment


        • #5
          Hallo,

          beim beenden einer Session oder beim Herunterfahren (Neustart) kannst du unter .NET System Events dieses Erreignis abfangen und entsprechend reagieren, vllt. hilft dir das weiter?

          Ansonsten gibt es für Dienste die RegisterDeviceNotification die dem ServiceControlManager (SCM) mitteilt, dass der Dienst für Nachrichten (WM_DeviceChange) regestriert werden soll. Dies ist allerdings eine WinAPI funktion!

          Ich hoffe das du einbißchen weiter kommst, wenn du eine Lösung hast kannste ja mal bescheid geben.

          MfG

          Andy
          wiiapi.de
          wiisdk.de

          Comment

          Working...
          X