#include
#include
union REGS reg;
void MouseReset() // 鼠标初始化
#include<dos.h>
#include<stdio.h>
union REGS reg;
void MouseReset() // 鼠标初始化
{
reg.x.ax = 0x00;
int86(0x33,®,®);
// 此时 reg.x.bx 中是鼠标按键的情况(那些键被按下)
// reg.x.ax 是此次中断的结果(基本不用理会)
}
void MouseShow() // 显示鼠标
{
reg.x.ax = 0x01;
int86(0x33,®,®); // 没有返回值
}
void MouseHide() // 隐藏鼠标
{
reg.x.ax = 0x02;
int86(0x33,®,®);
}
void CheckMousePos() // 查询 x,y 的位置和按键情况
{
reg.x.ax = 0x03;
int86(0x33,reg,reg);
// 此时 reg.x.cx 是 x 坐标的位置
// reg.x.dx 是 y 坐标的位置
// reg.x.bx 是按键的情况
}
unsigned int sign,s2; // 用于存放按键情况
void main()
{
MouseReset(); // 鼠标初始化
MouseShow(); // 显示鼠标
while(1) // 循环检测事件
{
sign = reg.x.bx; // 保存原来的情况
CheckMousePos(); // 得到新的情况
s2 = reg.x.bx; // 保存新的情况
if (sign!=s2) // 如果原来的情况不等于新的情况
{
if ((s2>>1)!=(sign>>1)) // 测试左键
{
if ((s2>>1)==1)
printf("lpress\n"); // 1 表示按下,0表示放开
else
printf("lrelease\n");
}
if (((s2&1))!=((sign&1))) // 右键
{
if (((s2&1))==1)
printf("rpress\n");
else
printf("rrelease\n");
}
// 此处的判断情况请见下
}
printf("x=%d,y=%d\n",r.x.cx,r.x.dx); // 坐标
}
}
// 通用寄存器 BX 共有 16 位
// 000000000000000
// 当按下左键时
// 000000000000010 -> 第2位变为1
// 通过右位移一位后变为
// 000000000000001 -> 此时检测 = 1 还是 = 0 即可得知是否按下左键
// 当按下右键时
// 000000000000001 -> 第1位变为1
// &1 后变为(除第1位都归零,此时能排除)
// 000000000000001 -> 此时检测 = 1 还是 = 0 即可得知是否按下右键
// 左右一块按的情况类似,不再叙述