Определить положение курсора при отпускании клавиши
На входе: AX = 0006h;
BX = клавиша, при отпускании которой запоминается состояние мыши: 0 - левая; 1 - правая; 2 - средняя.
На выходе: AX = состояние клавиш мыши:
бит 0 = 1 - нажата левая клавиша; бит 1 = 1 - нажата правая клавиша; бит 2 = 1 - нажата средняя клавиша (для мыши системы Mouse Systems);
BX = количество нажатий на заданную клавишу, обнуляется после вызова функции;
CX = координата X (по горизонтали); DX = координата Y (по вертикали).
Эта функция возвращает программе состояние мыши, запомненное в момент отпускания клавиши, которая была заранее определена при вызове функции. Она также возвращает количество отпусканий заданной клавиши.
Функция для определения состояния мыши при отпускании заданной клавиши:
/** *.Name ms_querr *.Title Определение состояния мыши при отпускании клавиши * *.Descr Эта функция определяет координаты курсора мыши * и состояние клавиш в момент отпускания заранее * заданной клавиши. * Определенное состояние записывается в структуру * MOUSE_STATE, описанную в файле sysp.h: * * typedef struct _MOUSE_STATE_ { * unsigned bottoms; * unsigned x; * unsigned y; * } MOUSE_STATE; * * Адрес структуры передается функции в качестве * параметра. * *.Proto int ms_querr(MOUSE_STATE *state, int bottom); * *.Params MOUSE_STATE *state - указатель на структуру, * описывающую состояние мыши. * * int bottom - параметр определяет клавишу, * при отпускании которой необходимо * запомнить состояние: * 0 - левая клавиша, * 1 - правая клавиша, * 2 - средняя клавиша. * *.Return Функция возвращает количество отпусканий * заданной клавиши с момента последнего * вызова этой функции. * *.Sample ms_samp3.c **/
#include <stdio.h> #include <dos.h> #include <conio.h> #include "sysp.h"
union REGS reg;
int ms_querr(MOUSE_STATE *state, int bottom) {
reg.x.ax = 6; reg.x.bx = bottom; int86(0x33,®,®);
state->bottoms = reg.x.ax; state->x = reg.x.cx; state->y = reg.x.dx;
return(reg.x.bx); }
Приведем пример программы, которая определяет и выводит на экран состояние мыши при нажатии и отпускании левой клавиши:
#include <dos.h> #include <stdio.h> #include <conio.h> #include "sysp.h"
union REGS reg; void main() {
int botm, i; MOUSE_STATE state; unsigned old_videomode, new_videomode; char buf[20], *bufptr;
// Определяем текущий видеорежим
reg.x.ax = 0x0f00; int86(0x10, ®, ®); old_videomode = reg.h.al;
// Устанавливаем новый видеорежим:
// Устанавливаем максимально допустимую длину строки
buf[0] = 10; printf("\nВведите десятичный номер видеорежима: "); bufptr = cgets(buf);
// Преобразуем введенное число к формату int
new_videomode = atoi(bufptr);
reg.h.ah = 0; reg.h.al = new_videomode; int86(0x10, ®, ®);
// Инициализируем мышь, определяем количество клавиш
if(!ms_init(&botm)) { printf("\nМышь не установлена"); exit(-1); }
printf("\nУстановлена мышь: "); switch (botm) { case 2: printf("двухклавишная"); break; case 3: printf("трехклавишная, системы Mouse Systems"); break; case 0: default: printf("неизвестной системы"); break; } printf("\n\nСостояние мыши:\n\n");
// Включаем курсор
ms_on();
while(!kbhit()) {
// Определяем состояние мыши при нажатии на левую клавишу
i = ms_querp(&state, 0);
// Если были нажатия на левую клавишу, выводим состояние мыши
if(i != 0) {
// Перед выводом на экран отключаем курсор, затем включаем его // снова.
ms_off(); printf("Нажатие: %2d x:%5d y:%5d\n", state.bottoms, state.x, state.y); ms_on();
}
// Выводим состояние при отпускании клавиши
i = ms_querr(&state, 0); if(i != 0) {
ms_off(); printf("Отпускание: %2d x:%5d y:%5d\n\n", state.bottoms, state.x, state.y); ms_on(); } } getch();
ms_off();
reg.h.ah = 0; reg.h.al = old_videomode; int86(0x10, ®, ®);
}