Функция 0Ch позволяет программе создать свой собственный драйвер (обработчик) событий, связанных с перемещением мыши, а также с нажатием или отпусканием клавиш мыши.
Регистры на входе: |
AX = 000Ch CX = маска вызова; ES:DX = адрес подключаемого драйвера событий |
Регистры на выходе: |
Регистры не используются |
Биты маски вызова, передаваемой функции в регистре CX, определяют условие вызова драйвера событий:
Бит маски вызова |
Когда выполняется вызов |
0 |
Перемещение мыши |
1 |
Нажатие левой клавиши |
2 |
Отпускание левой клавиши |
3 |
Нажатие правой клавиши |
4 |
Отпускание правой клавиши |
5 |
Нажатие средней клавиши |
6 |
Отпускание средней клавиши |
Если записать в регистр CX значение 7Fh, драйвер будет вызываться при возникновении любого события, а если 00h – драйвер будет отключен.
Адрес процедуры драйвера передается при вызове функции в регистровой паре ES:DX. Драйвер должен быть оформлен в виде процедуры типа FAR, завершающейся командой дальнего возврата RETF.
Когда драйвер получает управление, в регистрах процессора содержатся следующие значения:
Регистр |
Описание |
AX |
Маска вызова, такая же, как и при вызове функции 0Ch |
BX |
Состояние клавиш мыши: бит 0 - левая клавиша; бит 1 - правая клавиша; бит 2 - средняя клавиша |
CX |
Координата X курсора мыши |
DX |
Координата Y курсора мыши |
SI |
Относительное перемещение мыши по горизонтали в миках |
DI |
Относительное перемещение мыши по вертикалив миках |
DS |
Сегмент данных драйвера мыши |
Так как регистр DS при вызове драйвера событий содержит сегмент данных драйвера мыши, ваш драйвер событий должен позаботиться о правильной установке этого регистра. Однако драйвер событий не обязан сохранять и восстанавливать содержимое регистра DS и других регистров процессора.
Отметим, что если вам необходимо отключить драйвер, выполните повторный вызов функции 0Ch, записав в регистр CX нулевое значение. Если ваша программа, устанавливающая собственный драйвер событий, завершает свою работу и передает управление MS-DOS, предварительно она обязательно должна отключить драйвер событий.
Составление программы драйвера событий имеет некоторые особенности. Драйвер событий вызывается не из программы пользователя, а из драйвера мыши. При этом сегментный регистр DS будет указывать на сегмент данных драйвера мыши, а не на сегмент данных вашей программы.
Драйвер событий может также организовать очередь событий, записывая в эту очередь состояние мыши на момент появления события и время появления события. Прикладная программа будет затем извлекать события из очереди и анализировать их.