📄 console.inc
字号:
; Console utils
struct _COORD
x dw ?
y dw ?
ends
struct SMALL_RECT
Left dw ?
Top dw ?
Right dw ?
Bottom dw ?
ends
struct CONSOLE_CURSOR_INFO
dwSize dd ?
bVisible dd ?
ends
struct CONSOLE_SCREEN_BUFFER_INFO
dwSize _COORD
dwCursorPosition _COORD
wAttributes dw ?
srWindow SMALL_RECT
dwMaximumWindowSize _COORD
ends
FOREGROUND_BLUE = 0001h
FOREGROUND_GREEN = 0002h
FOREGROUND_RED = 0004h
FOREGROUND_INTENSITY = 0008h
FOREGROUND_DEFAULT = FOREGROUND_BLUE+FOREGROUND_GREEN+FOREGROUND_RED
BACKGROUND_BLUE = 0010h
BACKGROUND_GREEN = 0020h
BACKGROUND_RED = 0040h
BACKGROUND_INTENSITY = 0080h
BACKGROUND_DEFAULT = 0000h
CHAR equ BYTE
BOOL equ DWORD
COORD equ DWORD
LPVOID equ DWORD
LPWORD equ DWORD
LPDWORD equ DWORD
LPCTSTR equ DWORD
ln db 13,10
proc InitConsole,lpConsoleTitle:LPCTSTR
local CCI:CONSOLE_CURSOR_INFO
;----------------------------
invoke GetStdHandle,STD_INPUT_HANDLE
mov [StdIn],eax
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov [StdOut],eax
invoke SetConsoleTitleA,[lpConsoleTitle]
mov [CCI.dwSize],8
mov [CCI.bVisible],1
lea eax,[CCI]
invoke SetConsoleCursorInfo,[StdOut],eax
ret
endp
proc Read,lpBuff:LPCTSTR
.if [lpBuff] <> 0
invoke ReadFile,[StdIn],[lpBuff],255,Dummy,0
invoke lstrlen,[lpBuff]
.if eax
invoke OemToCharBuff,[lpBuff],[lpBuff],eax
.endif
.else
invoke ReadFile,[StdIn],0,0,Dummy,0
.endif
mov eax,[Dummy]
ret
endp
proc Readln,lpBuff:LPCTSTR
stdcall Read,[lpBuff]
ret
endp
proc Write,lpText:LPCTSTR
push ebx
invoke lstrlenA,[lpText]
.if eax
mov ebx,eax
invoke VirtualAlloc,0,eax,MEM_COMMIT,PAGE_READWRITE
.if eax
push eax
invoke CharToOemBuffA,[lpText],eax,ebx
invoke WriteFile,[StdOut],dword [esp+0Ch],ebx,Dummy,0
invoke VirtualFree,dword [esp+8],ebx,MEM_DECOMMIT
pop eax
.endif
.endif
pop ebx
ret
endp
proc Writeln,lpText:LPCTSTR
stdcall Write,[lpText]
invoke WriteFile,[StdOut],ln,2,Dummy,0
ret
endp
proc Filln,cChar:CHAR,nCount:DWORD
call WhereXY
mov edx,eax
add edx,[nCount]
push edx
invoke FillConsoleOutputCharacterA,[StdOut],dword[cChar],[nCount],eax,Dummy
call GotoXY
invoke WriteFile,[StdOut],ln,2,Dummy,0
ret
endp
proc WhereXY;:COORD
invoke GetConsoleScreenBufferInfo,[StdOut],ScrBufInfo
mov ax,[ScrBufInfo.dwCursorPosition.y]
shl eax,16
add ax,[ScrBufInfo.dwCursorPosition.x]
ret
endp
proc GotoXY,XY:COORD
invoke SetConsoleCursorPosition,[StdOut],[XY]
ret
endp
proc GotoXYw,wX:WORD,wY:WORD
mov ax,[wY]
shl eax,16
add ax,[wX]
stdcall GotoXY,eax
ret
endp
proc SetColor,wColor:WORD
invoke SetConsoleTextAttribute,[StdOut],dword[wColor]
ret
endp
proc GetColor;:WORD
invoke GetConsoleScreenBufferInfo,[StdOut],ScrBufInfo
movzx eax,[ScrBufInfo.wAttributes]
ret
endp
proc ClrScr
push ebx
invoke GetConsoleScreenBufferInfo,[StdOut],ScrBufInfo
movzx eax,[ScrBufInfo.dwSize.y]
movzx ebx,[ScrBufInfo.dwSize.x]
mul bx
mov ebx,eax
invoke FillConsoleOutputCharacter,[StdOut],#32,ebx,0,Dummy
invoke FillConsoleOutputAttribute,[StdOut],dword[ScrBufInfo.wAttributes],ebx,0,Dummy
stdcall GotoXY,0
pop ebx
ret
endp
proc ShowError,lpErrorMsg:LPCTSTR,dwErrorCode:DWORD
local buffer[64]:CHAR
call GetColor
push eax
stdcall SetColor,FOREGROUND_RED+FOREGROUND_INTENSITY
lea eax,[buffer]
push [dwErrorCode]
call @f
db 'ERROR [0x%0.4X]: ',0
@@:
push eax
call [wsprintfA]
stdcall Write,
add esp,8
stdcall SetColor,
stdcall Writeln,[lpErrorMsg]
ret
endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -