[TUT] [VB] Konsole in Form einfügen

05/24/2014 09:36 *DerMetzger*#1
Hallo Elitepvpers,
Ich will heute ein kleines Tutorial machen, indem ich euch zeigen werde wie man eine Konsole mit einer Windows Forms öffnen kann.

Was wird benötigt?
- Visual Basic 2013
- Basic programmier Skills

Zuerst erstellen wir eine neue "Windows Forms - Anwendung"
[Only registered and activated users can see links. Click Here To Register...]



Nun machen wir einen Doppelklick auf die Form. Danach Schreiben wir über das "Public Class1":
Code:
Imports System.Runtime.InteropServices
Nun schreiben wir zwischen "Public Class1" und Private Sub Form1_Load(..):
Code:
 <DllImport("kernel32", SetLastError:=True)> _
    Private Shared Function AllocConsole() As Boolean
    End Function
    <DllImport("kernel32", SetLastError:=True)> _
    Private Shared Function FreeConsole() As Boolean
    End Function
[Only registered and activated users can see links. Click Here To Register...]



Nun Starten wir die Console wenn wir folgenden Code in das Form1 Load Ereignis einfügen:
(bzw. wir bestimmen die Meldung wenn die Konsole nicht Startet.)

Code:
If Not AllocConsole() Then
            MsgBox("Failed to load Console.", 1, "Failed to load Console")
        End If
[Only registered and activated users can see links. Click Here To Register...]

Jetzt haben wir die Konsole gestartet. Aber wir wollen natürlich auch dass sie eine Funktion hat oder?
Zuerst passen wir die Konsole ein bisschen an:
Code:
 Console.Title = "LOG"
        Console.ForegroundColor = ConsoleColor.Green
        Console.WriteLine("                              Succesfully Started!")
Damit ändern wir den Titel der Konsole, die Schriftfarbe und fügen einen Text ein, der beim Start ausgegben wird.
[Only registered and activated users can see links. Click Here To Register...]


Ich benutze die Konsole in diesem Tutorial als Log.
Das heißt, dass jede Aktion in der Konsole als Text wiedergegeben wird.
Zum beispiel bei einem Button:
[Only registered and activated users can see links. Click Here To Register...]

Danach machen wir einen Doppelklick auf den Button und Senden dadurch einen Text an die Konsole. Der Button kann nebenbei auch eine aktion ausführen.
Der Code:
Code:
Console.WriteLine("Button Clicked")
Es sollte nun so aussehen:
[Only registered and activated users can see links. Click Here To Register...]


Nun hier der Ganze Code:
Code:
Imports System.Runtime.InteropServices
Public Class Form1
    <DllImport("kernel32", SetLastError:=True)> _
    Private Shared Function AllocConsole() As Boolean
    End Function
    <DllImport("kernel32", SetLastError:=True)> _
    Private Shared Function FreeConsole() As Boolean
    End Function
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        If Not AllocConsole() Then
            MsgBox("Failed to load Console.", 1, "Failed to load Console")
        End If
        Console.Title = "LOG"
        Console.ForegroundColor = ConsoleColor.Green
        Console.WriteLine("                              Succesfully Started!")
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Console.WriteLine("Button Clicked")
    End Sub
End Class
Die Konsole in Aktion:
[Only registered and activated users can see links. Click Here To Register...]

Soo, das wars erstmal von mir.
Ich hoffe ich konnte euch mit diesem kleinen Tutorial weiterhelfen.
Bei Problemen oder Fragen einfach Komments oder eine PN schreiben :)
Ich würde mich übrigens sehr über ein Thanks freuen
Grüße, *DerMetzger*
05/24/2014 09:41 dowhile#2
In welchem Fall kann keine Konsole geöffnet werden?
05/24/2014 10:11 *DerMetzger*#3
In keinem ^^
is ja auch eig. dazu da dass es ein bisschen komplexer aussieht :)
05/24/2014 12:20 th0rex#4
Und was bringt mir das ? Kann genau so gut eine Konsolenanwendung machen und dort eine Form öffnen. Und dabei brauche ich nicht die calls zu den nativen Funktionen zu importen.
05/24/2014 17:39 Requi#5
Oder einfacher.
Man erstellt eine Windows Forms Anwendung.
Ändert es im Projekt zu einer Konsolen Anwendung und tada beides öffnet sich ohne native Funktionen.
05/26/2014 15:02 *DerMetzger*#6
Viele Leute wisen es vielleicht nicht?
Auch wenn es andere Möglichkeiten gibt, wieso sollte ich dann kein Tutorial über diese Möglichkeit machen dürfen? ^^
05/26/2014 15:37 Requi#7
Quote:
Originally Posted by *DerMetzger* View Post
Viele Leute wisen es vielleicht nicht?
Auch wenn es andere Möglichkeiten gibt, wieso sollte ich dann kein Tutorial über diese Möglichkeit machen dürfen? ^^
Weil "meine" Möglichkeit kürzer, schneller und konformer ist.
Wieso schwerer machen als es eigentlich ist?
05/26/2014 19:57 *DerMetzger*#8
Die paar Zeilen Code kann man einfügen ^^ dann is das genauso schnell.
Wieso Einfach wenn es auch Schwer geht?
05/26/2014 20:42 snow#9
Hm hm, was macht das hier eigentlich? :confused:

Code:
<DllImport("kernel32", SetLastError:=True)> _
Private Shared Function AllocConsole() As Boolean
End Function
<DllImport("kernel32", SetLastError:=True)> _
Private Shared Function FreeConsole() As Boolean
End Function
Muss muss ich dieses FreeConsole() verwenden? Und warum geht jetzt plötzlich Console.WriteLine? Warum weiß das Programm, dass alles auf diese AllocConsole() Konsole da ausgegeben werden soll?
05/26/2014 20:53 th0rex#10
Quote:
Originally Posted by *DerMetzger* View Post
Die paar Zeilen Code kann man einfügen ^^ dann is das genauso schnell.
Wieso Einfach wenn es auch Schwer geht?
Weil es dann Aufgabe des Frameworks ist das richtig hin zu bekommen und das Framework kann es zu 99% besser ( sicherer, schneller).
05/26/2014 23:14 Logtetsch#11
Quote:
Originally Posted by omitma View Post
Weil es dann Aufgabe des Frameworks ist das richtig hin zu bekommen und das Framework kann es zu 99% besser ( sicherer, schneller).
Quote:
Originally Posted by msdn
A process can be associated with only one console, so the AllocConsole function fails if the calling process already has a console. A process can use the FreeConsole function to detach itself from its current console, then it can call AllocConsole to create a new console or AttachConsole to attach to another console.
If the calling process creates a child process, the child inherits the new console.
.
05/27/2014 06:17 th0rex#12
In dem Tut geht es darum eine Konsole zu erstellen, falls du es mitbekommen hast. Das mit dem Framework bezog sich darauf eben nur diese eine Konsole zu erstellen. Das es nur eine Konsole geben kann ist eigentlich logisch. Aber mit ein paar Tricks kann ein Prozess in 2 Konsolen loggen. Nur die 2. Konsole gehört dann nicht dem Prozess der loggt.
05/27/2014 07:42 Mostey#13
Quote:
Originally Posted by snow911 View Post
Hm hm, was macht das hier eigentlich? :confused:

Code:
<DllImport("kernel32", SetLastError:=True)> _
Private Shared Function AllocConsole() As Boolean
End Function
<DllImport("kernel32", SetLastError:=True)> _
Private Shared Function FreeConsole() As Boolean
End Function
Muss muss ich dieses FreeConsole() verwenden? Und warum geht jetzt plötzlich Console.WriteLine? Warum weiß das Programm, dass alles auf diese AllocConsole() Konsole da ausgegeben werden soll?
Damit importierst du Funktionen aus der kernel32.dll, das braucht C# nunmal wenn es um WinAPI Funktionen geht, da diese nicht im Framework vorhanden sind.

Console.WriteLine geht immer, du siehst halt nur nichts wenn keine Konsole da ist. (Wer hätte es gedacht :rolleyes:)

Das Programm weiß nicht, das es alles auf der Konsole ausgeben soll, es schreibt einfach in irgendeinen Datenstrom (weiß ich jetzt auch nicht genauer, sorry) und die Konsole liest den und gibt den wieder. Wo keine Konsole, da keine Ausgabe.

Quote:
Originally Posted by omitma View Post
Das es nur eine Konsole geben kann ist eigentlich logisch.
Wieso? Ich finde das nicht logisch, schließlich kann es auch mehrere Fenster zu einem Prozess geben. Sag's mir wenn ich das Offensichtliche übersehen habe. :confused:
05/27/2014 12:46 th0rex#14
Es gibt nur ein standart Output und ein standart Input (stdout, stdin). Heißt printf/cout schreiben nur zu dem einen Stream. Es könnte bestimmt auch möglich sein das irgendwie anders zu machen, dass man 2 Konsolen nutzen kann. Aber dann müsste Microsoft das implementieren und die entsprechend Funktionen bereitstellen.
05/27/2014 12:57 Mostey#15
Quote:
Originally Posted by omitma View Post
Es gibt nur ein standart Output und ein standart Input (stdout, stdin). Heißt printf/cout schreiben nur zu dem einen Stream. Es könnte bestimmt auch möglich sein das irgendwie anders zu machen, dass man 2 Konsolen nutzen kann. Aber dann müsste Microsoft das implementieren und die entsprechend Funktionen bereitstellen.
Macht ja Sinn aber wieso sollte es dann nur eine Konsole geben können? Schließlich kann der Stream ja auch von mehreren Konsolen gelesen werden, es würde eben nur immer das selbe in der Konsole stehen.