Senden Sie windows-Meldung zu einem Windows-Dienst
Gibt es eine tool, um zu senden (mimic) eine windows-Meldung, wie "WM_ENDSESSION", um ein windows-Dienst?
ODER
Wie kann ich senden Sie eine windows-Nachricht an einen Prozess mit C#?
(Ich kenne nur C#)
BEARBEITEN: Zweck: Grundsätzlich habe ich zu debug-windows-service für die Behebung des Fehlers, der Auftritt, nur auf das system wird heruntergefahren.
- Ich denke, es gehört auf stackoverflow.com
- Viel Glück mit, dass?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Allgemein, Dienstleistungen, die nicht über windows (geschweige denn Nachrichtensysteme) erhalten Sie eine windows-Meldung.
Wenn der Fehler wirklich nur passieren, das beim Herunterfahren (im Gegensatz zu einfach den Dienst stoppen), kann es der Fall sein, dass etwas abhängig von einer Ressource, die Weg geht, die nicht behandelt wird, würdevoll (in dem Fall, den bug-fix könnte gesetzt bis die service-Abhängigkeiten nicht richtig). Haben Sie versucht, mit dem remote-debugging-tools zu befestigen, um den Prozess vor dem Herunterfahren?
Es ist eine Untersuchung Wert, wenn man das problem ohne abschalten, vielleicht, wenn halt der service mit dem Service Control Manager (keine Notwendigkeit, dies programmatisch tun, denn dies ist ein debugging-Szenario), in dem Fall können Sie den Haltepunkt OnStop (), die in Ihrem service (ich gehe davon aus, dass C#) und beobachten was passiert.
Leistungen gesteuert werden soll, mit ServiceController-Klasse
Können Sie es verwenden, um zu starten, zu stoppen und die Kommunikation mit services die Verwendung dieser Klasse.
Schauen Sie sich die Antworten zu Gewusst wie: simulieren Sie das Herunterfahren von windows, während des Debuggens?
Dienstleistungen haben ein 'Ereignis' genannt OnShutdown Sie abonnieren können, so könnte es sein, das problem ist, dass code. Wenn der code ist .Netto könnte man Unterklasse, können Sie es nennen, die geschützt OnShutdown-Methode zu Debuggen. Aber das problem könnte auch werden, wie vorgeschlagen, die von anderen service erwartet, Ressourcen werden zur Verfügung, die keine sind, weil Sie schon geschlossen.
Auch, wenn der Dienst geschrieben wurde .net 2.0 beachten Sie, dass die Stop () - Befehl nicht automatisch aufgerufen wird, auf einen Dienst, wenn die Arbeitsstation wird gerade heruntergefahren! Dies ist sehr überraschend und war behoben .net 3.5, aber wenn Sie verwenden .net 2.0 benötigen Sie zum aufrufen der Stop() sich innerhalb OnShutdown().
Wenn Sie die hwnd-Eigenschaft eines Fensters können Sie es senden Nachrichten. Die einzige Einschränkung ist, dass Sie können nicht senden Sie Nachrichten, die Zeiger wie setting-Fenster text.
Rufen Sie einfach
PostMessage()
mit dem Wert von hwnd und die Nachricht, die Sie senden möchten.Finden Sie die hwnd-Eigenschaft können Sie spy++.
Ich bin mir nicht sicher, wie Sie Sie verbinden alle diese windows-Dienste, da die windows-Dienste nicht windows.
Ich würde empfehlen, Import und definieren die folgenden:
Dann senden durch 0x1 oder 0x0 was wahr oder falsch als wParam Nachricht.
Also in Ihrem code verwenden Sie:
Wo HandleToSendTo ist der Fenster-Handle des Fensters, das Sie möchten, um die Nachricht zu senden.
Bearbeiten
Um die windows-handle, wenn Sie es nicht kennen, gehe ich davon aus, dass Sie wissen, dass es Titel oder name. Wenn ja, können Sie diese verwenden:
Denen weitere Informationen zu finden Sie in diese Frage.
Oder vielleicht
Ich weiß nicht, ob das ein ähnlicher Griff, ich bezweifle es, aber könnte jemand lassen Sie mich wissen, wenn es ist, aber Sie können einen Prozess-handle, das heißt, Sie bekommen könnte den Prozess mit Prozess.GetProcessesByName("MyAppName");, obwohl nicht auf diese angewiesen, da ich nicht denke, dass es sich dem Griff, den Sie sind, nach. Nur ein Vorschlag.
Ich glaube nicht, dass es ein Werkzeug zum senden beliebiger Meldungen, weil jede Nachricht kann beliebig LPARAM und WPARAM Werte.
Aber die nützlichsten Tools rund um windows-Nachrichten ist spy++. Spy++ ist im Lieferumfang von Visual Studio und es hilft Ihnen, zu sehen, welche Nachrichten gesendet werden, - Fenster Hierarchie und mehr.
Können Sie Nachrichten senden via C# mit der SendMessage Win32-API. Sie können das Fenster-handle es sich fragt, für durch die Verwendung eines Win32-API wie FindWindow oder FindWindowEx.
Bearbeiten (entsprechend Frage Bearbeiten): Dienste beendet werden von windows automatisch Herunterfahren. So beheben Sie Ihre Fehler, es klingt wie Sie müssen den code ändern, der Dienst selbst, um ordnungsgemäß herunterzufahren.
Edit2: Oder wenn Sie den Dienst beenden möchten, sollten Sie die Win32-API verwenden ControlService vorbei in
SERVICE_CONTROL_STOP
0x00000001
.Tatsächlich funktioniert diese Methode...Sie müssen nur den Zugriff auf die 'MainWindowHandle' - Eigenschaft des process-Objekts. Zum Beispiel...