Code: Alles auswählen
; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=2577&highlight=
; Author: NoOneKnows
; Date: 17. October 2003
; Translated to PB4.0 by: leonhard
;/***************************************************/;
;/** Xtended Console Version 1.1.0 **/;
;/** (c) 2003 by NoOneKnows <NoOneKnows@Gmx.de> **/;
;/***************************************************/;
#XTENDEDCONSOLE_MAXINPUTCHARS = 400
#XTENDEDCONSOLE_LIBRARY = 900
Global gStdOut.l
Global gStdIn.l
Structure COORDEX
StructureUnion
Value.l
coord.COORD
EndStructureUnion
EndStructure
Structure INPUT_RECORD
wEventType.w
StructureUnion
KeyEvent.KEY_EVENT_RECORD
MouseEvent.MOUSE_EVENT_RECORD
WindowBufferSizeEvent.WINDOW_BUFFER_SIZE_RECORD
MenuEvent.MENU_EVENT_RECORD
FocusEvent.FOCUS_EVENT_RECORD
EndStructureUnion
EndStructure
#CONSOLE_FULLSCREEN_MODE = 1 ; Vollbild-Konsole
#CONSOLE_WINDOWED_MODE = 2 ; Windows-Fester-Konsole
Prototype.b SetConsoleDisplayMode(hConsoleOutput.l, dwFlags.l, *lpNewScreenBufferDimensions.COORD)
OpenLibrary(1, "kernel32.dll")
Global SetConsoleDisplayMode.SetConsoleDisplayMode = GetFunction(1, "SetConsoleDisplayMode")
;-Allgemeines
;* alle Funktionen die mit "Ex" enden haben die gleiche Funktionalität wie
; die originalen PureBasic funktionen...
;* bei Vergrößerung der Konsole kann diese niemals größer werden als ihr Buffer
;* größter Vorteil dieser manuellen Konsole ist, das sie scrollbar ist im
; Gegensatz zur PureBasic-StandardKonsole
;* hiermit lassen sich auch mehr 80 Zeichen per Input einlesen,
; also auch Zeilenübergreifend (evtl. MAXINPUTCHARS anpassen)
;-Funktions-Beschreibung
Declare PrintNEx(text$)
;siehe PureBasic-Hilfe
Declare PrintEx(text$)
;siehe PureBasic-Hilfe
Declare.l OpenConsoleEx()
;siehe PureBasic-Hilfe. Das AllocConsole_() kann in der Funktion durch
;OpenConsole() ersetzt werden. Dadurch funktionieren auch die
;PureBasic-Standardfunktionen kann unter Umständen aber zu Problemen führen
Declare.s InputN()
;siehe PureBasic-Hilfe, jedoch mit dem Zusatz, das ein Zeilenumbruch stattfindet
Declare.s InputEx()
;siehe PureBasic-Hilfe
Declare.s InkeyEx()
;siehe PureBasic-Hilfe
Declare GetConsoleWindowPosition(*rect.RECT)
;gibt die Position des Konsolen-Fensters als RECT referenziert zurück
Declare.l GetConsoleWindowCharSize(*windowSize.COORD)
;gibt referenziert die größe des Fensters der Konsole in Konsolen-Zeichen an
Declare.l GetConsoleWindowCharArea(*windowArea.SMALL_RECT)
;gibt referenziert den aktuellen Ausschnitt der Konsole in Konsolen-Zeichen an
Declare.s GetConsoleTitle()
;gibt den ConsolenTitel zurück
Declare.l GetConsoleCursorLocation(*cursorPos.COORD)
;gibt die Position des Cursors als COORD referenziert zurück
Declare.w GetCursorY()
;gibt die Y-Position des Cursors zurück
Declare.w GetCursorX()
;gibt die X-Position des Cursors zurück
Declare ConsoleWindowSize(width.l, height.l)
;ändert die Breite und die Höhe der Konsole (Angabe in Pixel)
Declare ConsoleWindowShow()
;holt das Fenster aus dem minimierten Zustand zurück und zeigt es an
Declare ConsoleWindowPosition(x.l, y.l, width.l, height.l)
;ändert Position und Größe der Konsole (Angabe in Pixel)
Declare ConsoleWindowOnTop()
;das Konsolenfenster wird in den Vordergrund gerückt
Declare ConsoleWindowMove(x.l, y.l)
;ändert die X(Y-Position des Konsolenfensters (Angabe in Pixel)
Declare ConsoleWindowMaximize()
;maximiert die Konsole entsprechend der Buffer- bzw. Bildschirmgröße.
;ist der Bildschirm größer als der Buffer, so gilt der Buffer als Maß,
;andernfalls der Bildschirm
Declare ConsoleWindowCharSize(characterWidth.l, characterHeight.l)
;#ndert die Breite und Höhe der Konsole (Angabe in Konsolen-Zeichen)
Declare ConsoleTitleEx(title$)
;siehe PureBasic-Hilfe
Declare ConsoleMoveLocation(x.l, y.l)
;bewegt den Cursor relativ zur aktuellen Position
Declare ConsoleLocateEx(x.l, y.l)
;siehe PureBasic-Hilfe
Declare ConsoleFullScreen(fullscreen.b)
;setzt die Konsole in den Fullscreen-Modus.
;da die Funtkion von Microsoft aus net dokumentiert ist, weiß ich nicht
;ob sie wirklich von alle Windows-Betriebssystemen unterstützt wird
;1 ist fullscreen an und 0 bedeutetd fullscrenn aus
Declare ConsoleFlash(times.l)
;lässt die Konsole ein paar mal aufblinken (je nach times)
Declare ConsoleCursorEx(height.l)
;siehe PureBasic-Hilfe
Declare ConsoleColorBuffer(characterColor.l, backgroundColor.l)
;färbt die gesamte Konsole mit einschlißlich dem gesamten Buffer
;in der angegebenen Farbkombination
Declare ConsoleColorEx(characterColor.l, backgroundColor.l)
;siehe PureBasic-Hilfe
Declare ConsoleBufferSize(characterWidth.l, characterHeight.l)
;legt die Größe des Buffers fest (Angabe in Konsolen-Zeichen)
Declare CloseConsoleEx()
;siehe PureBasic-Hilfe
Declare ClearConsoleEx()
;siehe PureBasic-Hilfe
;nur intern
Declare.l GetConsoleWindowHandle()
Declare GetColorValue(foreColor.l, backColor.l)
Declare.l GetConsoleLocationDirect()
Declare FlashConsoleWindow(hwnd.l)
;-Intern Funktionen
Procedure FlashConsoleWindow(hwnd.l)
Shared sharedTimes.l
For J.l = 1 To sharedTimes
FlashWindow_(hwnd, 1)
Delay(1500)
Next J
EndProcedure
Procedure.l GetConsoleLocationDirect()
consoleInfo.CONSOLE_SCREEN_BUFFER_INFO
GetConsoleScreenBufferInfo_(gStdOut, @consoleInfo)
ProcedureReturn consoleInfo\dwCursorPosition\x + consoleInfo\dwCursorPosition\y * 65536
EndProcedure
Procedure GetColorValue(foreColor.l, backColor.l)
Select foreColor
Case 0
foreColor = 0
Case 1
foreColor = #FOREGROUND_BLUE
Case 2
foreColor = #FOREGROUND_GREEN
Case 3
foreColor = #FOREGROUND_GREEN | #FOREGROUND_BLUE
Case 4
foreColor = #FOREGROUND_RED
Case 5
foreColor = #FOREGROUND_RED | #FOREGROUND_BLUE
Case 6
foreColor = #FOREGROUND_RED | #FOREGROUND_GREEN
Case 7
foreColor = #FOREGROUND_RED | #FOREGROUND_GREEN | #FOREGROUND_BLUE
Case 8
foreColor = #FOREGROUND_INTENSITY
Case 9
foreColor = #FOREGROUND_BLUE | #FOREGROUND_INTENSITY
Case 10
foreColor = #FOREGROUND_GREEN | #FOREGROUND_INTENSITY
Case 11
foreColor = #FOREGROUND_GREEN | #FOREGROUND_BLUE | #FOREGROUND_INTENSITY
Case 12
foreColor = #FOREGROUND_RED | #FOREGROUND_INTENSITY
Case 13
foreColor = #FOREGROUND_RED | #FOREGROUND_BLUE | #FOREGROUND_INTENSITY
Case 14
foreColor = #FOREGROUND_RED | #FOREGROUND_GREEN | #FOREGROUND_INTENSITY
Case 15
foreColor = #FOREGROUND_RED | #FOREGROUND_GREEN | #FOREGROUND_BLUE | #FOREGROUND_INTENSITY
EndSelect
Select backColor
Case 0
backColor = 0
Case 1
backColor = #BACKGROUND_BLUE
Case 2
backColor = #BACKGROUND_GREEN
Case 3
backColor = #BACKGROUND_GREEN | #BACKGROUND_BLUE
Case 4
backColor = #BACKGROUND_RED
Case 5
backColor = #BACKGROUND_RED | #BACKGROUND_BLUE
Case 6
backColor = #BACKGROUND_RED | #BACKGROUND_GREEN
Case 7
backColor = #BACKGROUND_RED | #BACKGROUND_GREEN | #BACKGROUND_BLUE
Case 8
backColor = #BACKGROUND_INTENSITY
Case 9
backColor = #BACKGROUND_BLUE | #BACKGROUND_INTENSITY
Case 10
backColor = #BACKGROUND_GREEN | #BACKGROUND_INTENSITY
Case 11
backColor = #BACKGROUND_GREEN | #BACKGROUND_BLUE | #BACKGROUND_INTENSITY
Case 12
backColor = #BACKGROUND_RED | #BACKGROUND_INTENSITY
Case 13
backColor = #BACKGROUND_RED | #BACKGROUND_BLUE | #BACKGROUND_INTENSITY
Case 14
backColor = #BACKGROUND_RED | #BACKGROUND_GREEN | #BACKGROUND_INTENSITY
Case 15
backColor = #BACKGROUND_RED | #BACKGROUND_GREEN | #BACKGROUND_BLUE | #BACKGROUND_INTENSITY
EndSelect
ProcedureReturn foreColor | backColor
EndProcedure
Procedure.l GetConsoleWindowHandle()
If OSVersion() = #PB_OS_Windows_2000 Or OSVersion() = #PB_OS_Windows_XP
OpenLibrary(#XTENDEDCONSOLE_LIBRARY, "kernel32.dll")
hwnd = CallFunction(#XTENDEDCONSOLE_LIBRARY, "GetConsoleWindow")
CloseLibrary(#XTENDEDCONSOLE_LIBRARY)
ProcedureReturn hwnd
Else
title$ = GetConsoleTitle()
currentProcessID.l = GetCurrentProcessId_()
hwnd.l = FindWindow_(#Null, title$)
GetWindowThreadProcessId_(hwnd, @processID.l)
If processID = currentProcessID
ProcedureReturn hwnd
Else
first.l = GetWindow_(hwnd, #GW_HWNDFIRST)
GetWindowThreadProcessId_(first, @processID.l)
If processID = currentProcessID
Debug first
ProcedureReturn first
EndIf
hwnd = first
Repeat
hwnd = GetWindow_(hwnd, #GW_HWNDNEXT)
GetWindowThreadProcessId_(first, @processID.l)
If processID = currentProcessID
Debug hwnd
ProcedureReturn hwnd
EndIf
Until hwnd = first Or hwnd = 0
EndIf
EndIf
ProcedureReturn 0
EndProcedure
;-Externe Funktionen
Procedure ClearConsoleEx()
consoleInfo.CONSOLE_SCREEN_BUFFER_INFO
GetConsoleScreenBufferInfo_(gStdOut, @consoleInfo)
size.l = consoleInfo\dwSize\x * consoleInfo\dwSize\y
FillConsoleOutputCharacter_(gStdOut, 32, size, #Null, @written.l)
GetConsoleScreenBufferInfo_(gStdOut, @consoleInfo)
size.l = consoleInfo\dwSize\x * consoleInfo\dwSize\y
FillConsoleOutputAttribute_(gStdOut, consoleInfo\wAttributes, size, #Null, @written.l)
SetConsoleCursorPosition_(gStdOut, #Null)
EndProcedure
Procedure CloseConsoleEx()
CloseHandle_(gStdOut)
CloseHandle_(gStdIn)
FreeConsole_()
EndProcedure
Procedure ConsoleBufferSize(characterWidth.l, characterHeight.l)
GetConsoleScreenBufferInfo_(gStdOut, @consoleInfo.CONSOLE_SCREEN_BUFFER_INFO)
Debug consoleInfo\dwSize\x
Debug consoleInfo\dwSize\y
If characterWidth < consoleInfo\dwSize\x Or characterHeight < consoleInfo\dwSize\y
rect.SMALL_RECT
If characterWidth < 13 ;kleinere Buzffer-Breite geht scheinbar net
rect\right = 13 - 1
characterWidth = 13
ElseIf characterWidth < consoleInfo\dwSize\x
rect\right = characterWidth - 1
Else
rect\right = consoleInfo\dwSize\x - 1
EndIf
If characterHeight <= 0
rect\bottom = 1 - 1
characterHeight = 1
ElseIf characterHeight < consoleInfo\dwSize\y
rect\bottom = characterHeight - 1
Else
rect\bottom = consoleInfo\dwSize\y - 1
EndIf
Debug rect\right
Debug rect\bottom
SetConsoleWindowInfo_(gStdOut, 1, @rect)
EndIf
SetConsoleScreenBufferSize_(gStdOut, characterWidth + (65536 * characterHeight))
EndProcedure
Procedure ConsoleColorEx(characterColor.l, backgroundColor.l)
SetConsoleTextAttribute_(gStdOut, GetColorValue(characterColor, backgroundColor))
EndProcedure
Procedure ConsoleColorBuffer(characterColor.l, backgroundColor.l)
GetConsoleScreenBufferInfo_(gStdOut, @consoleInfo.CONSOLE_SCREEN_BUFFER_INFO)
size.l = consoleInfo\dwSize\x * consoleInfo\dwSize\y
consoleInfo\wAttributes = GetColorValue(characterColor, backgroundColor)
FillConsoleOutputAttribute_(gStdOut, consoleInfo\wAttributes, size, #Null, @written.l)
EndProcedure
Procedure ConsoleCursorEx(height.l)
cursorInfo.CONSOLE_CURSOR_INFO
If height <= 0
cursorInfo\bVisible = 0
height = 1
ElseIf height > 10
cursorInfo\bVisible = 1
height = 10
Else
cursorInfo\bVisible = 1
EndIf
cursorInfo\dwSize = height * 10
SetConsoleCursorInfo_(gStdOut, @cursorInfo)
EndProcedure
Procedure ConsoleFlash(times.l)
Shared sharedTimes.l
hwnd.l = GetConsoleWindowHandle()
If hwnd
If times <= 1
FlashWindow_(hwnd, 1)
Else
sharedTimes = times
CreateThread(@FlashConsoleWindow(), hwnd)
EndIf
EndIf
EndProcedure
Procedure ConsoleFullScreen(fullscreen.b)
If fullscreen
SetConsoleDisplayMode(gStdOut, 1, @oldMode.l)
Else
SetConsoleDisplayMode(gStdOut, 0, @oldMode.l)
EndIf
EndProcedure
Procedure ConsoleLocateEx(x.l, y.l)
SetConsoleCursorPosition_(gStdOut, x + (65536 * y))
EndProcedure
Procedure ConsoleMoveLocation(x.l, y.l)
GetConsoleCursorLocation(@cursorPos.COORD)
SetConsoleCursorPosition_(gStdOut, (cursorPos\x + x) + (65536 * (cursorPos\y + y)))
EndProcedure
Procedure ConsoleTitleEx(title$)
SetConsoleTitle_(title$)
EndProcedure
Procedure ConsoleWindowCharSize(characterWidth.l, characterHeight.l)
consoleInfo.CONSOLE_SCREEN_BUFFER_INFO
GetConsoleScreenBufferInfo_(gStdOut, @consoleInfo)
rect.SMALL_RECT
rect\bottom = characterHeight - 1
rect\right = characterWidth - 1
If rect\bottom > consoleInfo\dwSize\y
rect\bottom = consoleInfo\dwSize\y - 1
EndIf
If rect\right > consoleInfo\dwSize\x
rect\right = consoleInfo\dwSize\x - 1
EndIf
SetConsoleWindowInfo_(gStdOut, 1, @rect)
EndProcedure
Procedure ConsoleWindowMaximize()
maxSize.COORDEX\Value = GetLargestConsoleWindowSize_(gStdOut)
ConsoleWindowCharSize(maxSize\coord\x, maxSize\coord\y)
EndProcedure
Procedure ConsoleWindowMinimize()
hwnd.l = GetConsoleWindowHandle()
If hwnd
ShowWindow_(hwnd, #SW_MINIMIZE)
EndIf
EndProcedure
Procedure ConsoleWindowMove(x.l, y.l)
hwnd.l = GetConsoleWindowHandle()
If hwnd
SetWindowPos_(hwnd, 0, x, y, 0, 0, #SWP_NOSIZE)
EndIf
EndProcedure
Procedure ConsoleWindowOnTop()
hwnd.l = GetConsoleWindowHandle()
If hwnd
SetWindowPos_(hwnd, #HWND_TOP, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE | #SWP_SHOWWINDOW)
EndIf
EndProcedure
Procedure ConsoleWindowPosition(x.l, y.l, width.l, height.l)
hwnd.l = GetConsoleWindowHandle()
If hwnd
MoveWindow_(hwnd, x, y, width, height, 1)
EndIf
EndProcedure
Procedure ConsoleWindowShow()
hwnd.l = GetConsoleWindowHandle()
If hwnd
ShowWindow_(hwnd, #SW_SHOWNORMAL)
EndIf
EndProcedure
Procedure ConsoleWindowSize(width.l, height.l)
hwnd.l = GetConsoleWindowHandle()
If hwnd
SetWindowPos_(hwnd, #HWND_TOP, 0, 0, width, height, #SWP_NOMOVE)
EndIf
EndProcedure
Procedure.l GetConsoleCursorLocation(*cursorPos.COORD)
consoleInfo.CONSOLE_SCREEN_BUFFER_INFO
GetConsoleScreenBufferInfo_(gStdOut, @consoleInfo)
*cursorPos\x = consoleInfo\dwCursorPosition\x
*cursorPos\y = consoleInfo\dwCursorPosition\y
EndProcedure
Procedure.s GetConsoleTitle()
title$ = LSet("", 150, Chr(0))
GetConsoleTitle_(@title$, 150)
ProcedureReturn title$
EndProcedure
Procedure.l GetConsoleWindowCharArea(*windowArea.SMALL_RECT)
consoleInfo.CONSOLE_SCREEN_BUFFER_INFO
GetConsoleScreenBufferInfo_(gStdOut, @consoleInfo)
CopyMemory(consoleInfo\srWindow, *windowArea, 8)
EndProcedure
Procedure.l GetConsoleWindowCharSize(*windowSize.COORD)
consoleInfo.CONSOLE_SCREEN_BUFFER_INFO
GetConsoleScreenBufferInfo_(gStdOut, @consoleInfo)
CopyMemory(consoleInfo\dwSize, *windowSize, 8)
EndProcedure
Procedure GetConsoleWindowPosition(*rect.RECT)
hwnd = GetConsoleWindowHandle()
If hwnd
placement.WINDOWPLACEMENT\Length = SizeOf(WINDOWPLACEMENT)
GetWindowPlacement_(hwnd, @placement)
CopyMemory(@placement\rcNormalPosition, *rect, 16)
EndIf
EndProcedure
Procedure.w GetCursorX()
consoleInfo.CONSOLE_SCREEN_BUFFER_INFO
GetConsoleScreenBufferInfo_(gStdOut, @consoleInfo)
ProcedureReturn consoleInfo\dwCursorPosition\x
EndProcedure
Procedure.w GetCursorY()
consoleInfo.CONSOLE_SCREEN_BUFFER_INFO
GetConsoleScreenBufferInfo_(gStdOut, @consoleInfo)
ProcedureReturn consoleInfo\dwCursorPosition\y
EndProcedure
Procedure.s InkeyEx()
inputRecord.INPUT_RECORD
PeekConsoleInput_(gStdIn, @inputRecord, 1, @readed.l)
If inputRecord\wEventType = #KEY_EVENT
ReadConsoleInput_(gStdIn, @inputRecord, 1, @readed.l)
If PeekB(@inputRecord\KeyEvent\bKeyDown + 2)
Char.b = (inputRecord\KeyEvent\wVirtualScanCode | inputRecord\KeyEvent\dwControlKeyState) & inputRecord\KeyEvent\dwControlKeyState
;aus Kompatibilität zu PureBasic-Inkey()
If Char = 0 : Char = 255 : EndIf
ProcedureReturn Chr(Char) + Chr(inputRecord\KeyEvent\uChar)
EndIf
ElseIf inputRecord\wEventType > 0
ReadConsoleInput_(gStdIn, @inputRecord, 1, @readed.l)
EndIf
ProcedureReturn ""
EndProcedure
Procedure.s InputEx()
GetConsoleCursorLocation(@cursorPos.COORD)
GetConsoleScreenBufferInfo_(gStdOut, @consoleInfo.CONSOLE_SCREEN_BUFFER_INFO)
inputBuffer$ = LSet("", #XTENDEDCONSOLE_MAXINPUTCHARS, Chr(0))
ReadConsole_(gStdIn, @inputBuffer$, #XTENDEDCONSOLE_MAXINPUTCHARS, @readed.l, #Null)
;CRLF nicht zurückgeben
If Mid(inputBuffer$, readed, 1) = Chr(10)
readed - 1
EndIf
If Mid(inputBuffer$, readed, 1) = Chr(13)
readed - 1
EndIf
y.l = cursorPos\y + (cursorPos\x + readed) / consoleInfo\dwSize\x
x.l = (cursorPos\x + readed) % consoleInfo\dwSize\x
ConsoleLocateEx(x, y)
ProcedureReturn Left(inputBuffer$, readed)
EndProcedure
Procedure.s InputN()
inputBuffer$ = LSet("", #XTENDEDCONSOLE_MAXINPUTCHARS, Chr(0))
ReadConsole_(gStdIn, @inputBuffer$, #XTENDEDCONSOLE_MAXINPUTCHARS, @readed.l, #Null)
;CRLF nicht zurückgeben
If Mid(inputBuffer$, readed, 1) = Chr(10)
readed - 1
EndIf
If Mid(inputBuffer$, readed, 1) = Chr(13)
readed - 1
EndIf
ProcedureReturn Left(inputBuffer$, readed)
EndProcedure
Procedure.l OpenConsoleEx()
AllocConsole_()
;Alternativ auch möglich um die Standardfunktionen zu nutzen
;kann jedoch zu verschiedenen Fehlern führen
;OpenConsole()
gStdOut.l = GetStdHandle_(#STD_OUTPUT_HANDLE)
gStdIn.l = GetStdHandle_(#STD_INPUT_HANDLE)
If gStdIn = #INVALID_HANDLE_VALUE Or gStdOut = #INVALID_HANDLE_VALUE
ProcedureReturn 0
Else
ProcedureReturn 1
EndIf
EndProcedure
Procedure PrintEx(text$)
WriteConsole_(gStdOut, @text$, Len(text$), @written.l, #Null)
EndProcedure
Procedure PrintNEx(text$)
text$ + Chr(13) + Chr(10)
WriteConsole_(gStdOut, @text$, Len(text$), @written.l, #Null)
EndProcedure
; ExecutableFormat=Windows
; EOF