Das starten eines Prozesses ohne zu stehlen focus (C#)
Ich muss in der Lage sein, Prozesse zu starten (sowohl Konsole und Fenster), ohne es zu stehlen, konzentrieren. Der einzige Weg, innerhalb der .NET framework, die ich fand, um dies zu tun, ist Microsoft.VisualBasic.Die Interaktion.Schale mit Microsoft.VisualBasic.AppWinStyle.[Minimiert|Normal]NoFocus (die Karte, um SW_SHOWMINNOACTIVE/SW_SHOWMA Durchlaufen ShellExecute).
In der aktuellen version von meinem code (die nicht stehlen Fokus), ich bin mit System.Diagnostik.Prozess, und sich auf einige der Funktionen, die mir bietet, was die Interaktion.Shell-Methode nicht.
2 Fragen (eine schwere und eine Entlüftung mein Frust, dass ich nicht wirklich erwarten, eine gute Antwort auf)
1.) Bin ich richtig, dass ich keine Wahl habe, aber zum wickeln CreateProcess oder ShellExecuteEx mich, oder übersehe ich eine andere Lösung? Ich war wirklich gehofft, um dies zu vermeiden, als Prozess ist eine so vollständige und nützliche wrapper anderes als dieses versehen, und es wäre so viel Funktionalität zu implementieren, P/Invoke-Aufrufe zu Debuggen, und alle Arten von verschiedenen Schmerzen.
2.) Warum sollte ein team bei Microsoft zu schaffen, wie ein (ansonsten) komplette wrapper, und dann ausschließen Hälfte der möglichen Werte von ProcessWindowStyle, während ein anderes team erstellte eine ähnliche wrapper, der war viel weniger vollständig, aber, sofern alle nützlich Fenster Formatvorlagen?
- Sind Sie auf der Codierung etwas, was Sie nicht wollen, dass die Benutzer über wissen, oder wollen nicht die Mühe, den user? LOL Upps... :-/
- Keine andere Wahl? Microsoft.VisualBasic namespace ist Teil der .NET framework und auf jedem .NET installieren. Nicht verwenden, es wäre ein Fehler. Es hat viele andere leckereien, aber Sie können nicht herausfinden, wenn Sie kann nicht vorbei an den namespace-Namen.
- Hi nobugz, ich entschuldige mich, wenn ich den Eindruck erweckt, ich hatte ein problem mit dem namespace. Das ist nicht mein problem, in der Tat verwende ich eine nette parser von Microsoft.VisualBasic in einem anderen Teil des Codes. Das problem ist, dass das Microsoft.VisualBasic.Die Interaktion.Shell gibt mir nicht die Möglichkeit benachrichtigt zu werden, auf beenden oder Abbrechen eines Prozesses. Ich müsste irgendwie wickeln Sie es um die Funktionalität, wheres die Process-Klasse bietet mir diese beiden Dinge.
- jasonco, ich will nicht stören den Benutzer. Sie in der Tat müssen in der Lage sein, um die Interaktion mit der gestartete Prozess, wenn gewünscht, die ist der Grund, warum ich nicht verwenden können, Ausgeblendet.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den VB.Net team hat getan, viel mehr, um einfache Dinge für Entwickler in Bezug auf instrumentation, windows -, und ich sehe kein problem, das hinzufügen einer Referenz zu einer VB dll und verwenden Sie, die in Ihrem C# - Programm.
Es zwei teams mit unterschiedlichen Fokus, das ist alles. Und Sie sollte nicht fühlen sich schlecht über die Verwendung von Microsoft.VisualBasic.Die Interaktion.Schale, wenn es löst Ihr Problem.
Können Sie auch verwenden, Reflektor, um die tatsächliche Umsetzung und Durchsetzung des code auf sich selbst, wenn Sie nicht wollen, um auf diese dll zu verweisen.
[Edit - added-code-Beispiel nach Author, um zu zeigen, Sie können kombinieren, Zusammenwirken.Shell und Prozess]
Hier verwende ich die Shell-Methode, um kick-off des Prozesses, ein handle für den Prozess von der pid, und der Haken, auf den Veranstaltungen. Sie können sogar eine p.Kill (), um den Vorgang abzubrechen.
[Edit - workaround für cmd.exe]
Es fängt an, sich ein bisschen hackish nach meinem Geschmack, aber es funktioniert. Ersetzen Sie "NEWWINDOW" mit einer zufälligen guid oder so etwas zu machen es einzigartig.
Haben einen Blick hier:
Edit: habe ich geändert, den code zu zeigen, der mittels Benefizveranstaltungen und Umgang mit Ihnen, auch ich, haben gezeigt, dass die Nutzung der
Handle
Eigenschaft, die das handle des Prozesses, der ausgeführt wird.