Wie kann ich senden eine Nachricht zu einem bestimmten Prozess mit Prozess-id anstatt durch das Fenster-handle?
Umgehen Sie die Einschränkungen von GenerateConsoleCtrlEvent, ich habe zum erstellen einer temporären "Mitte-Mann" - Prozess zu behandeln Start einige Konsolen-Anwendungen. Der Prozess der Hauptzweck ist zu nennen, GenerateConsoleCtrlEvent auf sich selbst, wodurch sich selbst und alle untergeordneten Prozess zu schließen sauber in Reaktion auf die Tastenkombination Strg+UNTBR (statt Prozess.Töten). Diese Notwendigkeit ergibt sich aus der Tatsache, dass GenerateConsoelCtrlEvent hat im Grunde keine Auswirkung, es sei denn, die Prozess-Gruppen-id ist null, das bedeutet, es ist immer nur dann wirksam auf den aufrufenden Prozess in der Arbeitsgruppe selbst. Siehe: https://stackoverflow.com/a/2431295/88409
Also wie auch immer... ich habe diese Zwischenschritte im Prozess, die einen thread startet, ruft die Anwendung.Führen Sie auf eine form, die Prozesse bestimmter Benutzer-definierte Meldungen.
Mein problem ist... wie Nachrichten senden, um diesen Prozess zu Steuern?
Habe ich die Process-Objekt und die Prozess-id, aber das ist alles. Prozess.MainWindowHandle null ist.
Also brauche ich eine Möglichkeit, eine Nachricht an einen bestimmten Prozess oder die broadcast-Nachricht an alle Fenster, die in einen bestimmten Prozess.
FindWindow ist keine option, weil es versucht, zu identifizieren, wird ein Fenster mit Namen und Klasse für jeden Prozess, welcher unzuverlässig ist. Ich möchte eine Nachricht senden, die einen bestimmten Prozess mit keine Mehrdeutigkeit.
InformationsquelleAutor Triynko | 2013-04-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht senden noch eine Nachricht an einen Prozess, aber Sie können eine Nachricht für einen thread. Natürlich, der thread muss begonnen haben, eine message-Schleife zu verarbeiten.
Da "SendMessage" umgeht die message-queue und leitet die Nachricht direkt an eine Fensterprozedur, kann es noch vollständig zu sagen, man kann "post" eine Nachricht an einen thread, aber man kann nicht "senden" eine Nachricht an einen thread. Das ist, warum es keine solche Sache als "SendenThreadMessage". Übrigens, SendMessage hätte den Nebeneffekt zu umgehen, eine TranslateMessage nennen, denn das nennt man in der message-loop. Wenn Sie die bypass-Funktion der Schleife durch den Aufruf von SendMessage, hättest du auch umgehen TranslateMessage nennen.
Ich bin markieren diese als die Antwort, aber ich werde auch zu verlassen, meine eigene Antwort (stackoverflow.com/a/16157666/88409) mit dem code, der verwendet werden kann, auf eine Nachricht begrifflich auf einen Prozess, ohne dass ein thread oder ein Fenster, so dass ein Ziel-thread oder Fenster wird automatisch ausgewählt durch enumeration. Der Zweck dieser Methoden ist, um es einfacher, um zu laichen einen Prozess und senden von Nachrichten Steuern, ohne den zusätzlichen Schritt der Identifizierung eines bestimmten thread oder Fenster-handle, die automatisch durchgeführt werden kann.
InformationsquelleAutor Medinoc
Es gibt 3 Szenarien, in denen eine Meldung könnte gedacht als gesendet oder geschrieben auf einen Prozess:
Ansatz 1 kann auch Besondere, denn es zielt auf einen bestimmten aber beliebigen Fenster.
Ansatz 2 ist möglicherweise nicht spezifisch genug, da die ersten aufgelisteten thread ist willkürlich und kann nicht über eine message-loop.
Ansatz 3 ist ein hybrid-Ansatz, der erste gibt ein Fenster, aber dann posts ein thread-Nachricht an das Fenster s thread, es ist also nicht gezielt auf ein bestimmtes Fenster (D. H. es ist ein "thread message"), sondern es wird gezielt in einem thread, der wahrscheinlich zu haben, eine message-Schleife, da der thread besitzt mindestens ein Fenster.
Folgenden ist eine Implementierung, die sich für alle drei Ansätze, und beide Methoden "send" und "post". Ansatz 1 ist umgeben von den Methoden SendMessage und PostMessage unten. Ansatz 2 und 3 sind umschlossen von der Methode PostThreadMessage unten, je nachdem, ob Sie legen Sie die optionalen parameter
ensureTargetThreadHasWindow
(true = Ansatz 3, false = Ansatz 2).Zur Nutzung dieser extension-Methode auf ein Process-Objekt:
InformationsquelleAutor Triynko
Verwenden EnumWindows zum Scannen der top-level-Fenster, und verwenden Sie GetProcessHandleFromHWnd, um zu bestimmen, ob ein Fenster in der Ziel-Prozess.
Können Sie dann Nachrichten senden, hwnd, und Sie sollte empfangen werden, die durch Ihre Ziel-Prozess (wenn Ihr Ziel-Prozess hat eine message loop).
Ich würde es vorziehen, zu verwenden.Threads (zurück ProcessThread[]), dann rufen Sie EnumThreadWindows auf jeden thread, um die windows. Wenn wurden statt call EnumWindows, würde es wieder windows von vielen Prozessen, so müsste ich filter das windows durch den Aufruf GetProcessHandleFromHWnd auf jeden Griff. Mit GetWindowThreadProcessId, wie vorgeschlagen, durch Medinoc würde auch erfordern, mich zu filtern, die windows überprüfen, ob Prozess.Threads, die Sammlung für den Ziel-thread enthält einen thread mit dem Fenster-owner-thread-id.
InformationsquelleAutor dthorpe