Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0342: Konsolenfenster in VB einbinden

 von 

Beschreibung 

Dieser originelle Tipp von Dominik gestattet es ein Konsolenfenster derart einzubinden, dass in ihm von VB aus mittels einer Art Print-Anweisung Ausgaben, aber auch zeilenweise Eingaben, möglich sind. Zudem werden kleinere Gestaltungsmöglichkeit in Bezug auf Farben und Titel geboten.

Update von Florian Rittmeier am 01. September 04: Die API-Deklarationen wurden überarbeitet.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

AllocConsole, FreeConsole, GetStdHandle, ReadConsoleA (ReadConsole), SetConsoleMode, SetConsoleTextAttribute, SetConsoleTitleA (SetConsoleTitle), WriteConsoleA (WriteConsole)

Download:

Download des Beispielprojektes [2,72 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Rahmensteuerelement "Frame1"
' Steuerelement: Schaltfläche "Command1" auf Frame1
' Steuerelement: Beschriftungsfeld "Label1" auf Frame1


'Autor: Dominik Weber
'E-Mail: freund2001@gmx.de

Option Explicit

Private Declare Function AllocConsole Lib "kernel32" () As Long

Private Declare Function FreeConsole Lib "kernel32" () As Long

Private Declare Function GetStdHandle Lib "kernel32" _
        (ByVal nStdHandle As Long) As Long

Private Declare Function ReadConsole Lib "kernel32" Alias _
        "ReadConsoleA" (ByVal hConsoleInput As Long, ByVal _
        lpBuffer As String, ByVal nNumberOfCharsToRead As Long, _
        ByRef lpNumberOfCharsRead As Long, lpReserved As Long) As Long

Private Declare Function SetConsoleMode Lib "kernel32" (ByVal _
        hConsoleOutput As Long, dwMode As Long) As Long

Private Declare Function SetConsoleTextAttribute Lib "kernel32" _
        (ByVal hConsoleOutput As Long, ByVal wAttributes As Long) _
        As Long

Private Declare Function SetConsoleTitle Lib "kernel32" Alias _
        "SetConsoleTitleA" (ByVal lpConsoleTitle As String) _
        As Long

Private Declare Function WriteConsole Lib "kernel32" Alias _
        "WriteConsoleA" (ByVal hConsoleOutput As Long, ByVal _
        lpBuffer As Any, ByVal nNumberOfCharsToWrite As Long, _
        ByRef lpNumberOfCharsWritten As Long, lpReserved As Long) As Long

Private Const STD_INPUT_HANDLE As Long = -10&
Private Const STD_OUTPUT_HANDLE As Long = -11&
Private Const STD_ERROR_HANDLE As Long = -12&

Private Const FOREGROUND_BLUE As Long = &H1&
Private Const FOREGROUND_GREEN As Long = &H2&
Private Const FOREGROUND_RED As Long = &H4&
Private Const FOREGROUND_INTENSITY As Long = &H8&
Private Const BACKGROUND_BLUE As Long = &H10&
Private Const BACKGROUND_GREEN As Long = &H20&
Private Const BACKGROUND_RED As Long = &H40&
Private Const BACKGROUND_INTENSITY As Long = &H80&

Private Const ENABLE_LINE_INPUT As Long = &H2&
Private Const ENABLE_ECHO_INPUT As Long = &H4&
Private Const ENABLE_MOUSE_INPUT As Long = &H10&
Private Const ENABLE_PROCESSED_INPUT As Long = &H1&
Private Const ENABLE_WINDOW_INPUT As Long = &H8&

Private Const ENABLE_PROCESSED_OUTPUT As Long = &H1&
Private Const ENABLE_WRAP_AT_EOL_OUTPUT As Long = &H2&

Private hConsoleIn As Long
Private hConsoleOut As Long
Private hConsoleErr As Long

Private Sub Command1_Click()
    Dim aa As String
    
    aa = CreateConsole
    Call MsgBox("Sie haben '" & aa & "' eingegeben!")
End Sub

Private Function CreateConsole() As String
    Dim szUserInput As String
    
    Call AllocConsole
    Call SetConsoleTitle("VB Console")
    
    hConsoleIn = GetStdHandle(STD_INPUT_HANDLE)
    hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE)
    hConsoleErr = GetStdHandle(STD_ERROR_HANDLE)
        
    Call SetConsoleTextAttribute(hConsoleOut, FOREGROUND_RED Or _
            FOREGROUND_GREEN Or FOREGROUND_BLUE Or _
            FOREGROUND_INTENSITY Or BACKGROUND_BLUE)
    
    Call ConsolePrint("VB Konsole" & vbCrLf)
    Call SetConsoleTextAttribute(hConsoleOut, FOREGROUND_RED Or _
            FOREGROUND_GREEN Or FOREGROUND_BLUE)
                                 
    Call ConsolePrint("Gebe hier Deinen Namen ein: ")
        
    szUserInput = ConsoleRead()
    If Not szUserInput = vbNullString Then
        Call ConsolePrint("Hallo, " & szUserInput & "!" & vbCrLf)
    Else
        Call ConsolePrint("Hallo, wer immer Du auch bist!" & vbCrLf)
    End If
        
    Call ConsolePrint("Betaetigen Sie Enter um die " & _
                      "VB-Konsole zu schliessen")
    
    Call ConsoleRead
    Call FreeConsole
    CreateConsole = szUserInput
End Function

Private Sub ConsolePrint(szOut As String)
    Dim BytesWritten As Long
    
    Call WriteConsole(hConsoleOut, szOut, Len(szOut), BytesWritten, 0&)
End Sub

Private Function ConsoleRead() As String
    Dim sUserInput As String * 256
    Dim BytesRead As Long
    
    Call ReadConsole(hConsoleIn, sUserInput, Len(sUserInput), _
                     BytesRead, 0&)
    
    ' - 2, um vbCrLf abzuschneiden
    ConsoleRead = Left$(sUserInput, BytesRead - 2)
End Function
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 6 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Ulrich am 15.04.2010 um 11:09

Bei mir hat der Tipp funktioniert. Aber es wurde immer ein neues Consolenfenster gestartet. Damit man aus einem Konsolenfenster ein VB-Programm starten kann und dieses dann in das aufrufende Fenster schreiben kann, muss man die EXE noch mit Hilfe des VB-Linkers editieren, und zwar mit

LINK /EDIT /SUBSYSTEM:CONSOLE dateiname.exe

Dies ist leider nirgends dokumentiert. Ich hab's von http://www.tek-tips.com/faqs.cfm?fid=5647

Kommentar von Sven Hensel am 02.06.2008 um 11:11

Man kann den Text einfach löschen, indem man vor dem erneuten Schreiben das Shell-Kommando "cls" ausführt.

Kommentar von Sven Hensel am 29.05.2008 um 10:42

Und wie kann man den Text wieder löschen, der in die Konsole geschrieben wurde?

Kommentar von lars friedrich am 21.09.2006 um 12:12

Hi!
Es bleibt nicht nur das Problem, das Sebastian Woelki erklärt hat: warum stürzt VB ab, wenn man die Konsole mit dem X rechts oben schließ?
mfg friedl

Kommentar von Sebastian Woelki am 25.07.2006 um 21:10

Hallo,

der Artikel ist nicht schlecht, jedoch bleibt ein Problem bestehen:

Versucht man den in die Textconsole geschriebenen Text mit > in eine Textdatei umzuleiten, so bleibt diese leer.

Mit freundlichen Grüsse

Kommentar von Michel Laos Chatten am 13.06.2002 um 00:48

I need information about AttachConsole.
Your SITE is the Best