分享
 
 
 

Dos下的鼠标完全控制类 --- 使用它可以很好的控制你的Dos程序中的鼠标事件!

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

// Copyright(c) SuperSpirit Studio,Superspirit

#ifndef XRH_MOUSE_LIARBRY

#define XRH_MOUSE_LIARBRY

#include <DOS.H>

#include <STDIO.H>

#include <CONIO.H>

#include <STDLIB.H>

#define MOUSE_INTERRUPT 0x33

#define MOUSE_MAX_EVENT 3

#define Is_Here(x,y,x0,y0) (-Here_Range<=(((x)-(x0))>0?((x)-(x0)):((x0)-(x)))&&Here_Range>=(((x)-(x0))>0?((x)-(x0)):((x0)-(x)))&&-Here_Range<=(((y)-(y0))>0?((y)-(y0)):((y0)-(y)))&&Here_Range>=(((y)-(y0))>0?((y)-(y0)):((y0)-(y))))

int far Here_Range=2; // Mouse Click Range

int far Mouse_Locked=0; // Mouse Locked Switch 0-> Unlocked ,1->Locked

int far DBclick_Delay=6;// Mouse Double Clicked Time 1==> 1/18.2(s)

struct Mouse_Status{

int Mouse_x;

int Mouse_y;

int Mouse_Button_Status; // 现时鼠标按键状态

// bit0-左键

// bit1-右键

// bit2-中键

// 0-释放状态 1-按下状态

}Mouse_Now_Status;

struct Mouse_Event{

int Mouse_x;

int Mouse_y;

int Which_Button; // 1 Left Button,2 Right Button,4 Middle

int Event_ID;

// Event_ID =0 Nothing Happend!

// Event_ID =1 Mouse Moving.

// Event_ID =2 Click Event Happend.

// Event_ID =3 Mouse Button Down.

// Event_ID =4 Mouse Button Up.

// Event_ID =5 Double Click Event Happend.

unsigned Button_Status;

};

// Mouse_Event far Event[MOUSE_MAX_EVENT]={0,0,0};// Event Stack To Restore 3 Event Maxium.

Mouse_Event far Event={0,0,0,0,0};

// int far Full=0,Empty=1;// Full=1,Event Full;Empty=1,Event Empty.

// int far Event_Start=0,Event_End=0;

// int far Mouse_Button_Num=0;

unsigned long far Click_Time[3]={0,0,0};

unsigned long far *Time_p_=((unsigned long far *)0x0000046cl);

// Can Not Load *Time_p_ Correctly And Get Right Data ,I Don't Know Why?

int far OldEvent=0;

int far User_App_Running=0;

unsigned far Old_Event_Mask=0;

int far Old_M_x=-1,far Old_M_y=-2;

int far DB_Old_x=-1,far DB_Old_y=-2;

// int far Mouse=0;

const unsigned far _Mouse_Move_ =0x01,far _L_Button_Down_=0x02,far _L_Button_Up_=0x04;

const unsigned far _R_Button_Down_=0x08,far _R_Button_Up_ =0x10, far _M_Button_Down_=0x20;

const unsigned far _M_Button_Up_=0x40;

const unsigned far _Mouse_Nothing_=0,/*far _Mouse_Move_=1, */far _Mouse_Button_Click_=2,far _Mouse_Button_Down_=3,far _Mouse_Button_Up_=4,far _Mouse_Button_DBclick_=5;

const unsigned far _L_Button_=1,far _R_Button_=2,far _M_Button_=4;

void far User_App();

// int far Is_Here(int x,int y,int x0,int y0);

int far Hand_Shape[2][16] =

{

0xf3ff,0xe1ff,0xe1ff,0xe1ff,

0xe001,0xe000,0xe000,0xe000,

0x8000,0x0000,0x0000,0x0000,

0x0000,0x0000,0x8001,0xc003,

0x0000,0x0c00,0x0c00,0x0c00,

0x0c00,0x0db6,0x0db6,0x0db6,

0x0db6,0x6ffe,0x6ffe,0x6ffe,

0x7ffe,0x7ffe,0x3ffc,0x0000

};

int far Arrow_Shape[2][16] =

{

0xffff,0xffff,0xffff,0xffff,

0xffff,0xffff,0xffff,0xffff,

0xffff,0xffff,0xffff,0xffff,

0xffff,0xffff,0xffff,0xffff,

0x0000,0x4000,0x6000,0x7000,

0x7800,0x7c00,0x7e00,0x7f00,

0x7f80,0x7e00,0x7c00,0x4600,

0x0600,0x0300,0x0300,0x0180

};

int far Aim_Shape[2][16] =

{

{0xffff,0xffff,0xffff,0xffff,

0xffff,0xffff,0xffff,0xffff,

0xffff,0xffff,0xffff,0xffff,

0xffff,0xffff,0xffff,0xffff},

{0x0100,0x0fe0,0x0100,0x0100,

0x4104,0x4104,0x4104,0xfffe,

0x4104,0x4104,0x4104,0x0100,

0x0100,0x0fe0,0x0100,0x0000,

}

};

class MyMouse

{

public:

static int MyMouse_Object_Num;

private:

REGPACK regs;

static int Mouse; // 1= Mouse Driver Exist,0=Mouse Driver Not Exist,Error.

static int Mouse_Button_Num; // Number Of Your Mouse Button.

void Mouse_Setup_User_Application(void far User_App(),unsigned Event_Mask);

// 挂接用户鼠标中断处理程序

// 输入参数: AX=0ch

// CX=事件屏蔽(event_mask)

// bit0-鼠标移动

// bit1-鼠标左键按下

// bit2-鼠标左键释放

// bit3-鼠标右键按下

// bit4-鼠标右键释放

// bit5-鼠标中键按下 (Mouse Systems/Logitech mouse)

// bit6-鼠标中键释放 (Mouse Systems/Logitech mouse)

// 各位置1 - 发生相应动作时调用用户程序

// DX=指向中断子程序的远指针的偏移地址

// ES=指向中断子程序的远指针的段移地址

// 返回值: 无

// 注释:当子程序被调用, 它会传递以下参数:

// AX = 发生的事件 (与定义事件屏蔽相对应)

// BX = 按键状态

// CX = 当前鼠标光标X轴坐标

// DX = 当前鼠标光标Y轴坐标

// SI = 水平移动计数增量(mickey)

// DI = 垂直移动计数增量(mickey)

// 某些版本的Microsoft的驱动程序返回错误的状态─CX bit 0 表示鼠标移动

// 并且交换了SI和DI的内容

void Mouse_Unload_User_Application();

public:

static char Mouse_Cursor_Visible;

// void far User_App();

int Mouse_Reset(); // Detect And Reset Mouse Driver.

Mouse_Event Now_Event; /* Contain the mouse event and position,very important, We get Mouse Event From this global variable */

void Mouse_Show_Cursor();

void Mouse_Hide_Cursor();

void Mouse_Get_Status(Mouse_Status& Status);

void Mouse_Move_Cursor(int x,int y);

int Mouse_Get_Event();

void Mouse_Setup_Cursor(int Mode_Num=0);

// 2 -> Aim_Shape; 1-> Hand_Shape ; 0-> Arrow_Shape

MyMouse();

~MyMouse();

};

char MyMouse::Mouse_Cursor_Visible=2;

int MyMouse::MyMouse_Object_Num=0;

int MyMouse::Mouse=0;

int MyMouse::Mouse_Button_Num=0;

void MyMouse::Mouse_Setup_Cursor(int Mode_Num)

{

REGPACK regs;

regs.r_ax=9;

switch(Mode_Num)

{

case 2: regs.r_bx=7;

regs.r_cx=7;

regs.r_dx=FP_OFF(&::Aim_Shape);

regs.r_es=FP_SEG(&::Aim_Shape);

break;

case 1:

regs.r_bx=4;

regs.r_cx=0;

regs.r_dx=FP_OFF(&::Hand_Shape);

regs.r_es=FP_SEG(&::Hand_Shape);

break;

case 0:

default: regs.r_bx=0;

regs.r_cx=0;

regs.r_dx=FP_OFF(&::Arrow_Shape);

regs.r_es=FP_SEG(&::Arrow_Shape);

break;

}

intr(MOUSE_INTERRUPT,&regs);

return;

}

int MyMouse::Mouse_Reset() // Detect And Reset Mouse Driver.

{

REGPACK regs;

regs.r_ax=0x0000;

intr(MOUSE_INTERRUPT,&regs);

if (regs.r_ax==0xffff)

{Mouse=1;Mouse_Button_Num=regs.r_bx;}

else

Mouse=0;

return Mouse;

}

/*

int MyMouse::Mouse_Reset()

{

regs.r_ax=0x0000;

intr(MOUSE_INTERRUPT,&regs);

if (regs.r_ax==0xffff)

{

Mouse_Button_Num=regs.r_bx;

return 1;

}

else

{

Mouse_Button_Num=0;

return 0;

}

}

*/

void MyMouse::Mouse_Show_Cursor()

{

// if(Mouse_Cursor_Visible==1) return;

if (Mouse)

{

regs.r_ax=0x0001;

intr(MOUSE_INTERRUPT,&regs);

}

Mouse_Cursor_Visible=1;

}

void MyMouse::Mouse_Hide_Cursor()

{

// if(!Mouse_Cursor_Visible) return;

if (Mouse)

{

regs.r_ax=0x0002;

intr(MOUSE_INTERRUPT,&regs);

}

Mouse_Cursor_Visible=0;

}

void MyMouse::Mouse_Get_Status(Mouse_Status& Status)

{

if (Mouse)

{

regs.r_ax=0x0003;

intr(MOUSE_INTERRUPT,&regs);

Status.Mouse_x=regs.r_cx;

Status.Mouse_y=regs.r_dx;

Status.Mouse_Button_Status=regs.r_bx & 0x0007;

}

}

void MyMouse::Mouse_Setup_User_Application(void far User_App(),unsigned Event_Mask)

{

REGPACK regs;

if (Mouse)

{

unsigned Sega=FP_SEG(User_App),Offa=FP_OFF(User_App);

regs.r_ax=0x000c;

regs.r_cx=Event_Mask; // 0x1F;

regs.r_dx=Offa;

regs.r_es=Sega;

intr(MOUSE_INTERRUPT,&regs);

// regs.r_ax=0x0003;

// intr(MOUSE_INTERRUPT,&regs);

// Mouse_Get_Status(Mouse_Now_Status);

}

}

void MyMouse::Mouse_Unload_User_Application()

{ REGPACK regs;

if (Mouse)

{

regs.r_ax=0x000c;

regs.r_cx=0;

intr(MOUSE_INTERRUPT,&regs);

}

}

void MyMouse::Mouse_Move_Cursor(int x,int y)

{

if (Mouse)

{

regs.r_ax=0x0004;

regs.r_cx=x;

regs.r_dx=y;

intr(MOUSE_INTERRUPT,&regs);

}

}

int MyMouse::Mouse_Get_Event()

{

Now_Event=::Event;

(::Event).Event_ID=0;

return Now_Event.Event_ID;

}

MyMouse::MyMouse()

{

if(!MyMouse_Object_Num)

{ Mouse_Reset();

if(!Mouse)

{

// clrscr();

printf("\n Mouse Driver Not Found,Installing A MicroSoft Mouse Driver,Please!");

exit(0);

}

Mouse_Setup_User_Application(::User_App,0x1F);

// Mouse_Setup_Cursor(1);

}

MyMouse_Object_Num++;

Now_Event.Event_ID=0;

::Click_Time[0]=::Click_Time[1]=::Click_Time[2]=0;

return;

}

MyMouse::~MyMouse()

{

MyMouse_Object_Num--;

if(!MyMouse_Object_Num)

Mouse_Unload_User_Application();

return;

}

/*

int far Is_Here(int x,int y,int x0,int y0)

{

int X=0,Y=0;

X=x-x0;

Y=y-y0;

if(X<0)X=-X;

if(Y<0)Y=-Y;

if( -Here_Range<=X&&X<=Here_Range&&-Here_Range<=Y&&Y<=Here_Range)

return 1;

return 0;

}

*/

void far User_App()

{

unsigned Mevent=_AX,Mstatus=_BX;

int Mx=_CX,My=_DX;

if(User_App_Running) return;

if(Mouse_Locked) return;

// OldEvent=2;

/*if(Event.Event_ID==2)

OldEvent=Event.Event_ID;*/

User_App_Running=1;

unsigned long NewTime;

if(Mevent&_Mouse_Move_)

{

Event.Event_ID=_Mouse_Move_;

Event.Mouse_x=Mx;

Event.Mouse_y=My;

Event.Button_Status=Mstatus;

User_App_Running=0;

return;

}

else

{

if(Mevent&_L_Button_Down_)

{

Event.Event_ID=_Mouse_Button_Down_;

Event.Mouse_x=Mx;

Event.Mouse_y=My;

Old_M_y=Event.Mouse_y;

Event.Button_Status=Mstatus;

Event.Which_Button=_L_Button_;

Old_Event_Mask=Mevent;

Old_M_y=My;

Old_M_x=Mx;

User_App_Running=0;

return;

}

if(Mevent&_R_Button_Down_)

{

Event.Event_ID=_Mouse_Button_Down_;

Event.Mouse_x=Mx;

Event.Mouse_y=My;

Event.Button_Status=Mstatus;

Event.Which_Button=_R_Button_;

Old_Event_Mask=Mevent;

Old_M_y=My;

Old_M_x=Mx;

User_App_Running=0;

return;

}

if(Mevent&_M_Button_Down_)

{

Event.Event_ID=_Mouse_Button_Down_;

Event.Mouse_x=Mx;

Event.Mouse_y=My;

Event.Button_Status=Mstatus;

Event.Which_Button=_M_Button_;

Old_Event_Mask=Mevent;

Old_M_y=My;

Old_M_x=Mx;

User_App_Running=0;

return;

}

if(Mevent&_L_Button_Up_)

{

if(Old_Event_Mask&_L_Button_Down_&&Is_Here(Mx,My,Old_M_x,Old_M_y))// &&Old_M_x==Mx&&Old_M_y==My)

{ NewTime=*((unsigned long far *)0x0000046cl);

if(OldEvent==2&&((NewTime-Click_Time[0])<=DBclick_Delay)&&Is_Here(Mx,My,DB_Old_x,DB_Old_y))

{ Event.Event_ID=_Mouse_Button_DBclick_;Click_Time[0]=0;OldEvent=0;}

else

{Event.Event_ID=_Mouse_Button_Click_;::Click_Time[0]=NewTime;OldEvent=2;DB_Old_x=Mx;DB_Old_y=My;}

}

else

Event.Event_ID=_Mouse_Button_Up_;

Old_Event_Mask=0;

Event.Mouse_x=Mx;

Event.Mouse_y=My;

Event.Button_Status=Mstatus;

Event.Which_Button=_L_Button_;

User_App_Running=0;

return;

}

if(Mevent&_R_Button_Up_)

{

if(Old_Event_Mask&_R_Button_Down_&&Is_Here(Mx,My,Old_M_x,Old_M_y))// Old_M_x==Mx&&Old_M_y==My)

{ /*

Event.Event_ID=_Mouse_Button_Click_;

*/

NewTime=*((unsigned long far *)0x0000046cl);

if(OldEvent==2&&((NewTime-Click_Time[1])<=DBclick_Delay)&&Is_Here(Mx,My,DB_Old_x,DB_Old_y))

{ Event.Event_ID=_Mouse_Button_DBclick_;Click_Time[1]=0;OldEvent=0;}

else

{Event.Event_ID=_Mouse_Button_Click_;Click_Time[1]=NewTime;OldEvent=2;DB_Old_x=Mx;DB_Old_y=My;}

}

else

Event.Event_ID=_Mouse_Button_Up_;

Old_Event_Mask=0;

Event.Mouse_x=Mx;

Event.Mouse_y=My;

Event.Button_Status=Mstatus;

Event.Which_Button=_R_Button_;

User_App_Running=0;

return;

}

if(Mevent&_M_Button_Up_)

{

if(Old_Event_Mask&_M_Button_Down_&&Is_Here(Mx,My,Old_M_x,Old_M_y))// Old_M_x==Mx&&Old_M_y==My)

{

/*Event.Event_ID=_Mouse_Button_Click_;*/

NewTime=*((unsigned long far *)0x0000046cl);

if(OldEvent==2&&((NewTime-Click_Time[2])<=DBclick_Delay)&&Is_Here(Mx,My,DB_Old_x,DB_Old_y))

{ Event.Event_ID=_Mouse_Button_DBclick_;Click_Time[2]=0;OldEvent=0;}

else

{Event.Event_ID=_Mouse_Button_Click_;Click_Time[2]=NewTime;OldEvent=2;DB_Old_x=Mx;DB_Old_y=My;}

}

else

Event.Event_ID=_Mouse_Button_Up_;

Old_Event_Mask=0;

Event.Mouse_x=Mx;

Event.Mouse_y=My;

Event.Button_Status=Mstatus;

Event.Which_Button=_M_Button_;

User_App_Running=0;

return;

}

}

}

#endif

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有