Функции драйвера мыши
![]()
Вызов функций управления мышью происходит с помощью программного прерывания 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
![]()