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.
Schreibe einen Kommentar