Функции драйвера мыши
Вызов функций управления мышью происходит с помощью программного прерывания 0x33. Номер вызываемой функции должен быть предварительно помещён в регистр AX. Следущая таблица описывает основные функции драйвера мыши, а также входные и выходные параметры.
Номер функции | Входные параметры | Выходные параметры | Описание |
0x00 | AX=0x0000 | Если мышь присутствует, то AX=0xFFFF, BX=число клавиш мыши. Если мышь отсутствует, то AX=0x0000 | Инициализирует драйвер мыши и возвращает его состояние. Если указатель мыши был виден на экране, он удаляется с экрана, и все предварительно установленные пользовательские обработчики событий мыши блокируются. |
0x01 | AX=0x0001 | Выводит на экран указатель мыши и отменяет любую область подавления указателя, установленную ранее функцией 0x10. | |
0x02 | AX=0x0002 | Гасит изображение указателя мыши на экране. Но драйвер продолжает отрабатывать положение мыши. Система поддерживает счётчик, над которым эта функция выполняет операцию декремента, а функция 0x01 - операцию инкремента (если в счётчике не 0). Если в счётчике 0 или становится 0, указатель мыши изображается на экране. При сбросе драйвера мыши (функция 0x00) в счётчик заносится -1 (минус 1). | |
0x03 | AX=0x0003 | BX - состояние клавиш мыши. Значение бит: 0 - установлен, если левая клавиша нажата, 1 - если правая клавиша нажата, 2 - если центральная клавиша нажата. CX - X координата, DX - Y координата. | Возвращает текущее состояние клавиш мыши и положение указателя. Значения координат возвращаются в пикселях независимо от текущего видеорежима. Положение X=0, Y=0 соответствует левому верхнему углу экрана. |
0x04 | AX=0x0004, CX - X координата, DX - Y координата. | Устанавливает положение указателя мыши. Изображение указателя появляется на экране в указанной позиции, если он не погашен (функция 0x02) и не попал в область подавления (функция 0x10). Значения координат указываются в пикселях. | |
0x05 | AX=0x0005, BX - идентификатор клавиши: 0 - левая, 1 - правая, 2 - средняя. | AX - состояние клавиши: 0 - левая клавиша нажата, 1 - правая клавиша нажата, 2 - средняя клавиша нажата. BX - счётчик нажатий указанной клавиши. CX - X координата последнего нажатия клавиши, DX - Y координата последнего нажатия. | Возвращает текущее состояние всех клавиш мыши, а также число нажатий и координаты последнего нажатия заданной клавиши мыши с момента последнего вызова данной функции применительно к заданной клавише. После вызова функции счётчик нажатий укзанной клавиши сбрасывается в 0. |
0x06 | AX=0x0006, BX - идентификатор клавиши: 0 - левая, 1 - правая, 2 - средняя. | AX - состояние клавиши: 0 - левая клавиша нажата, 1 - правая клавиша нажата, 2 - средняя клавиша нажата. BX - счётчик отпусканий указанной клавиши. CX - X координата последнего отпускания клавиши, DX - Y координата последнего отпускания. | Возвращает текущее состояние всех клавиш мыши, а также число отпусканий и координаты последнего отпускания заданной клавиши мыши с момента последнего вызова данной функции применительно к заданной клавише. После вызова функции счётчик отпусканий укзанной клавиши сбрасывается в 0. |
0x07 | AX=0x0007, CX - минимальная X координата, DX - максимальная X координата. | Ограничивает область изображения на экране указателя, назначением минимальной и максимальной X координат указателя мыши. Если минимальное значение больше максимального, эти значения меняются местами. Положение указателя мыши будет при необходимости изменено так, чтобы оно лежало в указанной области. | |
0x08 | AX=0x0008, CX - минимальная Y координата, DX - максимальная Y координата. | Ограничивает область изображения на экране указателя, назначением минимальной и максимальной Y координат указателя мыши. Если минимальное значение больше максимального, эти значения меняются местами. Положение указателя мыши будет при необходимости изменено так, чтобы оно лежало в указанной области. | |
0x09 | AX=0x0009, BX - смещение "горячей точки" от левого края, CX смещение "горячей точки" от верхнего края. ES:DX - адрес буфера образа указателя. | Определяет форму указателя мыши и "горячую точку", которая определяет смещение относительно левого и верхнего края указателя мыши. В этой точке определяются координаты указателя. Буфер образа имеет длину 64 байта. Первые 32 байта содержат битовую маску, выполняющую с изображением на экране операцию логического "И", а вторые 32 байта содержат битовую маску, выполняющую с изображением на экране операцию логического "ИСКЛЮЧАЮЩЕЕ ИЛИ". Размер изображения указателя - 16x16 пикселей. Логические операции производятся с цветом пикселя на экране в текущей позиции указателя и значением бит в байтах буфера образа. | |
0x10 | AX=0x0010, CX - верхняя левая X координата, DX - верхняя левая Y координата, SI - нижняя правая X координата, DI - нижняя правая Y координата. | Определяет область подавления указателя мыши. Если указатель мыши лежит в указанной области, он не отображается на экране. Заданная область подавления может быть заменена новой при следующем вызове данной функции. | |
0x1A | AX=0x001A, BX - число микки по горизонтали, CX - число микки по вертикали. DX - порог удвоения скорости в единицах микки/с. | Устанавливает чувствительность мыши - число микки на 8 пикселей для горизонтального и вертикального перемещений мыши, а также пороговое значение удвоения скорости перемещения указателя на экране. 1 микки примерно равен 1/200 дюйма перемещения мыши. | |
0x1B | AX=0x001B | BX - число микки по горизонтали, CX - число микки по вертикали. DX - порог удвоения скорости в единицах микки/с. | Получение чувствительности мыши - возвращает текущее значение микки на 8 пикселей для вертикального и горизонтального перемещений мыши, а также пороговое значение удвоения скорости перемещения указателя на экране. |
0x24 | AX=0x0024 | BH - главный номер версии (1 для версии 1.02 и т.д.), BL - дополнительный номер версии (2 для версии 1.02 и т.д.). CH - тип мыши: 1 - мышь на магистрали, 2 - последовательная мышь, 3 - мышь InPort, 4 - мышь PS/2, 5 - мышь HP. CL - 0 если мышь PS/2, если нет, то номер IRQ. | Получение информации о мыши. Возвращает номер версии драйвера мыши, а также номер запроса прерывания (IRQ), используемого адаптером мыши. |
Следующий пример демонстрирует работу с драйвером мыши и получает значения X и Y координаты указателя мыши, а также состояние клавиш.
C/C++ | Pascal | Assembler |
#include <dos.h> void
GetMouseState(int &x, int &y, int &buttons) |
Uses Dos; procedure
GetMouseState(var X, Y, Buttons: Integer); |
code
segment assume cs:code,ds:code org 100h start: mov ax, 3 int 33h mov x, cx mov y, dx mov buttons, bx int 20h x dw ? y dw ? buttons dw ? code ends end start |
Ниже приведён исходный текст библиотеки, в которую включены все функции, описанные выше.
#ifndef _MOUSE_H_ #define _MOUSE_H_ #include <dos.h> int InitializeMouseDriver(int&); // функция 0x00 void ShowMouseCursor(); // функция 0x01 void HideMouseCursor(); // функция 0x02 void GetMouseState(int&, int&, int&); // функция 0x03 void SetMousePos(int, int); // функция 0x04 void GetPressed(int, int&, int&, int&, int&); // функция 0x05 void GetReleased(int, int&, int&, int&, int&); // функция 0x06 void SetXRange(int, int); // функция 0x07 void SetYRange(int, int); // функция 0x08 void SetCursorShape(int, int, void far *); // функция 0x09 void SetHideRegion(int, int, int, int); // функция 0x10 void SetMouseSensity(int, int, int); // функция 0x1A void GetMouseSensity(int&, int&, int&); // функция 0x1B void GetMouseInfo(int&, int&, int&, int&); // функция 0x24 // num_buttons - число клавиш мыши int InitializeMouseDriver(int& num_buttons) { struct REGPACK regs; regs.r_ax = 0x00; intr(0x33, ®s); num_buttons = regs.r_bx; return regs.r_ax; } void ShowMouseCursor() { struct REGPACK regs; regs.r_ax = 0x01; intr(0x33, ®s); } void HideMouseCursor() { struct REGPACK regs; regs.r_ax = 0x02; intr(0x33, ®s); } // x - X координата мыши // y - Y координата мыши // buttons - состояние клавиш мыши void GetMouseState(int& x, int& y, int& buttons) { struct REGPACK regs; regs.r_ax = 0x03; intr(0x33, ®s); x = regs.r_cx; y = regs.r_dx; buttons = regs.r_bx; } // x - X координата мыши // y - Y координата мыши void SetMousePos(int x, int y) { struct REGPACK regs; regs.r_ax = 0x04; regs.r_cx = x; regs.r_dx = y; intr(0x33, ®s); } // button - клавиша, для которой определяется число нажатий // buttons - состояние клавиш мыши // count - число нажатий // x - X координата последнего нажатия // y - Y координата последнего нажатия void GetPressed(int button, int& buttons, int& count, int& x, int& y) { struct REGPACK regs; regs.r_ax = 0x05; regs.r_bx = button; intr(0x33, ®s); buttons = regs.r_ax; count = regs.r_bx; x = regs.r_cx; y = regs.r_dx; } // button - клавиша, для которой определяется число отпусканий // buttons - состояние клавиш мыши // count - число отпусканий // x - X координата последнего отпускания // y - Y координата последнего отпускания void GetReleased(int button, int& buttons, int& count, int& x, int& y) { struct REGPACK regs; regs.r_ax = 0x05; regs.r_bx = button; intr(0x33, ®s); buttons = regs.r_ax; count = regs.r_bx; x = regs.r_cx; y = regs.r_dx; } // min - минимальная X координата // max - максимальная X координата void SetXRange(int min, int max) { struct REGPACK regs; regs.r_ax = 0x07; regs.r_cx = min; regs.r_dx = max; intr(0x33, ®s); } // min - минимальная Y координата // max - максимальная Y координата void SetYRange(int min, int max) { struct REGPACK regs; regs.r_ax = 0x08; regs.r_cx = min; regs.r_dx = max; intr(0x33, ®s); } // x - смещение горячей точки от левого края // y - смещение горячей точки от верхнего края // buf - указатель на буфер образа указателя void SetCursorShape(int x, int y, void far *buf) { struct REGPACK regs; regs.r_ax = 0x09; regs.r_bx = x; regs.r_cx = y; regs.r_es = FP_SEG(buf); regs.r_dx = FP_OFF(buf); intr(0x33, ®s); } // x1 - X координата левого верхнего угла // y1 - Y координата левого верхнего угла // x2 - X координата правого нижнего угла // y2 - Y координата правого нижнего угла void SetHideRegion(int x1, int y1, int x2, int y1) { struct REGPACK regs; regs.r_ax = 0x10; regs.r_cx = x1; regs.r_dx = y1; regs.r_si = x2; regs.r_di = y2; intr(0x33, ®s); } // mx - число микки на 8 пикселей по горизонтали // my - число микки на 8 пикселей по вертикали // ds - порог удвоения скорости (микки/с) void SetMouseSensity(int mx, int my, int ds) { struct REGPACK regs; regs.r_ax = 0x1A; regs.r_bx = mx; regs.r_cx = my; regs.r_dx = ds; intr(0x33, ®s); } // mx - число микки на 8 пикселей по горизонтали // my - число микки на 8 пикселей по вертикали // ds - порог удвоения скорости (микки/с) void GetMouseSensity(int& mx, int& my, int& ds) { struct REGPACK regs; regs.r_ax = 0x1B; intr(0x33, ®s); mx = regs.r_bx; my = regs.r_cx; ds = regs.r_dx; } // major - главной номер версии // minor - дополнительный номер версии // type - тип мыши // irq - номер IRQ void GetMouseInfo(int& major, int& minor, int& type, int& irq) { struct REGPACK regs; regs.r_ax = 0x24; intr(0x33, ®s); major = regs.r_bx >> 8; minor = regs.r_bx & 0xFF; type = regs.r_cx >> 8; irq = regs.r_cx & 0xFF; } #endif