jhpjhp a fait cette console qui marche bien chez moi.
Code : Tout sélectionner
Structure CONSOLE_HANDLES
hStdInput.l
hStdOutput.l
hStdError.l
EndStructure
Structure CONSOLE_FONT_INFO
nFont.l
dwFontSize.COORD
EndStructure
Global altHandle.CONSOLE_HANDLES
Global cmdHandle.CONSOLE_HANDLES
Global ascRawKey.c
Prototype protoGetConsoleWindow()
Prototype protoAttachConsole(dwProcessId)
Procedure ShowConsole(State = 1)
If State < 0 : State = 1 : EndIf
If State > 3 : State = 1 : EndIf
Protected GetConsoleWindow.protoGetConsoleWindow
kernel32 = OpenLibrary(#PB_Any, "kernel32.dll")
If IsLibrary(kernel32)
GetConsoleWindow = GetFunction(kernel32, "GetConsoleWindow")
hConsole = GetConsoleWindow()
ShowWindow_(hConsole, State)
CloseLibrary(kernel32)
EndIf
EndProcedure
Procedure BringWindowToTop(hWnd)
ForeThread = GetWindowThreadProcessId_(GetForegroundWindow_(), #Null)
AppThread = GetCurrentThreadId_()
If ForeThread <> AppThread
AttachThreadInput_(ForeThread, AppThread, #True)
BringWindowToTop_(hWnd)
ShowWindow_(hWnd, #SW_SHOW)
AttachThreadInput_(ForeThread, AppThread, #False)
Else
BringWindowToTop_(hWnd)
ShowWindow_(hWnd, #SW_SHOW)
EndIf
EndProcedure
Procedure.w GetColors(CharacterColor, BackgroundColor)
wAttribute.w = #Null
Select CharacterColor
Case 0
Case 1 : wAttribute = #FOREGROUND_BLUE
Case 2 : wAttribute = #FOREGROUND_GREEN
Case 3 : wAttribute = #FOREGROUND_BLUE | #FOREGROUND_GREEN
Case 4 : wAttribute = #FOREGROUND_RED
Case 5 : wAttribute = #FOREGROUND_RED | #FOREGROUND_BLUE
Case 6 : wAttribute = #FOREGROUND_RED | #FOREGROUND_GREEN
Case 7 : wAttribute = #FOREGROUND_RED | #FOREGROUND_BLUE | #FOREGROUND_GREEN
Case 8 : wAttribute = #FOREGROUND_INTENSITY
Case 9 : wAttribute = #FOREGROUND_BLUE | #FOREGROUND_INTENSITY
Case 10 : wAttribute = #FOREGROUND_GREEN | #FOREGROUND_INTENSITY
Case 11 : wAttribute = #FOREGROUND_BLUE | #FOREGROUND_GREEN | #FOREGROUND_INTENSITY
Case 12 : wAttribute = #FOREGROUND_RED | #FOREGROUND_INTENSITY
Case 13 : wAttribute = #FOREGROUND_RED | #FOREGROUND_BLUE | #FOREGROUND_INTENSITY
Case 14 : wAttribute = #FOREGROUND_RED | #FOREGROUND_GREEN | #FOREGROUND_INTENSITY
Case 15 : wAttribute = #FOREGROUND_RED | #FOREGROUND_BLUE | #FOREGROUND_GREEN | #FOREGROUND_INTENSITY
Default : wAttribute = #FOREGROUND_RED | #FOREGROUND_BLUE | #FOREGROUND_GREEN
EndSelect
Select BackgroundColor
Case 1 : wAttribute | #BACKGROUND_BLUE
Case 2 : wAttribute | #BACKGROUND_GREEN
Case 3 : wAttribute | #BACKGROUND_BLUE | #BACKGROUND_GREEN
Case 4 : wAttribute | #BACKGROUND_RED
Case 5 : wAttribute | #BACKGROUND_RED | #BACKGROUND_BLUE
Case 6 : wAttribute | #BACKGROUND_RED | #BACKGROUND_GREEN
Case 7 : wAttribute | #BACKGROUND_RED | #BACKGROUND_BLUE | #BACKGROUND_GREEN
Case 8 : wAttribute | #BACKGROUND_INTENSITY
Case 9 : wAttribute | #BACKGROUND_BLUE | #BACKGROUND_INTENSITY
Case 10 : wAttribute | #BACKGROUND_GREEN | #BACKGROUND_INTENSITY
Case 11 : wAttribute | #BACKGROUND_BLUE | #BACKGROUND_GREEN | #BACKGROUND_INTENSITY
Case 12 : wAttribute | #BACKGROUND_RED | #BACKGROUND_INTENSITY
Case 13 : wAttribute | #BACKGROUND_RED | #BACKGROUND_BLUE | #BACKGROUND_INTENSITY
Case 14 : wAttribute | #BACKGROUND_RED | #BACKGROUND_GREEN | #BACKGROUND_INTENSITY
Case 15 : wAttribute | #BACKGROUND_RED | #BACKGROUND_BLUE | #BACKGROUND_GREEN | #BACKGROUND_INTENSITY
EndSelect
ProcedureReturn wAttribute
EndProcedure
Procedure HandlerRoutine(dwCtrlType)
Select dwCtrlType
Case #CTRL_CLOSE_EVENT
SetConsoleCtrlHandler_(@HandlerRoutine(), #False)
FreeConsole_() : End
EndSelect
ProcedureReturn #True
EndProcedure
Procedure altOpenConsole(State = 1, Title.s = "Alternative Console", xColumn = 80, yRow = 300)
Protected GetConsoleWindow.protoGetConsoleWindow
Result = #False
If AllocConsole_()
If State < 0 : State = 1 : EndIf
If State > 3 : State = 1 : EndIf
SetConsoleTitle_(Title)
altHandle\hStdInput = GetStdHandle_(#STD_INPUT_HANDLE)
altHandle\hStdOutput = GetStdHandle_(#STD_OUTPUT_HANDLE)
altHandle\hStdError = GetStdHandle_(#STD_ERROR_HANDLE)
dwSize.COORD
dwSize\x = xColumn
dwSize\y = yRow
SetConsoleScreenBufferSize_(altHandle\hStdOutput, PeekL(@dwSize))
If State <> 1 : ShowConsole(State) : EndIf
If State = 1 Or State = 3
kernel32 = OpenLibrary(#PB_Any, "kernel32.dll")
If IsLibrary(kernel32)
GetConsoleWindow = GetFunction(kernel32, "GetConsoleWindow")
hConsole = GetConsoleWindow()
BringWindowToTop(hConsole)
CloseLibrary(kernel32)
EndIf
EndIf
SetConsoleCtrlHandler_(@HandlerRoutine(), #True)
Result = #True
EndIf
ProcedureReturn Result
EndProcedure
Procedure altConsoleTitle(Title.s = "Alternative Console")
SetConsoleTitle_(Title)
EndProcedure
Procedure.s altPrint(Text.s = " ", nRepeat = 1)
For rtnCount = 1 To nRepeat
WriteConsole_(altHandle\hStdOutput, Text, Len(Text), @lpNumberOfCharsWritten, #Null)
Next
EndProcedure
Procedure.s altPrintN(Text.s = #Null$, nRepeat = 1)
Text + Chr(10)
For rtnCount = 1 To nRepeat
WriteConsole_(altHandle\hStdOutput, Text, Len(Text), @lpNumberOfCharsWritten, #Null)
Next
EndProcedure
Procedure altFillChar(Character, nLength = 1)
If nLength <= 0 : nLength = 1 : EndIf
lpConsoleScreenBufferInfo.CONSOLE_SCREEN_BUFFER_INFO
If GetConsoleScreenBufferInfo_(altHandle\hStdOutput, @lpConsoleScreenBufferInfo)
dwWriteCoord.COORD
dwWriteCoord\x = lpConsoleScreenBufferInfo\dwCursorPosition\x
dwWriteCoord\y = lpConsoleScreenBufferInfo\dwCursorPosition\y
FillConsoleOutputCharacter_(altHandle\hStdOutput, Character, nLength, PeekL(@dwWriteCoord), @lpNumberOfCharsWritten)
EndIf
EndProcedure
Procedure altFillColor(CharacterColor = 7, BackgroundColor = 0, nLength = 1)
If nLength <= 0 : nLength = 1 : EndIf
wAttribute.w = GetColors(CharacterColor, BackgroundColor)
lpConsoleScreenBufferInfo.CONSOLE_SCREEN_BUFFER_INFO
If GetConsoleScreenBufferInfo_(altHandle\hStdOutput, @lpConsoleScreenBufferInfo)
dwWriteCoord.COORD
dwWriteCoord\x = lpConsoleScreenBufferInfo\dwCursorPosition\x
dwWriteCoord\y = lpConsoleScreenBufferInfo\dwCursorPosition\y
FillConsoleOutputAttribute_(altHandle\hStdOutput, wAttribute, nLength, PeekL(@dwWriteCoord), @lpNumberOfAttrsWritten)
EndIf
EndProcedure
Procedure altConsoleColor(CharacterColor = 7, BackgroundColor = 0, Mode = 0)
If Mode < 0 : Mode = 0 : EndIf
wAttribute.w = GetColors(CharacterColor, BackgroundColor)
If Mode
lpConsoleScreenBufferInfo.CONSOLE_SCREEN_BUFFER_INFO
If GetConsoleScreenBufferInfo_(altHandle\hStdOutput, @lpConsoleScreenBufferInfo)
nLength = lpConsoleScreenBufferInfo\dwSize\x * lpConsoleScreenBufferInfo\dwSize\y
dwCursorPosition.COORD
dwCursorPosition\x = 0
dwCursorPosition\y = 0
FillConsoleOutputAttribute_(altHandle\hStdOutput, wAttribute, nLength, PeekL(@dwCursorPosition), @lpNumberOfAttrsWritten)
EndIf
EndIf
SetConsoleTextAttribute_(altHandle\hStdOutput, wAttribute)
EndProcedure
Procedure altConsoleLocate(xColumn, yRow)
dwCursorPosition.COORD
dwCursorPosition\x = xColumn
dwCursorPosition\y = yRow
SetConsoleCursorPosition_(altHandle\hStdOutput, PeekL(@dwCursorPosition))
EndProcedure
Procedure.s altReadConsoleData(xColumn = 0, yRow = 0, nLength = 0)
Result.s = #Null$
lpConsoleScreenBufferInfo.CONSOLE_SCREEN_BUFFER_INFO
If GetConsoleScreenBufferInfo_(altHandle\hStdOutput, @lpConsoleScreenBufferInfo)
If nLength <= 0 : nLength = lpConsoleScreenBufferInfo\dwSize\x * lpConsoleScreenBufferInfo\dwSize\y : EndIf
nLength * SizeOf(Character)
lpCharacter.s = Space(nLength)
dwReadCoord.COORD
dwReadCoord\x = xColumn
dwReadCoord\y = yRow
ReadConsoleOutputCharacter_(altHandle\hStdOutput, @lpCharacter, nLength, PeekL(@dwReadCoord), @lpNumberOfCharsRead)
lpCharacter = RTrim(lpCharacter)
nLength = lpConsoleScreenBufferInfo\dwSize\x
While xPos < Len(lpCharacter)
Result + RTrim(Mid(lpCharacter, xPos + 1, nLength)) + Chr(10)
xPos + nLength
Wend
Result = Left(Result, Len(Result) - 1)
EndIf
ProcedureReturn Result
EndProcedure
Procedure altClearConsole(xColumn = 0, yRow = 0, nLength = 0)
lpConsoleScreenBufferInfo.CONSOLE_SCREEN_BUFFER_INFO
If GetConsoleScreenBufferInfo_(altHandle\hStdOutput, @lpConsoleScreenBufferInfo)
If nLength <= 0 : nLength = lpConsoleScreenBufferInfo\dwSize\x * lpConsoleScreenBufferInfo\dwSize\y : EndIf
dwCursorPosition.COORD
dwCursorPosition\x = xColumn
dwCursorPosition\y = yRow
FillConsoleOutputCharacter_(altHandle\hStdOutput, Asc(" "), nLength, PeekL(@dwCursorPosition), @lpNumberOfCharsWritten)
FillConsoleOutputAttribute_(altHandle\hStdOutput, #FOREGROUND_RED | #FOREGROUND_BLUE | #FOREGROUND_GREEN, nLength, PeekL(@dwCursorPosition), @lpNumberOfAttrsWritten)
SetConsoleCursorPosition_(altHandle\hStdOutput, PeekL(@dwCursorPosition))
EndIf
EndProcedure
Procedure altNewConsole(State = 99, Title.s = #Null$)
Protected GetConsoleWindow.protoGetConsoleWindow
kernel32 = OpenLibrary(#PB_Any, "kernel32.dll")
If IsLibrary(kernel32)
GetConsoleWindow = GetFunction(kernel32, "GetConsoleWindow")
hConsole = GetConsoleWindow()
If IsWindowVisible_(hConsole)
lpwndpl.WINDOWPLACEMENT
lpwndpl\Length = SizeOf(lpwndpl)
GetWindowPlacement_(hConsole, @lpwndpl)
If State = 99
Select lpwndpl\showCmd
Case 0 : State = 0
Case 1 : State = 1
Case 2 : State = 2
Case 3 : State = 3
Default : State = 1
EndSelect
Else
If State < 0 : State = 1 : EndIf
If State > 3 : State = 1 : EndIf
EndIf
Else
State = 0
EndIf
CloseLibrary(kernel32)
EndIf
If Title = #Null$
Title = Space(#MAX_PATH)
GetConsoleTitle_(@Title, #MAX_PATH)
EndIf
FreeConsole_()
altOpenConsole(State, Title)
EndProcedure
Procedure.s altInkey()
Dim lpBuffer.INPUT_RECORD(1)
nLength = 1 * SizeOf(Character)
PeekConsoleInput_(altHandle\hStdInput, @lpBuffer(), nLength, @lpNumberOfEventsRead)
If lpBuffer(0)\EventType = #KEY_EVENT
If lpBuffer(0)\Event\KeyEvent\uChar > 0
ReadConsoleInput_(altHandle\hStdInput, @lpBuffer(), nLength, @lpNumberOfEventsRead)
If lpBuffer(0)\Event\KeyEvent\bKeyDown
ascRawKey = lpBuffer(0)\Event\KeyEvent\wVirtualKeyCode
ProcedureReturn Chr(ascRawKey)
EndIf
EndIf
ElseIf lpBuffer(0)\EventType
ReadConsoleInput_(altHandle\hStdInput, @lpBuffer(), nLength, @lpNumberOfEventsRead)
EndIf
ProcedureReturn #Null$
EndProcedure
Procedure altRawKey()
If ascRawKey
tmpRawKey.c = ascRawKey
ascRawKey = 0
Else
Dim lpBuffer.INPUT_RECORD(1)
nLength = 1 * SizeOf(Character)
PeekConsoleInput_(altHandle\hStdInput, @lpBuffer(), nLength, @lpNumberOfEventsRead)
If lpBuffer(0)\EventType = #KEY_EVENT
ReadConsoleInput_(altHandle\hStdInput, @lpBuffer(), nLength, @lpNumberOfEventsRead)
If lpBuffer(0)\Event\KeyEvent\bKeyDown
ascRawKey = lpBuffer(0)\Event\KeyEvent\wVirtualKeyCode
tmpRawKey = ascRawKey
EndIf
ElseIf lpBuffer(0)\EventType
ReadConsoleInput_(altHandle\hStdInput, @lpBuffer(), nLength, @lpNumberOfEventsRead)
EndIf
EndIf
ProcedureReturn tmpRawKey
EndProcedure
Procedure altConsoleImage(ImageName.s = #Null$, nDelay = 1000)
UseJPEGImageDecoder() : UsePNGImageDecoder()
lpConsoleCurrentFont.CONSOLE_FONT_INFO
GetCurrentConsoleFont_(altHandle\hStdOutput, #True, @lpConsoleCurrentFont)
FontSize = GetConsoleFontSize_(altHandle\hStdOutput, lpConsoleCurrentFont\nFont)
lpConsoleCurrentFont\dwFontSize\x = FontSize & $FFFF
lpConsoleCurrentFont\dwFontSize\y = (FontSize >> 16) & $FFFF
fRatio.d = lpConsoleCurrentFont\dwFontSize\x / lpConsoleCurrentFont\dwFontSize\y
lpConsoleScreenBufferInfo.CONSOLE_SCREEN_BUFFER_INFO
If GetConsoleScreenBufferInfo_(altHandle\hStdOutput, @lpConsoleScreenBufferInfo)
iWidth = lpConsoleScreenBufferInfo\dwSize\x - 1
Dim cArray.s(11) : Define sFactor.d, cImage.s
cArray(0) = "#" : cArray(1) = "@" : cArray(2) = "&" : cArray(3) = "%" : cArray(4) = "=" : cArray(5) = "+"
cArray(6) = "*" : cArray(7) = ":" : cArray(8) = "-" : cArray(9) = "." : cArray(10) = " "
aSize = ArraySize(cArray()) - 1
Select #True
Case Bool(FileSize(ImageName) = -1)
ImageName = OpenFileRequester("Draw Console Image", #PB_Compiler_FilePath + "images\", "Images Files|*.jpg;*.png;*.bmp", 0, #PB_Requester_MultiSelection)
While ImageName
If LCase(Right(ImageName, 4)) = ".jpg" Or LCase(Right(ImageName, 4)) = ".png" Or LCase(Right(ImageName, 4)) = ".bmp"
hImage = LoadImage(#PB_Any, ImageName)
If IsImage(hImage)
tWidth = ImageWidth(hImage)
tHeight = ImageHeight(hImage)
sFactor = iWidth / tWidth
iHeight = (tHeight * sFactor) * fRatio
ResizeImage(hImage, iWidth, iHeight)
cImage = #Null$
If StartDrawing(ImageOutput(hImage))
For yPos = 0 To iHeight - 1
For xPos = 0 To iWidth - 1
pColor = Point(xPos, yPos)
gScale = (Red(pColor) + Green(pColor) + Blue(pColor)) / 3
cIndex = Round(gScale * aSize / 255, #PB_Round_Up)
cImage + cArray(cIndex)
Next
cImage + Chr(10)
Next
StopDrawing()
EndIf
FreeImage(hImage)
altClearConsole()
altPrint(cImage)
altConsoleLocate(0, 0)
Delay(nDelay)
EndIf
EndIf
ImageName = NextSelectedFileName()
Wend
Case Bool(FileSize(ImageName) = -2)
FolderName.s = ImageName
PathAddBackslash_(FolderName)
If ExamineDirectory(0, FolderName, "*.*")
While NextDirectoryEntry(0)
If DirectoryEntryType(0) = #PB_DirectoryEntry_File
ImageName = FolderName + DirectoryEntryName(0)
If LCase(Right(ImageName, 4)) = ".jpg" Or LCase(Right(ImageName, 4)) = ".png" Or LCase(Right(ImageName, 4)) = ".bmp"
hImage = LoadImage(#PB_Any, ImageName)
If IsImage(hImage)
tWidth = ImageWidth(hImage)
tHeight = ImageHeight(hImage)
sFactor = iWidth / tWidth
iHeight = (tHeight * sFactor) * fRatio
ResizeImage(hImage, iWidth, iHeight)
cImage = #Null$
If StartDrawing(ImageOutput(hImage))
For yPos = 0 To iHeight - 1
For xPos = 0 To iWidth - 1
pColor = Point(xPos, yPos)
gScale = (Red(pColor) + Green(pColor) + Blue(pColor)) / 3
cIndex = Round(gScale * aSize / 255, #PB_Round_Up)
cImage + cArray(cIndex)
Next
cImage + Chr(10)
Next
StopDrawing()
EndIf
FreeImage(hImage)
altClearConsole()
altPrint(cImage)
altConsoleLocate(0, 0)
Delay(nDelay)
EndIf
EndIf
EndIf
Wend
FinishDirectory(0)
EndIf
EndSelect
EndIf
EndProcedure
Procedure altConsoleAnimate(hImage)
lpConsoleCurrentFont.CONSOLE_FONT_INFO
GetCurrentConsoleFont_(altHandle\hStdOutput, #True, @lpConsoleCurrentFont)
FontSize = GetConsoleFontSize_(altHandle\hStdOutput, lpConsoleCurrentFont\nFont)
lpConsoleCurrentFont\dwFontSize\x = FontSize & $FFFF
lpConsoleCurrentFont\dwFontSize\y = (FontSize >> 16) & $FFFF
fRatio.d = lpConsoleCurrentFont\dwFontSize\x / lpConsoleCurrentFont\dwFontSize\y
lpConsoleScreenBufferInfo.CONSOLE_SCREEN_BUFFER_INFO
If GetConsoleScreenBufferInfo_(altHandle\hStdOutput, @lpConsoleScreenBufferInfo)
iWidth = lpConsoleScreenBufferInfo\dwSize\x - 1
Dim cArray.s(11) : Define sFactor.d, cImage.s
cArray(0) = "#" : cArray(1) = "@" : cArray(2) = "&" : cArray(3) = "%" : cArray(4) = "=" : cArray(5) = "+"
cArray(6) = "*" : cArray(7) = ":" : cArray(8) = "-" : cArray(9) = "." : cArray(10) = " "
aSize = ArraySize(cArray()) - 1
tWidth = ImageWidth(hImage)
tHeight = ImageHeight(hImage)
sFactor = iWidth / tWidth
iHeight = (tHeight * sFactor) * fRatio
ResizeImage(hImage, iWidth, iHeight)
If StartDrawing(ImageOutput(hImage))
For yPos = 0 To iHeight - 2
For xPos = 0 To iWidth - 4
pColor = Point(xPos, yPos)
gScale = (Red(pColor) + Green(pColor) + Blue(pColor)) / 3
cIndex = Round(gScale * aSize / 255, #PB_Round_Up)
cImage + cArray(cIndex)
Next
cImage + Chr(10)
Next
StopDrawing()
EndIf
FreeImage(hImage)
WriteConsole_(altHandle\hStdOutput, cImage, Len(cImage), @lpNumberOfCharsWritten, #Null)
dwCursorPosition.COORD
dwCursorPosition\x = 0
dwCursorPosition\y = 0
SetConsoleCursorPosition_(altHandle\hStdOutput, PeekL(@dwCursorPosition))
EndIf
EndProcedure
Procedure.s altInput(Text.s = #Null$)
lpBuffer.s = #Null$
lpConsoleScreenBufferInfo.CONSOLE_SCREEN_BUFFER_INFO
If GetConsoleScreenBufferInfo_(altHandle\hStdOutput, @lpConsoleScreenBufferInfo)
If Len(Text) > 0
altConsoleLocate(0, lpConsoleScreenBufferInfo\srWindow\bottom)
altPrint(Text)
EndIf
nNumberOfCharsToRead = lpConsoleScreenBufferInfo\dwSize\x * lpConsoleScreenBufferInfo\dwSize\y
nNumberOfCharsToRead - lpConsoleScreenBufferInfo\dwCursorPosition\x * lpConsoleScreenBufferInfo\dwCursorPosition\y
lpBuffer = Space(nNumberOfCharsToRead)
ReadConsole_(altHandle\hStdInput, @lpBuffer, nNumberOfCharsToRead, @lpNumberOfCharsRead, #Null)
EndIf
ProcedureReturn RTrim(lpBuffer)
EndProcedure
Procedure cmdOpenConsole(State = 1, Title.s = "Command Console")
Protected AttachConsole.protoAttachConsole
Protected GetConsoleWindow.protoGetConsoleWindow
If State < 0 : State = 1 : EndIf
If State > 3 : State = 1 : EndIf
Result = #False
lpStartupInfo.STARTUPINFO
lpStartupInfo\cb = SizeOf(STARTUPINFO)
lpStartupInfo\lpReserved = #Null
lpStartupInfo\lpDesktop = #Null
lpStartupInfo\lpTitle = @Title
lpStartupInfo\dwX = 0
lpStartupInfo\dwY = 0
lpStartupInfo\dwXSize = 640
lpStartupInfo\dwYSize = 300
lpStartupInfo\dwXCountChars = 80
lpStartupInfo\dwYCountChars = 5000
lpStartupInfo\dwFillAttribute = #FOREGROUND_RED | #BACKGROUND_RED | #BACKGROUND_GREEN | #BACKGROUND_BLUE
lpStartupInfo\dwFlags = #STARTF_USECOUNTCHARS | #STARTF_USEFILLATTRIBUTE | #STARTF_USEPOSITION | #STARTF_USESHOWWINDOW | #STARTF_USESIZE
lpStartupInfo\wShowWindow = State
lpStartupInfo\cbReserved2 = 0
lpStartupInfo\lpReserved2 = #Null
lpStartupInfo\hStdInput = #Null
lpStartupInfo\hStdOutput = #Null
lpStartupInfo\hStdError = #Null
lpProcessAttributes.SECURITY_ATTRIBUTES
lpProcessAttributes\nLength = SizeOf(SECURITY_ATTRIBUTES)
lpProcessAttributes\lpSecurityDescriptor = #Null
lpProcessAttributes\bInheritHandle = #False
lpThreadAttributes.SECURITY_ATTRIBUTES
lpThreadAttributes\nLength = SizeOf(SECURITY_ATTRIBUTES)
lpThreadAttributes\lpSecurityDescriptor = #Null
lpThreadAttributes\bInheritHandle = #False
lpProcessInformation.PROCESS_INFORMATION
lpCommandLine.s = "cmd.exe"
If CreateProcess_(#Null, @lpCommandLine, lpProcessAttributes, lpThreadAttributes, #False, #CREATE_NEW_CONSOLE | #NORMAL_PRIORITY_CLASS, #Null, #Null, lpStartupInfo, @lpProcessInformation)
Delay(200)
kernel32 = OpenLibrary(#PB_Any, "kernel32.dll")
If IsLibrary(kernel32)
AttachConsole = GetFunction(kernel32, "AttachConsole")
If AttachConsole(lpProcessInformation\dwProcessId)
cmdHandle\hStdInput = GetStdHandle_(#STD_INPUT_HANDLE)
cmdHandle\hStdOutput = GetStdHandle_(#STD_OUTPUT_HANDLE)
cmdHandle\hStdError = GetStdHandle_(#STD_ERROR_HANDLE)
If State = 1 Or State = 3
GetConsoleWindow = GetFunction(kernel32, "GetConsoleWindow")
hConsole = GetConsoleWindow()
BringWindowToTop(hConsole)
EndIf
SetConsoleCtrlHandler_(@HandlerRoutine(), #True)
Result = #True
EndIf
CloseLibrary(kernel32)
EndIf
EndIf
ProcedureReturn Result
EndProcedure
Procedure cmdChangeColor(CharacterColor = 7, BackgroundColor = 0)
wAttribute.w = GetColors(CharacterColor, BackgroundColor)
lpConsoleScreenBufferInfo.CONSOLE_SCREEN_BUFFER_INFO
If GetConsoleScreenBufferInfo_(cmdHandle\hStdOutput, @lpConsoleScreenBufferInfo)
nLength = lpConsoleScreenBufferInfo\dwSize\x * lpConsoleScreenBufferInfo\dwSize\y
dwCursorPosition.COORD
dwCursorPosition\x = 0
dwCursorPosition\y = 0
FillConsoleOutputAttribute_(cmdHandle\hStdOutput, wAttribute, nLength, PeekL(@dwCursorPosition), @lpNumberOfAttrsWritten)
SetConsoleTextAttribute_(cmdHandle\hStdOutput, wAttribute)
EndIf
EndProcedure
Procedure cmdAddAlias(Source.s, Target.s, ExeName.s = "cmd.exe")
AddConsoleAlias_(Source, Target, ExeName)
EndProcedure
Procedure cmdRunScript(Text.s, RunAndWait = #False)
If LCase(Right(Text, 4)) <> "exit" : Text + Chr(13) : EndIf
nLength = Len(Text) + 1
If nLength > 1
Dim lpBuffer.INPUT_RECORD(nLength)
For rtnCount = 0 To nLength - 2
ascKey = Asc(Mid(Text, rtnCount + 1, 1))
vkKey = VkKeyScanEx_(ascKey, GetKeyboardLayout_(0)) & $FF
lpBuffer(rtnCount)\EventType = #KEY_EVENT
lpBuffer(rtnCount)\Event\KeyEvent\bKeyDown = #True
lpBuffer(rtnCount)\Event\KeyEvent\dwControlKeyState = 0
lpBuffer(rtnCount)\Event\KeyEvent\uChar = ascKey
lpBuffer(rtnCount)\Event\KeyEvent\wRepeatCount = 1
lpBuffer(rtnCount)\Event\KeyEvent\wVirtualKeyCode = vkKey
lpBuffer(rtnCount)\Event\KeyEvent\wVirtualScanCode = MapVirtualKey_(vkKey, 0)
Next
lpBuffer(nLength - 1)\EventType = #KEY_EVENT
lpBuffer(nLength - 1)\Event\KeyEvent\bKeyDown = #True
lpBuffer(nLength - 1)\Event\KeyEvent\dwControlKeyState = 0
lpBuffer(nLength - 1)\Event\KeyEvent\uChar = #VK_RETURN
lpBuffer(nLength - 1)\Event\KeyEvent\wRepeatCount = 1
lpBuffer(nLength - 1)\Event\KeyEvent\wVirtualKeyCode = #VK_RETURN
lpBuffer(nLength - 1)\Event\KeyEvent\wVirtualScanCode = MapVirtualKey_(#VK_RETURN, 0)
WriteConsoleInput_(cmdHandle\hStdInput, @lpBuffer(), nLength, @lpNumberOfCharsWritten)
If RunAndWait
Repeat
Result = WaitForSingleObject_(cmdHandle\hStdInput, 100)
Select Result
Case #WAIT_ABANDONED : Break
Case #WAIT_OBJECT_0 : Delay(100)
Case #WAIT_TIMEOUT : Break
Case #WAIT_FAILED : Break
EndSelect
ForEver
Else
Delay(200)
EndIf
EndIf
EndProcedure
Procedure cmdRunBatch(FileName.s = #Null$, RunAndWait = #False)
If FileName = #Null$
FileName = OpenFileRequester("Alternative Command Console", StandardFile$, "Batch Files (*.bat)|*.bat|Text Files (*.txt)|*.txt", 0)
EndIf
If FileSize(FileName) > 0
If ReadFile(0, FileName)
While Not Eof(0)
cmdRunScript(ReadString(0), RunAndWait)
Wend
CloseFile(0)
EndIf
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure.s cmdReadConsole(nLeft = 0, nTop = 0, nRight = 0, nBottom = 0)
Result.s = #Null$
lpConsoleScreenBufferInfo.CONSOLE_SCREEN_BUFFER_INFO
If GetConsoleScreenBufferInfo_(cmdHandle\hStdOutput, @lpConsoleScreenBufferInfo)
If nLeft < 0
nLeft = 0
Else
If nLeft > lpConsoleScreenBufferInfo\dwSize\x - 1 : nLeft = 0 : EndIf
EndIf
If nTop < 0
nTop = 0
Else
If nTop > lpConsoleScreenBufferInfo\srWindow\bottom - 1 : nTop = 0 : EndIf
EndIf
If nRight <= 0
nRight = lpConsoleScreenBufferInfo\dwSize\x - 1
Else
If nRight > lpConsoleScreenBufferInfo\dwSize\x - 1 : nRight = lpConsoleScreenBufferInfo\dwSize\x - 1 : Else : nRight + 1 : EndIf
EndIf
If nBottom <= 0
nBottom = lpConsoleScreenBufferInfo\srWindow\bottom
Else
If nBottom > lpConsoleScreenBufferInfo\srWindow\bottom : nBottom = lpConsoleScreenBufferInfo\srWindow\bottom : EndIf
EndIf
If nBottom > 150 : BufferSize = 150 : Else : BufferSize = nBottom : EndIf
Dim lpBuffer.CHAR_INFO(BufferSize, nRight - 1) : Define.s cRow
Repeat
dwBufferSize.COORD
dwBufferSize\x = nRight
dwBufferSize\y = BufferSize + 1
dwBufferCoord.COORD
dwBufferCoord\x = 0
dwBufferCoord\y = 0
lpReadRegion.SMALL_RECT
lpReadRegion\left = nLeft
lpReadRegion\top = nTop + Increment
lpReadRegion\right = nRight - 2
lpReadRegion\bottom = BufferSize - 1 + Increment
ReadConsoleOutput_(cmdHandle\hStdOutput, @lpBuffer(), PeekL(@dwBufferSize), PeekL(@dwBufferCoord), @lpReadRegion)
For yPos = 0 To BufferSize - 1
cRow = #Null$
For xPos = 0 To nRight - 2
cRow + Chr(lpBuffer(yPos, xPos)\Char)
Next
Result + RTrim(cRow) + Chr(10)
If Increment + yPos >= nBottom : Break 2 : EndIf
Next
Increment + 150
ForEver
While Right(Result, 1) = Chr(10)
Result = Left(Result, Len(Result) - 1)
Wend
EndIf
ProcedureReturn Result
EndProcedure
Procedure cmdCloseConsole()
cmdRunScript("exit")
FreeConsole_()
EndProcedure
;=============MAIN===========
If cmdOpenConsole()
cmdRunScript("help assoc", #True)
cmdRunScript("tree c:\windows", #True)
ConsoleText.s = cmdReadConsole()
; cmdCloseConsole()
Debug ConsoleText
EndIf
M.