C 鼠标控制

来源:互联网 发布:excel统计重复数据 编辑:程序博客网 时间:2024/06/06 09:56

引自……


鼠标的操作是使用dos中断功能,中断号:33h


下面给几个操作鼠标的示例,后面有更详细的中断功能说明及代码。

显示鼠标:union REGS regs; 
regs.x.ax=1; 
int86(0x33,&regs,&regs);

检查是否被按下: union REGS regs; 
regs.x.ax=6; 
int86(0x33,&regs,&regs); 
返回值在bx寄存器中; 
在实际编程中一般要使用循环不断的检验是否被按下!

检验鼠标位置:union REGS regs; 
regs.x.ax=3; 
int86(0x33,&regs,&regs); 
返回值:x坐标在regs.h.cx 
y坐标在regs.h.dx
*/

/*下面是各值对鼠标的设置功能

(1)、功能00H

功能描述: 初始化鼠标,该操作只需要执行一次 
入口参数: AX=00H 
出口参数: AX=0000H——不支持鼠标功能,FFFFH——支持鼠标功能
BX=鼠标按钮个数(在支持鼠标功能时)
在支持鼠标功能的情况下,鼠标还被设置如下参数: 1、 鼠标指针放在屏幕中央 
2、 如果当前鼠标指针是显示的,则操作后,鼠标指针被隐藏 


3、 鼠标指针的显示页为0 
4、 根据屏幕的显示模式显示鼠标指针:文本—反向显示矩形块,图形—尖头形状 
5、 水平象素比=8:8,垂直象素比=16:8 
6、 设置水平和垂直的显示边界为当前显示模式的最大边界 
7、 允许光笔仿真 
8、 双速门槛值=64 

(2)、功能01H

功能描述: 显示鼠标指针,通常在鼠标初始化后,用此功能显示其指针 
入口参数: AX=01H 
出口参数: 无 

(3)、功能02H

功能描述: 隐藏鼠标指针,一般在程序结束时,调用此功能 
入口参数: AX=02H 
出口参数: 无 

(4)、功能03H

功能描述: 读取鼠标位置及其按钮状态 
入口参数: AX=03H 
出口参数: BX=按键状态: 位0=1——按下左键 
位1=1——按下右键 
位2=1——按下中键 
其它位——保留,内部使用 
CX=水平位置 
DX=垂直位置 

(5)、功能04H

功能描述: 设置鼠标指针位置 
入口参数: AX=04H,CX=水平位置,DX=垂直位置 
出口参数: 无 

(6)、功能05H

功能描述: 读取鼠标按键信息 
软件开发网 www.mscto.com


入口参数: AX=05H,BX=指定的按键:0—左键,1—右键,2—中键 
出口参数: AX=按键状态,参见功能3H中BX的说明
BX=按键次数
CX=水平位置(最后按键时)
DX=垂直位置(最后按键时) 

(7)、功能06H

功能描述: 读取鼠标按钮释放信息 
入口参数: AX=06H,BX=指定的按键:0—左键,1—右键,2—中键 
出口参数: AX=按键状态,参见功能3H中BX的说明
BX=释放的次数
CX=水平位置(最后释放时)
DX=垂直位置(最后释放时) 

(8)、功能07H

功能描述: 设置鼠标水平边界 
入口参数: AX=07H
CX=最小水平位置
DX=最大水平位置 
出口参数: 无,鼠标有可能因新区域变小而自动移进新区域内 

(9)、功能08H

功能描述: 设置鼠标垂直边界 
入口参数: AX=08H
CX=最小垂直位置
DX=最大垂直位置 
出口参数: 无,鼠标有可能因新区域变小而自动移进新区域内 

(10)、功能09H

功能描述: 设置图形鼠标形状 
入口参数: AX=09H
BX=指针的水平位置
CX=指针的垂直位置
ES:DX=16×16位光标的映象地址 参数说明: (BX,CX)是鼠标的指针在16×16点阵中的位置,(0,0)是左上角; 


ES:DX指向的存储单元内存放16×16点阵的位映象隐码,紧跟其后的是16×16点阵的光标掩码。 
鼠标指针的显示方法: 位映象隐码“逻辑与”上屏幕显示区的内容,然后再用光标掩码内容“异或”前面运算的结果。 

出口参数: 无 

*/
/*

(11)、功能0AH

功能描述: 设置本文鼠标形状 
入口参数: AX=0AH
BX=光标类型: 0 — CX和DX的各位含义如下: 位7~0 鼠标指针符号 
位10~8 字符前景色 
位11 亮度 
位14~12 字符背景色 
位15 闪烁 

1 — CX=光标的起始扫描线
DX=光标的结束扫描线 

出口参数: 无 

(12)、功能0BH

功能描述: 读取鼠标移动计数 
入口参数: AX=0BH 
出口参数: CX=水平移动距离:正数——向右移,负数——向左移
DX=垂直移动距离:正数——向下移,负数——向上移 

(13)、功能0CH

功能描述: 为鼠标事件设置处理程序 
入口参数: AX=0CH
CX=中断掩码 位0=1 ——鼠标指针位置发送变化 
位1=1 ——按下左按钮 

位2=1 ——释放左按钮 
位3=1 ——按下右按钮 
位4=1 ——释放右按钮 
位5=1 ——按下中间按钮 
位6=1 ——释放中间按钮 
位7~15=0 ——保留 

ES:DX=中断处理程序的地址

在进入中断处理程序时,有关寄存器的值含义:
  AX=中断掩码
  BX=按键状态
  CX=鼠标指针的水平位置
  DX=鼠标指针的垂直位置
  SI=水平位置的变化量
  DI=垂直位置的变化量

出口参数: 无 

(14)、功能0DH

功能描述: 允许光笔仿真 
入口参数: AX=0DH 
出口参数: 无 

(15)、功能0EH

功能描述: 关闭光笔仿真 
入口参数: AX=0EH 
出口参数: 无 

(16)、功能0FH

功能描述: 设置鼠标计数与象素比 
入口参数: AX=0FH
CX=水平比例
DX=垂直比例 
出口参数: 无 

(17)、功能10H

功能描述: 设置鼠标指针隐藏区域 
入口参数: AX=10H
CX=左上角X坐标
DX=左上角Y坐标
SI=右下角X坐标 

DI=右下角Y坐标 
出口参数: 无 

(18)、功能13H

功能描述: 设置倍速的阈值,其缺省值为64 
入口参数: AX=13H
DX=阀值 
出口参数: 无 

(19)、功能14H

功能描述: 替换鼠标事件中断 
入口参数: AX=14H
CX=中断掩码
ES:DX=中断处理程序的地址 
出口参数: CX=旧的中断掩码
ES:DX=旧的中断处理程序地址 

(20)、功能15H

功能描述: 读取鼠标驱动器状态的缓冲区大小 
入口参数: AX=15H 
出口参数: BX=存放鼠标驱动器状态所需缓冲区的大小 

(21)、功能16H
功能描述: 存储鼠标驱动器状态 
入口参数: AX=16H
ES:DX=存储鼠标驱动器状态的地址 
出口参数: 无 

(22)、功能17H

功能描述: 重装鼠标驱动器状态 
入口参数: AX=17H
ES:DX=鼠标驱动器状态的地址 
出口参数: 无 

(23)、功能18H

功能描述: 为鼠标事件设置可选的处理程序 
入口参数: AX=18H
CX=替换中断掩码
ES:DX=替换中断处理程序的地址
CF=0 
出口参数: 无 

*/
/*

(24)、功能19H

功能描述: 读取替换处理程序的地址 
入口参数: AX=19H
CX=替换中断掩码 
出口参数: 若AX=-1——不成功,否则,ES:DX=中断处理程序的地址 

(25)、功能1AH

功能描述: 设置鼠标的灵敏度,其取值1~100 
入口参数: AX=1AH
BX=水平灵敏度(每8个象素鼠标需要移动的数量,一般为8)
CX=垂直灵敏度(每8个象素鼠标需要移动的数量,一般为16)
DX=倍速阀值 
出口参数: 无 

(26)、功能1BH

功能描述: 读取鼠标的灵敏度 
入口参数: AX=1BH 
出口参数: BX=水平灵敏度
CX=垂直灵敏度
DX=倍速阀值 

(27)、功能1CH

功能描述: 设置鼠标中断速率 
入口参数: AX=1CH
BX=每秒钟中断的次数:0—关中断,1—30/S,2—50/S,3—100/S,4—200/S 
出口参数: 无 

(28)、功能1DH

功能描述: 为鼠标指针选择显示页 
入口参数: AX=1DH
BX=显示页 
出口参数: 无 

(29)、功能1EH

功能描述: 读取鼠标指针的显示页 软件开发网 www.mscto.com 
入口参数: AX=1EH 
出口参数: BX=显示页 

(30)、功能1FH

功能描述: 禁止鼠标驱动程序 
入口参数: AX=1FH 
出口参数: 若AX=-1——不成功,否则,ES:BX=鼠标驱动程序的地址 

(31)、功能20H

功能描述: 启动鼠标驱动程序 
入口参数: AX=20H 
出口参数: 无 

(32)、功能21H

功能描述: 鼠标驱动程序复位 
入口参数: AX=21H 
出口参数: 若AX=-1——不成功,否则,BX=2 

(33)、功能22H

功能描述: 设置鼠标驱动程序信息语言 
入口参数: AX=22H
BX=语言代码:0—英语,1—法语,2—荷兰语,3—德语,4—瑞典语,5—芬兰语,6—西班牙语,7—葡萄牙语,8—意大利语 
出口参数: 无 

(34)、功能23H

功能描述: 读取语种 
入口参数: AX=23H 
出口参数: BX=语言代码 

(35)、功能24H

功能描述: 读取鼠标信息 
入口参数: AX=24H 
出口参数: BH=主版本号,BL=辅版本号
CL=中断请求号
CH=鼠标类型:1-Bus Mouse,2-Serial Mouse,3-InPort Mouse,4-PS/2 Mouse,5-HP Mouse 


(36)、功能25H

功能描述: 读取鼠标驱动程序信息 
入口参数: AX=25H 
出口参数: AX=鼠标驱动程序信息: 位15 ——0: 驱动程序是.SYS文件,否则,为.COM文件 
位14——0: 不完全鼠标显示驱动程序,否则,为完全的 
位13-12——00: 软件文本光标 
01: 硬件文本光标 
1X: 图形光标 

(37)、功能26H

功能描述: 读取最大有效坐标 
入口参数: AX=26H 
出口参数: BX=鼠标驱动程序状态
CX=最大水平坐标
DX=最大垂直坐标

*/ 
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#include<graphics.h>
#include<dos.h>
/*鼠标信息宏定义*/
#define WAITING 0xff00
#define LEFTPRESS 0xff01
#define LEFTCLICK 0xff10
#define LEFTDRAG 0xff19
#define RIGHTPRESS 0xff02
#define RIGHTCLICK 0xff20
#define RIGHTDRAG 0xff2a
#define MIDDLEPRESS 0xff04
#define MIDDLECLICK 0xff40
#define MIDDLEDRAG 0xff4c 

#define MOUSEMOVE 0xff08

int hide[16][16], bury[16][16],mousedraw[16][16],pixelsave[16][16];/*分别定义隐码、掩码、点值*/
int mousebutton,mouseexist,mouseX,mouseY;
void mousepicture() /*画心形,可设置其它的图形*/
{
   int i,j,k;
   long hidenum[16]={
   0xe3c7,0xc183,0x8001,0x0000,
   0x0000,0x0000,0x0000,0x8001,
   0x8001,0xc003,0xe007,0xf00f,
   0xf81f,0xfc3f,0xfe7f,0xffff,
} ; /*隐码点值,是对点素进行设置*/
long burynum[16]={ 
0x1c38,0x3e7c,0x7ffe,0xffff,
0xffff,0xffff,0xffff,0x7ffe,
0x3ffe,0x3ffc,0x1ff8,0x0ff0,
0x07e0,0x03c0,0x0180,0x0000,
};/*掩码点值*/
for(i=0;i<16;i++)

   while(hidenum[i]!=0) 
   { 
     for(j=15;j>=0;j--) 
     { 
        hide[i][j]=hidenum[i]%2; 
        hidenum[i]/=2; 
     } /*把隐码转化为0-1*/ 
   } 
   while(burynum[i]!=0) 
   { 
     for(k=15;k>=0;k--) 
     { 
        bury[i][j]=burynum[i]%2; 
        burynum[i]/=2; 
     } 
   } 
   for(k=0;k<16;k++) 
   { 
     if(hide[i][k]==0&&bury[i][k]==0)
       mousedraw[i][k]=1; 
     else if(hide[i][k]==0&&bury[i][k]==1) 

       mousedraw[i][k]=2; 
     else if(hide[i][k]==1&&bury[i][k]==0)
       mousedraw[i][k]=3; 
     else
       mousedraw[i][k]=4; /*期间实行逻辑与和异或*/ 
    } 
  } 
}

void mouseon(int x,int y) /*显示鼠标*/
{
int i,j;
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
{
pixelsave[i][j]=getpixel(x+j,y+i);/*取得指定像素的颜色*/
if(mousedraw[i][j]==1)
putpixel(x+j,y+i,6);
if(mousedraw[i][j]==2) /*1、2采用点的逻辑运算判断进行着色*/
putpixel(x+j,y+i,6);
}
}
}

void mouseoff() /*消失鼠标 */

int i,j,x,y,color;
x=mouseX;
y=mouseY;
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
{
if((mousedraw[i][j]==3)||(mousedraw[i][j]==4)) /*3、4采用点的逻辑运算判断可否继续运行*/ 
continue;
putpixel(x+j,y+i,BLACK); /*使其鼠标移动前的位置变为黑色*/
putpixel(x+j,y+i,pixelsave[i][j]);/*使其恢复指定像素的颜色*/
  }
}
}

/*鼠标是否加载
MouseExist:1=加载
0=未加载
MouseButton:鼠标按键数目 */
void mouseload()
{
_AX=0x00;
geninterrupt(0x33);
mouseexist=_AX;
mousebutton=_BX;
}

/*鼠标状态值初始化*/
void mousereset()
{
_AX=0x00;
geninterrupt(0x33);/*0x33是DOS中断,是在DOS下通过调用中断来对鼠标进行操作.*/
}

/*改变鼠标光标形状
SHAPE sp:为以上定义的形状
void MouseShape(SHAPE sp)
{
_BX=sp.hotx;
_CX=sp.hoty;
_ES=FP_SEG(&sp.shape);
_DX=FP_OFF(&sp.shape);
_AX=0x09;
geninterrupt(0x33);
}*/

/*设置鼠标左右边界
lx:左边界
gx:右边界 */
void mousesetX(int lx,int rx)
{
_CX=lx;
_DX=rx;
_AX=0x07;
geninterrupt(0x33);
}

/*设置鼠标上下边界 
uy:上边界
dy:下边界 */
void mousesetY(int uy,int dy)
{
_CX=uy;
_DX=dy;
_AX=0x08;
geninterrupt(0x33);
}

/*设置鼠标当前位置
x:横向坐标
y:纵向坐标 */
void mousesetXY(int x,int y)
{
_CX=x;
_DX=y;
_AX=0x04;
geninterrupt(0x33);
}

/*设置鼠标速度(缺省值:vx=8,vy=1)
值越大速度越慢 */
void mousespeed(int vx,int vy)
{
_CX=vx;
_DX=vy;
_AX=0x0f;
geninterrupt(0x33);
}

/*获取鼠标按下键的信息*/
/*是否按下左键
返回值: 1=按下 0=释放*/
int leftpress()
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&1);
}

/*是否按下中键
返回值同上 */
int middlepress()
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&4);
}

/*是否按下右键
返回值同上 */
int rightpress()
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&2);
}

/*获取鼠标当前位置*/
void mousegetXY() 

{
_AX=0x03;
geninterrupt(0x33);
mouseX=_CX;
mouseY=_DX;
}
int mousemove()/*鼠标移动;*/
{
int i,j,x,y,color,move,press=0;
x=mouseX;
y=mouseY;
move=0; /*没移动标志*/
if(mouseX!=x||mouseY!=y)
{
move=1;/*判断是否有移动*/
mouseon(mouseX,mouseY);
}
return 1;
}

void main()
{
int gdrive=DETECT,gmode;
initgraph(&gdrive,&gmode,"");
mousepicture();
outtextxy(200,150,"Mouse");
mousesetY(0,getmaxy());
mousesetX(0,getmaxx()); /*设置鼠标移动范围*/
mousesetXY(100,100);/*
mouseon(mouseX,mouseY);初始鼠标位置*/
while(!kbhit())
{
if(mousemove())
{
mouseoff();
mousegetXY();
mouseon(mouseX,mouseY);
}
}
closegraph();
}

原创粉丝点击