- •Работа с консолью в среде Windows
- •Организация высокоуровневого консольного ввода-вывода
- •Обработка событий в консольном приложении.
- •Организация низкоуровневого консольного ввода-вывода
- •Поддержка работы с мышью в консольном приложении.
- •Поддержка работы с клавиатурой в консольном приложении
- •Задание для самостоятельной работы
- •Задание для самостоятельной работы
Обработка событий в консольном приложении.
При написании консольного приложения можно проанализировать некоторые события, которые происходят, когда консольное окно выведено на экран монитора. К таким событиям относятся:
Нажатие комбинации клавиш Ctrl+C
Нажатие комбинации клавиш Ctrl+Break
Закрытие консольного окна процесса
Завершение работы пользователя в системе (завершение сеанса пользователя)
Завершение работы системы (выключение компьютера)
При возникновении таких событий можно выполнить необходимые разработчику программы действия. По умолчанию обрабатывается только одно событие – закрытие консольного окна, – для которого вызывается функция ExitProcess.
Однако программист может написать одну или несколько функций в своей программе, которые будут выполняться при наступлении этих событий. Если в языках высокого уровня различны такие понятия как процедура и функция, то в ассемблере они эквивалентны. (функции-обработчики заносятся в список; первой срабатывает та функция, которая занесена последней).
Такие функции должны возвращать результат в регистре EAX:
если в регистре EAX будет возвращено значение 1, то это будет означать, что функция выполнила обработку произошедшего события, и управление будет передано основному алгоритму.
если в регистре EAX будет возвращено значение 0, то это будет означать, что обработка события не выполнена, и управление будет передано функции-обработчику, которая была включена в список функций-обработчиков раньше данной.
Для того, чтобы указать на какую функцию перейти при возникновении события, применяется API-функция SetConsoleCtrlHandler.
Формат ее вызова следующий:
invoke SetConsoleCtrlHandler, HandlerRoutine, Add
где:
HandlerRoutine - указатель на функцию, которая будет обрабатывать события консольного приложения
Add – признак добавления функции-обработчика в список или удаления функции-обработчика из списка (1 – добавить, 0 - удалить).
Указатель на функцию, которая будет обрабатывать события консольного приложения, необходимо сохранить в регистре еах. Это связано с тем, что описание функции происходит после команды invoke ExitProcess,0 и до end start:
invoke ExitProcess,0
описание функции
end start
Например,
mov eax, offset CtrlHandler
invoke SetConsoleCtrlHandler, eax, 1
Если в языках высокого уровня различны такие понятия как процедура и функция, то в ассемблере они эквивалентны. Для описания функции в Ассемблере в простейшем случае применяется следующая конструкция:
имя_функции proc список_параметров
…
команды функции
…
ret
имя_ функции endp
имя_процедуры – это метка, определяющая начало процедуры. Определить адрес этой метки относительно начала сегмента кода (то есть указатель на данную процедуру) можно с помощью оператора OFFSET (поскольку используется плоская модель и все сегменты начинаются с одного адреса).
список_параметров – представляется в виде перечисления через запятую следующих конструкций:
имя_параметра:тип_параметра
Процедура-обработчик (написанная нами) должна иметь один 32-битный параметр, через который будет передаваться в функцию информация о том, какое событие произошло. Описать этот параметр можно следующим образом:
dwCtrlType:DWORD
Этот параметр может принимать следующие значения:
0 = CTRL_C_EVENT – произошло нажатие клавиш Ctrl+C;
1 = CTRL_BREAK_EVENT – произошло нажатие клавиш Ctrl+Break;
2 = CTRL_CLOSE_EVENT – пользователь закрывает консольное окно;
5 = CTRL_LOGOFF_EVENT – пользователь завершает работу в системе (завершение сеанса пользователя);
6 = CTRL_SHUTDOWN_EVENT – пользователь завершает работу системы (завершает работу компьютера).
Задание для самостоятельной работы:
Написать программу консольного приложения, предназначенного для организации ввода нескольких строк. В программе предусмотреть обработку следующих событий: нажатие Ctrl+C, нажатие Ctrl+Break, закрытие окна консольного приложения, завершение сеанса пользователя в системе Windows. В качестве реакции на указанные события вывести в консольном окне сообщение, соответствующее каждому из них.
