'APIS para el funcionamiento de la consola'
API GetStdHandle(nStdHandle:Entero):Entero, "Kernel32"
API AllocConsole():Booleano, "Kernel32"
API WriteConsoleA(hConsoleOutput:Entero, Referencia lpBuffer:Cadena, nNumberOfCharsToWrite:Entero, Referencia lpNumberOfCharsWritten:WORD, Referencia lpReserved:Entero):Entero, "Kernel32"
API ReadConsoleA(hConsoleInput:Entero, Referencia lpBuffer:Cadena, nNumberOfCharsToRead:Entero, Referencia lpNumberOfCharsRead:WORD, Referencia lpReserved:Entero):Entero, "Kernel32"
API FreeConsole():Booleano, "Kernel32"
API SetConsoleTitleA(lpConsoleTitle:Cadena):Entero, "Kernel32"
API SetConsoleTextAttribute(hConsoleOutput, wAttributes:Entero):Entero, "Kernel32"
API GetConsoleMode(hConsoleHandle:Entero, Referencia lpMode:WORD):Booleano, "Kernel32"
API SetConsoleMode(hConsoleHandle, dwMode:WORD):Booleano, "Kernel32"
' Consola '
const STD_OUTPUT_HANDLE = -11
const STD_INPUT_HANDLE = -10
const STD_ERROR_HANDLE = -12
' Colores '
Const FOREGROUND_BLUE = &1
Const FOREGROUND_GREEN = &2
Const FOREGROUND_RED = &4
Const FOREGROUND_INTENSITY = &8
Const FOREGROUND_SEARCH = (&10)
Const BACKGROUND_BLUE = &10
Const BACKGROUND_GREEN = &20
Const BACKGROUND_RED = &40
Const BACKGROUND_INTENSITY = &80
Const BACKGROUND_SEARCH = &20
' Console mode flag'
Const ENABLE_ECHO_INPUT = &4
Const ENABLE_PROCESSED_INPUT = &1
'Callback'
Prototipo procsimple():Entero
Prototipo settitle(titulo:Cadena):Entero
Prototipo setattibute(atributos:Entero):Entero
' Nuestro gestor de consola '
Estruct ConsolaEstructura,_
hEntrada,_
hSalida:Entero,_
txt,_
txtresultado:Cadena,_
establecerTitulo:settitle,_
escribir:procsimple,_
escribirLinea:procsimple,_
establecerColor:setattibute,_
leer:procsimple,_
iniciar:procsimple,_
pausar:procsimple
' Variables de control '
Var Error:Booleano
Var Consola:ConsolaEstructura
Var consoleVar:WORD
' Iniciamos algunos metodos de nuestra consola '
Error = Falso
Consola.hEntrada = INVALID_HANDLE
Consola.hSalida = INVALID_HANDLE
[email protected] = [email protected]
[email protected] = [email protected]
[email protected] = [email protected]
[email protected] = [email protected]
[email protected] = [email protected]
[email protected] = [email protected]
[email protected] = [email protected]
Proc initConsole():Entero
AllocConsole()
Consola.hEntrada = GetStdHandle(STD_INPUT_HANDLE)
Consola.hSalida = GetStdHandle(STD_OUTPUT_HANDLE)
Consola.txt = ""
Consola.txtresultado = ""
FinProc
Proc establecerAtb(atributos:Entero):Entero
Si check() Entonces
Resultado = SetConsoleTextAttribute(Consola.hSalida, atributos)
FinSi
FinProc
Proc setCTitle(titulo:Cadena):Entero
Si check() Entonces
Resultado = SetConsoleTitleA(titulo)
FinSi
FinProc
Proc writeConsole():Entero
Si check() Entonces
Var result:Entero
result = WriteConsoleA(Consola.hSalida, Consola.txt, CadLong(Consola.txt), consoleVar, 0)
Resultado result
FinSi
FinProc
Proc writeConsoleLine():Entero
Si check() Entonces
Consola.txt = Consola.txt + LF
Resultado writeConsole()
FinSi
FinProc
Proc readConsole():Entero NoResultado
readConsoleLimited(MAX_PATH)
FinProc
Proc readConsoleLimited(limite:Entero):Entero NoResultado
Si check() Entonces
Var i:Entero
Var tecla:Byte
Var letra:Cadena
i = 0
Consola.txtresultado = ""
Repetir
tecla = getChar()
letra = Caracter(tecla)
Si (i > 0) And (tecla = <img src="https://underc0de.org/foro/Smileys/default/cool.gif" alt="8)" title="Cool" class="smiley" /> Entonces
Consola.txt = "\x08 \x08"
Consola.escribir()
Consola.txtresultado = Izquierda(Consola.txtresultado, CadLong(Consola.txtresultado)-1)
SiNo
Si tecla <> 13 Entonces
Consola.txt = letra
Consola.escribir()
Consola.txtresultado = Consola.txtresultado + letra
i = i + 1
FinSi
FinSi
HastaQue (tecla = 13) or (i = limite)
Consola.txt = ""
Consola.escribirLinea()
FinSi
FinProc
Proc pauseConsole()
Si check() Entonces
Var tecla:Byte
Consola.txt = "Presione una tecla para continuar . . . "
Consola.escribirLinea()
tecla = getChar()
closeConsole()
FinSi
FinProc
Proc getChar():Byte
Var char:Cadena
Var mode:WORD
GetConsoleMode(Consola.hEntrada, mode)
SetConsoleMode(Consola.hEntrada, mode and (-1*ENABLE_ECHO_INPUT) and (-1*ENABLE_PROCESSED_INPUT))
ReadConsoleA(Consola.hEntrada, char, 1, consoleVar, 0)
SetConsoleMode(Consola.hEntrada, mode)
Resultado = ASCII(char)
FinProc
Proc closeConsole():Entero
Si check() Entonces
CloseHandle(Consola.hEntrada)
CloseHandle(Consola.hSalida)
FreeConsole()
FinSi
FinProc
Proc check():Booleano
Si (Consola.hEntrada = INVALID_HANDLE) or (Consola.hSalida = INVALID_HANDLE) Entonces
Si Error = Falso Entonces
Mensaje("Primero debes iniciar la consola antes de usarla")
FinSi
Error = Verdad
Resultado = Falso
SiNo
Resultado = Verdad
FinSi
FinProc