.NET
Konsolenausgaben in einer WindowsForms Applikation
Posted on .Manchmal will man eine WindowsForms Anwendung auch über die Konsole aufrufen und dann möchte man natürlich auch Ausgaben der Anwendung in dem Konsolenfesnter sehen. Doch leider ist das nicht so einfach, da alle Aufrufe über die Console-Klasse werden ignoriert.
Doch warum ist das so? Das ist ganz einfach und liegt daran, dass das Konsolenfenster, das unser Programm startet zu einem anderem Prozess gehört, nämlich cmd.exe und somit nicht verbunden ist.
Was wir also tun müssen ist, unsere Ausgabe an das Konsolenfenster zu heften, das unsere Anwendung gestartet hat. Dafür kann man die Win32-Methode AttachConsole nutzen.
Diese ist sehr einfach aufgebaut und sollte vor der ersten Ausgabe an die Konsole aufgerufen werden:
Definition des Win32-Aufrufs: (Beispiele in VB.NET)
<DllImport("kernel32.dll")> _ Private Shared Function AttachConsole(dwProcessId As Integer) As Boolean End FunctionUm die Ausgabe an den Prozess zu geben der uns aufgerufen hat (Parent-Process) kann man hier als Wert -1 übergeben:
Private Const ATTACH_PARENT_PROCESS As Integer = -1Was nun noch bleibt ist es die Methode aufzurufen, zum Beispiel in der Main-Methode der Applikation:
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load AttachConsole(ATTACH_PARENT_PROCESS) //[...]Das wars auch schon, nun werden eure Ausgaben an das Konsolenfester umgeleitet. Um die Konsole wieder von eurem Prozess zu lösen kann die paremeterlose Methode FreeConsole genutzt werden.
Es lohnt sich hier natürlich dann auch eine Unterscheidung zu machen wie die App gestartet wurde, also ob über Konsole oder über Doppelklick wie immer. Wenn sie über die Konsole gestartet wird, sollte man vielleicht die Oberfläche nicht mehr anzeigen. Das kann man dann zB. daran erkennen, dass Environment.GetCommandLineArgs.Length > 1 ist.
Probleme
Leider gibts ein paar Nebeneffekte die nicht unbeachtlich sind.
Ein Problem ist, dass Konsolenfuntionen die die Ausgabe von Programmen umleiten zB. so: „myapp.exe -test >test.txt“ nicht funktionieren, die Ausgabe erfolgt weiterhin auf der Konsole. Hierfür konnte ich leider keine Lösung finden, wenn euch was einfällt einfach kommentieren.
Das zweite ist nur eine Schönheitssache, nämlich wenn das Programm beendet wird wird erst nicht die gewohnte Konsoleneingabezeile angezeigt, sondern nur der blinkende Cursor, so dass es aussieht als ob das Programm noch laufen würde, was es aber nicht mehr tut. (Wie gesagt Schönheitssache) Das kann man zB. dadurch umgehen, dass man vor dem Beenden des Programms noch ein [Enter] auf der Konsole ausgibt.
Weitere Infos und auch eine kleine Diskussion gibts hier und hier.
Sebastian Gross
http://www.bigbasti.comSebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.
Author Dejan
Posted at 17:25 3. Februar 2012.
Der Gefaellt mir Button wuerde sich gut auf der Seite machen, oder ist er mir entgangen?
Author Sebastian Gross
Posted at 08:30 6. Februar 2012.
Hallo Dejan,
die Einbindung des Like-Buttons würde automatisch die Weitergabe der Daten aller Besucher an Facebook bedeuten, ich bin gegen eine unbewusste Weitergabe von Daten, daher findest du unter jedem Artikel unter „Share and Enjoy“ einen Facebook-Share-Button statt eines Like Buttons.
Gruß, Sebastian
Author Novo
Posted at 11:58 21. Mai 2012.
Ich würde es stattdessen so machen:
_
Public Shared Sub AllocConsole()
End Sub
Sub New()
AllocConsole()
Console.WriteLine(„[“ & Now.ToLongTimeString & „] “ & „Console started …“)