
- •Оглавление
- •Краткая теория Введение в api-программирование
- •Api операционных систем
- •Widows api
- •Структура api-программ
- •Консольные приложения
- •Организация ввода-вывода в консольном приложении Windows
- •Организация низкоуровнего консольного ввода-вывода
- •Поддержка работы с мышью в консоли
- •Расширенная поддержка клавиатуры в консоли
- •Описание используемых функций
- •Листинг программы main.Asm
- •Результаты работы
- •Список литературы
- •Http://www.Jasinskionline.Com/windowsapi/index.Html
Листинг программы main.Asm
.386P
;Плоская модель памяти.
.MODEL FLAT, STDCALL
;Константы.
STD_OUTPUT_HANDLE equ -11
STD_INPUT_HANDLE equ -10
;Тип события.
KEY_EV equ 1h
MOUSE_EV equ 2h
; константы - состояния клавиатуры
RIGHT_ALT_PRESSED equ 1h
LEFT_ALT_PRESSED equ 2h
RIGHT_CTRL_PRESSED equ 4h
LEFT_CTRL_PRESSED equ 8h
SHIFT_PRESSED equ 10h
NUMLOCK_ON equ 20h
SCROLLLOCK_ON equ 40h
CAPSLOCK_ON equ 80h
ENHANCED_KEY equ 100h
;Прототипы внешних процедур.
EXTERN wsprintfA:NEAR
EXTERN GetStdHandle@4:NEAR
EXTERN WriteConsoleA@20:NEAR
EXTERN SetConsoleCursorPosition@8:NEAR
EXTERN SetConsoleTitleA@4:NEAR
EXTERN FreeConsole@0:NEAR
EXTERN AllocConsole@0:NEAR
EXTERN CharToOemA@8:NEAR
EXTERN SetConsoleTextAttribute@8:NEAR
EXTERN ReadConsoleInputA@16:NEAR
EXTERN ExitProcess@4:NEAR
;Директивы компоновщику для подключения библиотек.
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
;------------------------------------------------
COOR STRUC
X WORD ?
Y WORD ?
COOR ENDS
;Сегмент данных.
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
HANDL DWORD ?
HANDL1 DWORD ?
TITL DB "Обработка событий мыши",0
BUF DB 200 dup(0)
LENS DWORD ? ;Количество выведенных символов.
CO DWORD ?
FORM DB "Координаты: %u %u ",0
CRD COOR <?>
STR1 DB "Для выхода нажмите ESC",0
MOUS_KEY WORD 19 dup(?)
_DATA ENDS
;Сегмент кода.
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
;Образовать консоль.
;Вначале освободить уже существующую.
CALL FreeConsole@0
CALL AllocConsole@0
;Получить HANDL1 ввода.
PUSH STD_INPUT_HANDLE
CALL GetStdHandle@4
MOV HANDL1,EAX
;Получить HANDL вывода.
PUSH STD_OUTPUT_HANDLE
CALL GetStdHandle@4
MOV HANDL,EAX
;Задать заголовок окна консоли.
PUSH OFFSET TITL
PUSH OFFSET TITL
CALL CharToOemA@8
PUSH OFFSET TITL
CALL SetConsoleTitleA@4
;*************************************
;Перекодировка строки.
PUSH OFFSET STR1
PUSH OFFSET STR1
CALL CharToOemA@8
;Длина строки.
PUSH OFFSET STR1
CALL LENSTR
;Вывести строку.
PUSH 0
PUSH OFFSET LENS
PUSH EBX
PUSH OFFSET STR1
PUSH HANDL
CALL WriteConsoleA@20
;Цикл ожиданий: движение мыши или нажатие ESC.
LOO:
;Координаты курсора.
MOV CRD.X,0
MOV CRD.Y,10
PUSH CRD
PUSH HANDL
CALL SetConsoleCursorPosition@8
;Прочитать одну запись о событии.
PUSH OFFSET CO ;Количество реально почитанных записей.
PUSH 1 ;Количество получаемых записей.
PUSH OFFSET MOUS_KEY ;Буфер для размещения записей.
PUSH HANDL1 ;Дескриптор входного буфера консоли.
CALL ReadConsoleInputA@16
;Проверим, не с мышью ли что?
CMP WORD PTR MOUS_KEY,MOUSE_EV
JNE LOO1
;Здесь преобразуем координаты мыши в строку.
MOV AX,WORD PTR MOUS_KEY+6 ;У - мышь.
;Копирование с обнулением старших битов.
MOVZX EAX,AX
PUSH EAX
MOV AX,WORD PTR MOUS_KEY+4 ;Х - мышь.
;Копирование с обнулением старших битов.
MOVZX EAX,AX
PUSH EAX
PUSH OFFSET FORM
PUSH OFFSET BUF
CALL wsprintfA
;Восстановить стек.
ADD ESP,16
;Перекодировать строку для вывода.
PUSH OFFSET BUF
PUSH OFFSET BUF
CALL CharToOemA@8
;Длина строки.
PUSH OFFSET BUF
CALL LENSTR
;Вывести на экран координаты курсора.
PUSH 0
PUSH OFFSET LENS
PUSH EBX
PUSH OFFSET BUF
PUSH HANDL
CALL WriteConsoleA@20
JMP LOO ;К началу цикла.
LOO1:
;Нет ли события от клавиатуры?
CMP WORD PTR MOUS_KEY,KEY_EV
JNE LOO ;Есть, какое?
CMP BYTE PTR MOUS_KEY+14,27
JNE LOO
;*************************************
;Закрыть консоль.
CALL FreeConsole@0
PUSH 0
CALL ExitProcess@4
RET
;Процедура определения длины строки.
;Строка - [EBP+08H].
;Длина в ЕВХ
LENSTR PROC
ENTER 0,0
PUSH EAX
;----------------------
CLD
MOV EDI,DWORD PTR [EBP+08H]
MOV EBX,EDI
MOV ECX,100 ;Ограничить длину строки.
XOR AL,AL
REPNE SCASB ;Найти символ 0.
SUB EDI,EBX ;Длина строки, включая 0.
MOV EBX,EDI
DEC EBX
;----------------------
POP EAX
LEAVE
RET 4
LENSTR ENDP
_TEXT ENDS
END START