BigBastis Blog

Konsolenausgaben in einer WindowsForms Applikation

Introduction

user

Sebastian Gross

Sebastian 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.


LATEST POSTS

Handling too long scrollspy menus 10th June, 2015

Java: Create ZIP archive 23rd March, 2015

.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 Function

Um 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 = -1

Was 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.

profile

Sebastian Gross

http://www.bigbasti.com

Sebastian 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.

Comments
user

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?

user

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

user

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 …“)

Kommentar verfassen

View Comments (3) ...
Navigation