2008-12-10 5 views
16

Ist es möglich, eine DOS-Konsole in einem Windows Form oder Benutzersteuerelement in C# 2.0 einzubetten?Embedding eine DOS-Konsole in einem Windows-Formular

Wir haben ein Legacy-DOS-Produkt, mit dem meine Windows-App interagieren muss, und es wurde angefordert, dass eine Instanz des Legacy-Produkts in der Windows-Anwendung ausgeführt werden sollte.

Momentan benutze ich die user32.dll, um das Fenster zu finden, in dem das DOS-Produkt läuft, Minimierung, Maximierung des Fensters und Eingabe von Zeichen in das Fenster. Dies ist keine sehr gute Lösung für das Problem, da dies bedeutet, dass meine Anwendung den Fensternamen in den Anwendungseinstellungen speichern muss und dass der Benutzer zur richtigen Seite der DOS-Anwendung zurückkehren muss, bevor er die Interaktionsfunktion verwendet.

EDIT: Einige weitere Informationen

Das Vermächtnis App muss für den Benutzer sichtbar sein, aber nicht in einem separaten Fenster.

Ich habe versucht TimothyP's Antwort und es funktioniert sehr gut, aber ist es möglich, die gleiche Funktionalität zu erreichen, aber mit dem DOS-Fenster visuell in einem Windows-Formular oder Benutzersteuerung eingebettet, anstatt in seinem eigenen Fenster auftauchen? Vorzugsweise in einer ShowDialog() - Weise, so dass der Benutzer nicht mit der App interagieren kann, wenn sie sich sozusagen im "Legacy-Modus" befinden.

Antwort

22

Es ist möglich, die Standardeingabe/-ausgabe von Konsolen-/DOS-Anwendungen mithilfe der Process-Klasse umzuleiten. Es könnte in etwa so aussehen:

Sie können jetzt die Streams verwenden, um mit der Anwendung zu interagieren. Wenn Sie processStartInfo.CreateNoWindow auf "true" setzen, wird die ursprüngliche Anwendung ausgeblendet.

Ich hoffe, das hilft.

+0

Wie verwende ich den 'outputReader' mit einer Anwendung, die ständig ausgeführt und ausgegeben wird, bis der Benutzer existiert? So etwas wie ein Nodejs-HTTP-Server, bei dem jedes Mal, wenn eine Anfrage gestellt wird, eine neue Zeile ausgegeben wird? – Ace

1

Mit der CreateProcess-Funktion und den Membern hStdInput, Output und Error des Arguments STARTUPINFO können Sie die Standardeingabe und -ausgabe der Anwendung abfangen.

4

In Bezug auf Ihre Frage, wie Sie die DOS-Anwendung in der Windows-App anzeigen.

Es gibt ein paar Lösungen.

  • Die erste ist einfach nicht die DOS App angezeigt werden (mit CreateNoWindow) und durch Lesen und Schreiben zu den Streams der Benutzeroberfläche der DOS-Anwendung in Ihrer Windows-Anwendung „simulieren“.

  • Die andere Lösung wäre, die Win32API zu verwenden, das Windows-Handle (Whnd) des Console/DOS-Anwendungsfensters abzurufen und sein übergeordnetes Element zu Ihrem Formular festzulegen. Ich bin momentan nicht zu Hause und da es schon sehr lange her ist, kann ich mich nicht erinnern, wie es gemacht wird.Wenn mich nicht alles täuscht müssen Sie die folgende Win32-API-Aufrufe verwenden:

Wenn ich etwas später verließ Zeit heute Ich werde sehen, ob ich bessere Proben finden kann.

+0

Danke Timothy, ich habe bereits die Aufrufe von FindWindow und GetWindow API verwendet, ich werde heute in SetParent nachsehen. Nochmals vielen Dank für Ihre Hilfe! Hoffentlich kann ich eines Tages den Gefallen erwidern. –