如何在C编的程序里加入鼠标

eatwind0 2004-08-11 08:08:16
如何在C编的程序里加入鼠标
...全文
537 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
liujingfu123 2004-08-17
  • 打赏
  • 举报
回复
kinghawk(惊鸿)你的代码有没有经过调试的啊?

geninterrupt和_ES=FP_SEG这两个函数在哪里?
coyprightbao 2004-08-16
  • 打赏
  • 举报
回复
收藏之!!!!!!!!!
eatwind0 2004-08-15
  • 打赏
  • 举报
回复
编译通过了,但是读地址的时候出错了。。。
liushuaiboy 2004-08-14
  • 打赏
  • 举报
回复
up
sekelon 2004-08-14
  • 打赏
  • 举报
回复
最简单的就是显示一下鼠标:
#include <stdio.h>
#include <stdlib.h>
main() {
int key;
char flag=1;
reset();
show_mouse();
while(flag){
if(kbhit()){
key=getch();
if(key==27)
flag=0;
}
}

}
cthiro123 2004-08-14
  • 打赏
  • 举报
回复
ding
sekelon 2004-08-14
  • 打赏
  • 举报
回复
asm{
...
}就可以了
12l 2004-08-14
  • 打赏
  • 举报
回复
问:在C里头怎么搞ASM进去?
kinghawk 2004-08-13
  • 打赏
  • 举报
回复
我以前贴过下面的代码,本来不想再贴了,看见大家都在贴,我也凑热闹
#include <bios.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 Keystate;
int MouseExist;
int MouseButton;
int MouseX;
int MouseY;

/*鼠标光标形状定义*/
typedef struct
{
unsigned int shape[32];
char hotx;
char hoty;
}SHAPE;

/*手型1*/
SHAPE HAND1={
{
0xe1ff,0xe1ff,0xe1ff,0xe1ff,
0xe000,0xe000,0xe000,0xe000,
0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,
0x1e00,0x1200,0x1200,0x1200,
0x1200,0x13ff,0x1249,0x1249,
0x1249,0x9001,0x9001,0x8001,
0x8001,0x8001,0x8001,0xffff
},
5,0,
};

/*手型2*/
SHAPE HAND2={
{
0xf3ff,0xe1ff,0xe2ff,0xe1ff,
0xe001,0xe000,0xe000,0xe000,
0x8000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x8001,0x0003,
0x0c00,0x1200,0x1200,0x1200,
0x13fe,0x1249,0x1200,0x1249,
0x7249,0x9001,0x9001,0x9001,
0x8001,0x8001,0x4002,0x3ffc
},
4,0,
};

/*箭头型*/
SHAPE ARROW={
{
0x3fff,0x1fff,0x0fff,0x07ff,
0x03ff,0x01ff,0x00ff,0x007f,
0x003f,0x00ff,0x01ff,0x10ff,
0x30ff,0xf87f,0xf87f,0xfc3f,
0x0000,0x7c00,0x6000,0x7000,
0x7800,0x7c00,0x7e00,0x7f00,
0x7f80,0x7e00,0x7c00,0x4600,
0x0600,0x0300,0x0300,0x0180
},
0,0,
};

/*左右箭头型*/
SHAPE LEFTRIGHT={
{
0xffff,0xffff,0xfbdf,0xf3cf,
0xe3c7,0xc003,0x8001,0x0000,
0x8001,0xc003,0xe3c7,0xf3cf,
0xfbdf,0xffff,0xffff,0xffff,
0x0000,0x0000,0x0420,0x0c30,
0x1428,0x27e4,0x4002,0x8001,
0x4002,0x27e4,0x1428,0x0c30,
0x0420,0x0000,0x0000,0x0000
},
8,8,
};

/*上下箭头型*/
SHAPE UPDOWN={
{
0xfeff,0xfcff,0xf83f,0xf01f,
0xe00f,0xc00f,0xf83f,0xf83f,
0xf83f,0xf83f,0xc007,0xe00f,
0xf01f,0xf83f,0xfc7f,0xfeff,
0x0100,0x0280,0x0440,0x0820,
0x1010,0x3c78,0x0440,0x0440,
0x0440,0x0440,0x3c78,0x1010,
0x0820,0x0440,0x0280,0x0100
},
8,8,
};

/*鼠标光标显示*/
void MouseOn()
{
_AX=0x01;
geninterrupt(0x33);
}

/*鼠标光标掩示*/
void MouseOff()
{
_AX=0x02;
geninterrupt(0x33);
}

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

/*鼠标状态值初始化*/
void MouseReset()
{
_AX=0x00;
geninterrupt(0x33);
}

/*改变鼠标光标形状
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;
}
zwzzj 2004-08-13
  • 打赏
  • 举报
回复
还是让我把汇编看完了在来看了。
lodestar51 2004-08-13
  • 打赏
  • 举报
回复
好东西 。看看。。。
CsdnPlayer 2004-08-13
  • 打赏
  • 举报
回复
这个太麻烦,我记得网上有mouse.c提供的。
xkou 2004-08-13
  • 打赏
  • 举报
回复
mark
LDD123 2004-08-13
  • 打赏
  • 举报
回复
mark
happychenkj 2004-08-13
  • 打赏
  • 举报
回复
嗯,好东东!sekelon(罗伦罗亚索龙)的回复,good
demo001 2004-08-13
  • 打赏
  • 举报
回复
mark
sekelon 2004-08-13
  • 打赏
  • 举报
回复
C出身的,汇编懂一点点
fatcat2002 2004-08-13
  • 打赏
  • 举报
回复
楼上的 汇编一定很叼吧
sekelon 2004-08-13
  • 打赏
  • 举报
回复
INT 33H 功能00H 初始化鼠标
调用寄存器:AX 0000H
返回寄存器:AX 0 未安装鼠标
-1 安装了鼠标
BX 按钮数
INT 33H 功能01H 显示鼠标光标
调用寄存器:AX 0001H
返回寄存器:无
INT 33H 功能02H 关闭鼠标光标
调用寄存器:AX 0002H
返回寄存器:无
INT 33H 功能03H 取鼠标位置
调用寄存器:AX 0003H
返回寄存器:BX 按钮状态(0-7位分别代表各键状态)
CX X坐标(水平)
DX Y坐标(垂直)
INT 33H 功能04H 置鼠标位置
调用寄存器:AX 0004H
CX 新X坐标(水平)
DX 新Y坐标(垂直)
返回寄存器:无
INT 33H 功能05H 取按钮按下信息
调用寄存器:AX 0005H
BX 按钮(0左边,1右边,2中间)
返回寄存器:AX 按钮状态
BX 按钮按下次数(在每次调用时复位0)
CX 最后按下时光标的水平位置
DX 最后按下时光标的垂直位置
INT 33H 功能06H 取按钮释放信息
调用寄存器:AX 0006H
BX 按钮(同功能07H)
返回寄存器:AX 按钮状态
BX 上次调用以来释放的次数
CX 最后释放时光标的水平位置
DX 最后释放时光标的垂直位置
INT 33H 功能07H 置鼠标X界限
调用寄存器:AX 0007H
CX 最小X值
DX 最大X值
返回寄存器:无
INT 33H 功能08H 置鼠标Y界限
调用寄存器:AX 0007H
CX 最小Y值
DX 最大Y值
返回寄存器:无
INT 33H 功能09H 置图形鼠标形状
调用寄存器:AX 0009H
BX 热点X位置(-16到16)
CX 热点Y位置(-16到16)
ES:DX 指向视屏掩码和光标掩码的指针(掩码可以定义为字符数组,见程序中例子)
返回寄存器:无
INT 33H 功能0AH 设置文本光标类型
调用寄存器:AX 000AH
BX 0 选择属性光标
1 选择硬件光标
CX 如BX=0,为视屏掩码(AND值)
BX=1,为开始扫描行
DX 如BX=0,为光标掩码(XOR值)
BX=1,为结束扫描行
返回寄存器:无




sekelon 2004-08-13
  • 打赏
  • 举报
回复
其实原理很简单,DOS0x33软中断就是一个鼠标管理的中断程序,在C只要用int86函数对中断进行调用就可以了,如果有返回值得话就存在那个共用体中返回。不过在执行程序之前要确定已经安装了鼠标驱动,否则程序无法正常工作的。
加载更多回复(15)

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧