作者:six_L 此贴贴于2020-5-30 18:12:09,已被阅读233次/回复1 
GetConsoleKBD
option casemap:none
option win64:3

include \UASM64\include\windows.inc

includelib \UASM64\Lib\user32.lib
includelib \UASM64\Lib\kernel32.lib

ssKEY_EVENT_RECORD struct 
    bKeyDown    BOOL    ?
    wRepeatCount    WORD    ?
    wVirtualKeyCode    WORD    ?
    wVirtualScanCode WORD    ?
    union 
        UnicodeChar    WCHAR    ?
        AsciiChar    CHAR    ?
    ends
    dwControlKeyState DWORD    ?
ssKEY_EVENT_RECORD ends

ssMOUSE_EVENT_RECORD struct 
    dwMousePosition        COORD    <>
    dwButtonState        DWORD    ?
    dwControlKeyState    DWORD    ?
    dwEventFlags        DWORD    ?
ssMOUSE_EVENT_RECORD ends

ssWINDOW_BUFFER_SIZE_RECORD struct 
    dwSize    COORD    <>
ssWINDOW_BUFFER_SIZE_RECORD ends

ssMENU_EVENT_RECORD struct 
    dwCommandId    DWORD    ?
ssMENU_EVENT_RECORD ends

ssFOCUS_EVENT_RECORD struct 
    bSetFocus    BOOL    ?
ssFOCUS_EVENT_RECORD ends

ssINPUT_RECORD struct    ;8    ;v2.02: alignment changed from 4 to 8
    EventType    WORD ?
    union 
        ssKeyEvent    ssKEY_EVENT_RECORD    <>
        MouseEvent    ssMOUSE_EVENT_RECORD    <>
        WindowBufferSizeEvent    ssWINDOW_BUFFER_SIZE_RECORD    <>
        MenuEvent    ssMENU_EVENT_RECORD    <>
        FocusEvent    ssFOCUS_EVENT_RECORD    <>
    ends
ssINPUT_RECORD ends

.data?
    hStdIn        dq    ?        
    hStdOut        dq    ?        
    szBuffer    db    64 dup (?)
    dwBytesRead    dd    ?
    dwBytesWrite    dd    ?

.code

GetConsoleKBD  PROC 
;  This function returns when any console key is pressed (bKeyDown = 1).
;A possible drawback is that all input event records are removed from
;the console input queue until a key is pressed. In many cases, this is
;not an issue. The virtual key code, virtual scan code, TCHAR character,
;and control key state values are returned in registers.

;  Returns: EAX = TCHAR character (high word of EAX = 0)
;           ECX = control key state flags
;               Bit   Name                Meaning
;                0    RIGHT_ALT_PRESSED   Right ALT key is pressed
;                1    LEFT_ALT_PRESSED    Left ALT key is pressed
;                2    RIGHT_CTRL_PRESSED  Right CTRL key is pressed
;                3    LEFT_CTRL_PRESSED   Left CTRL key is pressed
;                4    SHIFT_PRESSED       SHIFT key is pressed
;                5    NUMLOCK_ON          NUM LOCK light is on
;                6    SCROLLLOCK_ON       SCROLL LOCK light is on
;                7    CAPSLOCK_ON         CAPS LOCK light is on
;                8    ENHANCED_KEY        Key is enhanced
;           EDX:
;           low word (DX) = virtual key code
;           high word     = virtual scan code
;-------------------------------------------------
    LOCAL   xir:ssINPUT_RECORD

    invoke    FlushConsoleInputBuffer,hStdIn
    .repeat
        invoke  ReadConsoleInput,hStdIn,addr xir,1,addr dwBytesRead
        movzx   ecx,word ptr xir.EventType
        mov   edx,dword ptr xir.ssKeyEvent.wVirtualKeyCode
    .until (ecx==KEY_EVENT) && (ecx==xir.ssKeyEvent.bKeyDown) && (dx!=VK_SHIFT) && (dx!=VK_CONTROL) && (dx!=VK_MENU)
    movzx   eax,word ptr xir.ssKeyEvent.UnicodeChar
    mov     ecx,xir.ssKeyEvent.dwControlKeyState
    ret

GetConsoleKBD  ENDP

HandlerRoutine PROC dwCtrlType:DWORD

    mov     edx,dwCtrlType
    .if (edx==CTRL_C_EVENT) || (edx==CTRL_BREAK_EVENT)
        invoke    RtlZeroMemory,addr szBuffer,sizeof szBuffer
        invoke    lstrcat,addr szBuffer,CStr("game over !",13,10)
        invoke    lstrlen,addr szBuffer
        invoke    WriteConsole,hStdOut,addr szBuffer,eax,addr dwBytesWrite,NULL
        invoke  SetConsoleCtrlHandler,offset HandlerRoutine,FALSE
        invoke    CloseHandle,hStdIn
        invoke    CloseHandle,hStdOut
        invoke  ExitProcess,0
    .endif
    ret

HandlerRoutine ENDP

MainCRTStartup   PROC
    Local @eax:dword
    Local @ecx:dword
    Local @edx:dword
    Local dqIndex:qword

    invoke    GetStdHandle,STD_INPUT_HANDLE
    mov    hStdIn,rax
    invoke    GetStdHandle,STD_OUTPUT_HANDLE
    mov    hStdOut,rax
    invoke    SetConsoleTextAttribute,hStdOut,FOREGROUND_GREEN or FOREGROUND_INTENSITY
    invoke  SetConsoleCtrlHandler,offset HandlerRoutine,TRUE
    mov    dqIndex,0
@@:
    inc    dqIndex
    invoke    RtlZeroMemory,addr szBuffer,sizeof szBuffer
    invoke  GetConsoleKBD
    mov    @eax,eax
    mov    @ecx,ecx
    mov    @edx,edx
    invoke    wsprintf,addr szBuffer,CStr("(%d)  eax = %02XH,ecx = %02XH,edx = %06XH",13,10),dqIndex,@eax,@ecx,@edx
    invoke    lstrlen,addr szBuffer
    invoke    WriteConsole,hStdOut,addr szBuffer,eax,addr dwBytesWrite,NULL
    invoke  Sleep,1
    jmp    @B

MainCRTStartup   ENDP

end


此贴的回复贴(直接):
attachment218 six_L 2020-5-30 18:17:12 0 正常