Gibt es ein Tool zum Senden (imitieren) einer Windows-Nachricht wie "WM_ENDSESSION" an einen Windows-Dienst?
ODER
Wie kann ich mit C # eine Windows-Nachricht an einen Prozess senden?
(Ich kenne nur C #)
EDIT: Zweck: Im Grunde muss ich einen Windows-Dienst debuggen, um einen Fehler zu beheben, der nur beim Herunterfahren des Systems auftritt.
Im Allgemeinen haben Dienste keine Fenster (geschweige denn Nachrichtenpumpen), um eine Windows-Nachricht zu empfangen.
Wenn der Fehler wirklich nur beim Herunterfahren auftritt (im Gegensatz zum Stoppen des Dienstes), kann es vorkommen, dass etwas von einer Ressource abhängt, die nicht mehr ordnungsgemäß behandelt wird (in diesem Fall wird die Bugfix könnte sein, um die Dienstabhängigkeiten korrekt einzurichten. Haben Sie versucht, die Remote-Debugging-Tools vor dem Herunterfahren an den Prozess anzuhängen?
Es lohnt sich zu untersuchen, ob das Problem auftritt, ohne heruntergefahren zu werden, etwa wenn der Dienst nur mit dem Dienststeuerungs-Manager beendet wird (dies ist programmgesteuert erforderlich, da es sich um ein Debugging-Szenario handelt) kann OnStop () in Ihrem Dienst unterbrechen (ich nehme C # an) und beobachten was passiert.
Die Dienste sollten über die ServiceController-Klasse
gesteuert werdenSie können damit beginnen, stoppen und mit Diensten kommunizieren.
Sehen Sie sich die Antworten zu an, um Windows-Herunterfahren während des Debuggens zu simulieren?
Dienste haben ein 'Ereignis' namens OnShutdown, das sie abonnieren können, daher könnte das Problem in diesem Code liegen. Wenn der Code .net ist, können Sie ihn unterklassifizieren, so dass Sie die geschützte OnShutdown-Methode zum Debuggen aufrufen können. Das Problem könnte aber auch so sein, wie es von anderen vorgeschlagen wurde, dass der Dienst Ressourcen erwartet, die nicht verfügbar sind, weil sie bereits geschlossen wurden.
Wenn der Dienst in .net 2.0 geschrieben wurde, beachten Sie, dass der Stop () Befehl nicht automatisch für einen Dienst aufgerufen wird, wenn die Arbeitsstation heruntergefahren wird! Dies ist sehr überraschend und wurde behoben in .net 3.5 , aber wenn Sie .net 2.0 verwenden, müssen Sie Stop () selbst innerhalb von OnShutdown () aufrufen.
Wenn Sie das Fenster eines Fensters haben, können Sie ihm Nachrichten senden. Die einzige Einschränkung besteht darin, dass Sie keine Nachrichten senden können, die Zeiger enthalten, z. B. den Fenstertext festlegen.
Rufen Sie einfach PostMessage()
mit dem Wert von hwnd und der Nachricht auf, die Sie senden möchten.
Um das hwnd zu finden, können Sie spy ++ benutzen.
Ich bin nicht sicher, wie Sie das alles mit Windows-Diensten verbinden, da Windows-Dienste keine Fenster haben.
Ich würde empfehlen, Folgendes zu importieren und zu definieren:
%Vor%Senden Sie dann durch 0x1 oder 0x0, das wahr oder falsch als wParam-Nachricht darstellt.
Also in Ihrem Code werden Sie verwenden:
%Vor%Dabei ist HandleToSendTo der Fenster-Handle des Fensters, an das Sie die Nachricht senden möchten.
Bearbeiten
Um den Windows-Griff zu bekommen, wenn Sie es nicht wissen, nehme ich an, dass Sie seinen Titel oder Namen wissen werden. Wenn ja, können Sie dies verwenden:
Welche weiteren Informationen finden Sie in diese Frage.
Oder vielleicht
Ich weiß nicht, ob das ein ähnlicher Handle ist, ich bezweifle es, aber jemand könnte mich wissen lassen, wenn es ist, aber Sie können einen Process-Handle bekommen, was bedeutet, dass Sie den Prozess mit Process.GetProcessesByName bekommen könnten (" MyAppName "); obwohl Sie sich nicht darauf verlassen, da ich nicht glaube, dass es das Handle bekommt, nach dem Sie suchen. Nur ein Vorschlag.
Ich glaube nicht, dass es ein Werkzeug gibt, um beliebige Nachrichten zu senden, da jede Nachricht beliebige LPARAM- und WPARAM-Werte haben kann.
Aber das nützlichste Werkzeug, das Windows-Nachrichten umgibt, ist spy ++. Spy ++ ist in Visual Studio enthalten und hilft Ihnen zu sehen, welche Nachrichten gesendet werden, Fensterhierarchie und mehr.
Sie können Nachrichten über C # mit der SendMessage Win32 API. Sie können den Windows-Handle, nach dem sie fragt, mit einer Win32-API wie FindWindow oder FindWindowEx .
Bearbeiten (um der Bearbeitung der Frage zu entsprechen): Dienste werden beim Herunterfahren automatisch von Windows gestoppt. Um Ihren Fehler zu beheben, müssen Sie den Code des Dienstes ändern, um ihn ordnungsgemäß herunterzufahren.
Edit2: Oder wenn Sie den Dienst beenden möchten, sollten Sie die Win32-API verwenden ControlService übergibt SERVICE_CONTROL_STOP
0x00000001
.
Ich weiß nicht, ob das ein ähnlicher Handle ist, ich bezweifle es, aber jemand könnte mich wissen lassen, wenn es ist, aber Sie können einen Process-Handle bekommen, was bedeutet, dass Sie den Prozess mit Process.GetProcessesByName bekommen könnten (" MyAppName "); obwohl Sie sich nicht darauf verlassen, da ich nicht glaube, dass es das Handle bekommt, nach dem Sie suchen. Nur ein Vorschlag.
Eigentlich funktioniert diese Methode ... Sie müssen nur auf die Eigenschaft 'MainWindowHandle' des Prozessobjekts zugreifen. Zum Beispiel ...
%Vor%Tags und Links .net c# windows-services winapi shutdown