Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .586P
- .MODEL flat, STDCALL
- ;--- z pliku ..\include\windows.inc ---
- STD_INPUT_HANDLE equ -10
- STD_OUTPUT_HANDLE equ -11
- KEY_EVENT EQU 1h ; zdarzenie klawiatury
- MOUSE_EVENT EQU 2h ; zdarzenie myszy
- MENU_EVENT EQU 8h
- FOCUS_EVENT EQU 10h
- RIGHT_ALT_PRESSED EQU 1h ; Alt prawy
- LEFT_ALT_PRESSED EQU 2h ; Alt lewy
- RIGHT_CTRL_PRESSED EQU 4h ; Ctrl prawy
- LEFT_CTRL_PRESSED EQU 8h ; Ctrl lewy
- SHIFT_PRESSED EQU 10h ; Shift nacioniety
- NUMLOCK_ON EQU 20h ; Num Lock w31czony
- SCROLLLOCK_ON EQU 40h ; Scroll Lock w31czony
- CAPSLOCK_ON EQU 80h ; Caps Lock w31czony
- ENHANCED_KEY EQU 100h ; klawisz jest zwolniony
- FROM_LEFT_1ST_BUTTON_PRESSED EQU 1h ; przycisk lewy
- RIGHTMOST_BUTTON_PRESSED EQU 2h ; przycisk prawy
- FROM_LEFT_2ND_BUTTON_PRESSED EQU 4h ; przycisk srodkowy
- FROM_LEFT_3ND_BUTTON_PRESSED EQU 8h ; przycisk trzeci z lewa
- FROM_LEFT_4ND_BUTTON_PRESSED EQU 10h ;przycisk 4-ty z lewa
- MOUSE_MOVED EQU 1h ; mysz przesuwa sie
- DOUBLE_CLICK EQU 2h ; podwójne klikniecie
- MOUSE_WHEELED EQU 4h ; poruszenie kó3kiem myszy
- ;--- struktury ----------
- COORD STRUCT
- X DW ?
- Y DW ?
- COORD ENDS
- MOUSE_EVENT_RECORD STRUCT
- dwMousePosition COORD <> ; wspó3rzedne X, Y kursora myszy
- dwButtonState DWORD ? ; znaczniki nacioniecia przycisków myszy
- dwControlKeyState DWORD ? ; znaczniki nacioniecia klawiszy steruj1cych
- dwEventFlags DWORD ? ; znaczniki przesuwania i podwójnego klik-niecie myszy
- MOUSE_EVENT_RECORD ENDS
- KEY_EVENT_RECORD STRUCT
- bKeyDown DWORD ? ; znacznik nacioniecia któregokolwiek klawisza
- wRepeatCount WORD ? ; ilooa powtórzen kodu przy d3ugim nacionieciu
- wVirtualKeyCode WORD ? ; wirtualny kod klawisza
- wVirtualScanCode WORD ? ; scan-kod klawisza
- UNION
- UnicodeChar WORD ? ; UNICODE kod klawisza
- AsciiChar BYTE ? ; ASCII kod klawisza
- ENDS
- dwControlKeyState DWORD ? ; znaczniki klawiszy steruj1cych
- KEY_EVENT_RECORD ENDS
- WINDOW_BUFFER_SIZE_RECORD STRUCT
- dwSize COORD <>
- WINDOW_BUFFER_SIZE_RECORD ENDS
- MENU_EVENT_RECORD STRUCT
- dwCommandId DWORD ?
- MENU_EVENT_RECORD ENDS
- FOCUS_EVENT_RECORD STRUCT
- bSetFocus DWORD ?
- FOCUS_EVENT_RECORD ENDS
- INPUT_RECORD STRUCT
- EventType WORD ?
- two_byte_alignment WORD ?
- UNION
- KeyEvent KEY_EVENT_RECORD <>
- MouseEvent MOUSE_EVENT_RECORD <>
- WindowBufferSizeEvent WINDOW_BUFFER_SIZE_RECORD <>
- MenuEvent MENU_EVENT_RECORD <>
- FocusEvent FOCUS_EVENT_RECORD <>
- ENDS
- INPUT_RECORD ENDS
- ;--- funkcje API Win32 z pliku ..\include\user32.inc ---
- CharToOemA PROTO :DWORD,:DWORD
- ;--- funkcje API Win32 z pliku ..\include\kernel32.inc -----------
- GetStdHandle PROTO :DWORD
- WriteConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
- AllocConsole PROTO
- FreeConsole PROTO
- SetConsoleTitleA PROTO :DWORD
- ;;BOOL SetConsoleTitle(
- ;;LPCTSTR lpConsoleTitle // address of new title
- ;;);
- SetConsoleTextAttribute PROTO :DWORD,:DWORD
- ;;BOOL SetConsoleTextAttribute(
- ;;HANDLE hConsoleOutput, // handle of console screen buffer
- ;;WORD wAttributes // text and background colors
- ;;);
- GetLargestConsoleWindowSize PROTO :DWORD
- ;;COORD GetLargestConsoleWindowSize(
- ;;HANDLE hConsoleOutput // handle of console screen buffer
- ;;);
- ;;typedef struct _COORD { // coord.
- ;;SHORT X; // horizontal coordinate
- ;;SHORT Y; // vertical coordinate
- ;;} COORD;
- FillConsoleOutputAttribute PROTO :DWORD,:DWORD,:DWORD,:COORD,:DWORD
- ;;BOOL FillConsoleOutputAttribute(
- ;;HANDLE hConsoleOutput, // handle to screen buffer
- ;;WORD wAttribute, // color attribute to write
- ;;DWORD nLength, // number of character cells to write to
- ;;COORD dwWriteCoord, // x- and y-coordinates of first cell
- ;;LPDWORD lpNumberOfAttrsWritten // pointer to number of cells written to
- ;;);
- SetConsoleCursorPosition PROTO :DWORD, :COORD
- ;;BOOL SetConsoleCursorPosition(
- ;;HANDLE hConsoleOutput, // handle of console screen buffer
- ;;COORD dwCursorPosition // new cursor position coordinates
- ;;);
- ReadConsoleInputA PROTO :DWORD,:DWORD,:DWORD,:DWORD
- ;;BOOL ReadConsoleInput(
- ;;HANDLE hConsoleInput, // handle of a console input buffer
- ;;PINPUT_RECORD lpBuffer, // address of the buffer for read data
- ;;DWORD nLength, // number of records to read
- ;;LPDWORD lpNumberOfEventsRead // address of number of records read
- ;;);
- FlushConsoleInputBuffer PROTO :DWORD
- ;;BOOL FlushConsoleInputBuffer(
- ;;HANDLE hConsoleInput // handle to console input buffer
- ;;);
- WriteConsoleOutputCharacterA PROTO :DWORD,:DWORD,:DWORD,:COORD,:DWORD
- ;;BOOL WriteConsoleOutputCharacter(
- ;;HANDLE hConsoleOutput, // handle to a console screen buffer
- ;;LPCTSTR lpCharacter, // pointer to buffer to write characters from
- ;;DWORD nLength, // number of character cells to write to
- ;;COORD dwWriteCoord, // coordinates of first cell to write to
- ;;LPDWORD lpNumberOfCharsWritten // pointer to number of cells written to
- ;;);
- ExitProcess PROTO :DWORD
- ;;VOID ExitProcess(
- ;;UINT uExitCode // exit code for all threads
- ;;);
- wsprintfA PROTO C :VARARG
- ClearScreen PROTO
- ;--- biblioteki ---------
- includelib .\lib\user32.lib
- includelib .\lib\kernel32.lib
- includelib .\lib\masm32.lib
- ;--- sekcja danych ------
- _DATA SEGMENT
- hout dd ?
- hinp dd ?
- rout dd ?
- komunikat db "Naciskaj klawisze (pod spodem powinny sie pokazywac, albo wywalic program):", 13, 10, 0
- rozmK dd $ - komunikat
- YX COORD <>
- zapis INPUT_RECORD <>
- nzdarz dd ?
- symb db ?
- _DATA ENDS
- ;--- sekcja kodu ---------
- _TEXT SEGMENT
- start:
- push STD_INPUT_HANDLE
- call GetStdHandle ; wywołanie funkcji GetStdHandle
- mov hinp, EAX
- push STD_OUTPUT_HANDLE
- call GetStdHandle ; wywołanie funkcji GetStdHandle
- mov hout, EAX
- ;--- tworzenie konsoli ---
- INVOKE FreeConsole
- INVOKE AllocConsole
- invoke WriteConsoleA, hout, OFFSET komunikat, rozmK, 0, 0
- powt:
- INVOKE FlushConsoleInputBuffer,hinp ;czyszczenie kolejki komunikatów
- INVOKE ReadConsoleInputA,hinp,OFFSET zapis,1,OFFSET nzdarz ; odczyt komunikatu zdarzenia
- ;--- sprawdzanie typu zdarzenia
- cmp WORD PTR [zapis.EventType], KEY_EVENT
- je @F
- jmp powt
- @@:
- ;--- komunikat od klawiatury ---
- klaw:
- cmp (KEY_EVENT_RECORD PTR [zapis.KeyEvent]).bKeyDown, 0 ; porównanie z zerem
- jne @F
- jmp powt ;jeśli nie ma naciśnięcia
- @@:
- mov AL,(KEY_EVENT_RECORD PTR [zapis.KeyEvent]).ASCIIChar
- mov symb,AL ; zapisywanie znaku
- mov YX.X, 0
- mov YX.y, 1
- INVOKE WriteConsoleOutputCharacterA,hout,OFFSET symb,1,COORD PTR [YX],rout ;wypisywanie znaku
- jmp powt
- ; na powtórzenie
- ;--- zamkniecie konsoli
- kon:
- INVOKE FreeConsole
- ;----- wywołanie funkcji ExitProcess ---------
- INVOKE ExitProcess,0
- _TEXT ENDS
- END start
Advertisement
Add Comment
Please, Sign In to add comment