VB 5/6-Tipp 0342: Konsolenfenster in VB einbinden
von Dominik Weber
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: | Verwendete API-Aufrufe: AllocConsole, FreeConsole, GetStdHandle, ReadConsoleA (ReadConsole), SetConsoleMode, SetConsoleTextAttribute, SetConsoleTitleA (SetConsoleTitle), WriteConsoleA (WriteConsole) | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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