Betten Sie ein Konsole-Fenster innerhalb eines WPF-Fensters
Ist es möglich, Betten Sie ein Konsole-Fenster innerhalb eines WPF-Fensters?
Als ein wenig hintergrund, auf den ersten, habe ich versucht zu implementieren, die eine Konsole von Grund auf neu in WPF, die erfolgreich war, ausser ein riesiges problem-es ist extrem langsam. Sehen Sie hier die Frage:
VT100-Terminal-Emulation in Windows -, WPF-oder Silverlight
Da, die nicht scheinen, um eine option sein, bin ich stattdessen betrachten hosting eine aktuelle Konsolenfenster, in meiner WPF-Anwendung, die ich ' ve gelernt, wie zu tun, wie hier beschrieben:
Keine Ausgabe in der Konsole von einer WPF-Anwendung?
Und das ist großartig, aber im Idealfall möchte ich haben, dass die Konsole-Fenster Aussehen es ist ein Teil der rest der WPF-Anwendung. Ich weiß, dass es möglich ist, mit einer WinForms app als ich habe es gesehen, an denen mit der SetParent-Win32-API. Können Sie ein Beispiel sehen .NET-Projekt, hat es mit dieser CommandBar-Projekt bettet sich ein Konsole-Fenster in der shell:
http://www.codeproject.com/KB/cs/commandbar.aspx
So, ich bin hoffnungsvoll, es kann getan werden mit WPF so gut, aber ich habe keine Ahnung, wie würden Sie das tun. Hilfe ist sehr willkommen (auch, wenn Sie irgendwelche genialen Lösungen zu meinem ursprünglichen problem, erstellen Sie ein terminal-Fenster von scratch in WPF-da würde lösen meine Bedürfnisse auch).
UPDATE:
Mit Hilfe Reed Copsey die Hilfe, die ich konnte, um die Konsole-Fenster eingebettet. Aber natürlich ist es nötig gestylt zu sein und verschoben, oder aber es sah einfach wie ein normales console-Fenster in einer WPF-Fenster. Ich brauche die Titel-Leiste und großen Höfen entfernt. Recherche habe ich herausgefunden, wie man die Win32-APIs zu tun, wie diese:
uint style = GetWindowLong(ConsoleManager.ConsoleWindowHandle, GWL_STYLE);
style &= ~(uint)WindowStyles.WS_CAPTION;
style &= ~(uint)WindowStyles.WS_THICKFRAME;
style &= ~(uint)WindowStyles.WS_DLGFRAME;
style &= ~(uint)WindowStyles.WS_POPUP;
SetWindowLong(ConsoleManager.ConsoleWindowHandle, GWL_STYLE, style);
MoveWindow(ConsoleManager.ConsoleWindowHandle, 0, 0, (int)WindowsFormsHost.ActualWidth, (int)WindowsFormsHost.ActualHeight, true);
Jedoch, es gibt ein großes problem. Für einige Grund, die Konsole-Fenster hat eine rendering-Artefakt. Es ist, als ob es nicht gezeichnet, selbst auf der unteren linken und oberen rechten Seiten. Die Breite des Artefakts ist wie die Breite der Titelleiste und den dicken Rand, und in der Tat, wenn ich den dicken Rand in der Größe des Artefakts nach unten geht. Aber einfach gezeichnet, es wird nicht helfen, da es wieder zum Vorschein kommt. Ich kann, zum Beispiel, verschieben Sie das Fenster aus dem Bildschirm und wieder zurück, um es zu beheben, aber es bald wieder auf seinen eigenen:
rendering-Artefakt http://img837.imageshack.us/img837/6241/renderissue.png
UPDATE 2: Der Effekt passiert auch, wenn ich keine Eltern in der WindowsFormsHost-Steuerelement. Alles, was ich zu tun, um es zu reproduzieren ist, starten Sie die Konsole (mit AllocConsole()) und entfernen Sie dann die Titelleiste mit SetWindowLong. Dies ist ein win7 Rechner.
UPDATE 3: Es scheint 'messing', mit anderen windows nicht unterstützt. Das Konsole-Fenster berechnet die textarea-vorausgesetzt, es gibt eine Beschriftung, so gibt es keinen Weg, um dieses. Ich denke, meine einzige option, um die Konsole-wie Verhalten in WPF wird zum schreiben eines benutzerdefinierten WinForms controls und binden Sie dann in WPF.
- Haben Sie das geschafft erfolgreich zu sein?
- NÖ... die updates stellen die ganze Geschichte 🙁
- Könnte man auf die Console2 (später gegabelt als ConsoleZ) Programme. Sie erfolgreich Gastgeber für eine Reihe von Eingabeaufforderungen in einem tab-control ohne Beschriftung/Titel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie in der Lage sein zu verwenden die gleiche Technik wie der Windows Forms-Anwendung, die Sie zeigte durch die übernahme in ein HwndHost. Sie könnte auch einfach an der Windows-Forms-code, und setzen Sie dieses direkt in WindowsFormsHost Kontrolle.
Neben Reed Copsey's gute Ratschläge zur Einbettung einer Konsole-Fenster in einer WPF-Anwendung, die eine alternative Strategie, die lächerlich einfach zu implementieren wäre, um einfach den Befehl über die Process-Klasse, und leiten Sie die zwei Ströme in nativen WPF-TextBlocks. Hier ein screenshot...
Diese WPF-Anwendung per Kabel an den Windows Explorer Kontext-Menü für die 'exe' - Dateien) führt das Programm aus und leitet die Ergebnisse in die entsprechenden Fenster.
Es wurde entwickelt, um zu helfen, wenn Sie möchten, starten Sie eine Konsole-Dienstprogramm, und wenn Sie darauf klicken, wird das Dienstprogramm geht sausen in einem Konsole-Fenster und Sie nie bekommen, um zu sehen, was passiert. Es ist auch so verdrahtet 'csproj Dateien ausführen, MSBuild, die Ihnen von Explorer.
Den Punkt, dass es manchmal einfacher und besser skalierbar, es selbst zu tun anstatt zu versuchen, um host eine Konsole...
Die Interna dieser app verwenden Sie diese Klasse...
Diese Klasse führt den Namen " exe " - Datei und erfasst die Ausgabe und ruft dann das View-Modell. Die ganze Codierung Bohrer sollte etwa eine Stunde dauern oder so...
Docs auf der Process-Klasse sind hier: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx