两种实现思路
一. 发送原始鼠标数据给应用, 由应用解析鼠标x,y,btn值 (此思路未实现, 应用中解析鼠标数据是可行的, 但目前无法在应用中获取鼠标初始位置, 与应用的当前位置与尺寸)
二. 发送解析后的鼠标数据给应用, 同时把鼠标的x,y值处理成相对于应用的x,y值(当前屏幕鼠标x, y分别减去应用的left, top, 得到鼠标在应用中的x,y值, 同时判断鼠标是否在应用尺寸内, 超出应用的鼠标值置为-1, 应用中获取到-1时不响应鼠标即可), 此思路实现简单, 具体实现如下分析:
1. 在bookpack.h中
......
extern int MOUSEX, MOUSEY, MOUSEBTN; /* 将这三个变量定义为全局变量,键盘接口中需要使用*/
......
2. 在bookpack.c中
.....
for(;;) {
......
else if (512 <= i && i <= 767) { /*鼠标数据*/
if (mouse_decode(&mdec, i - 512) != 0) {
/* 这里添加开始 */
if ((key_win != 0) && (shtctl->top >= 12)) { //桌面图标10+桌面1+鼠标1,这些不发送
fifo32_put(&key_win->task->fifo, i); //将鼠标数据发给应用
}else{
key_win = 0;
}
/* 这里添加结束 */
/* 鼠标指针的移动 */
mx += mdec.x;
my += mdec.y;
if (mx < 0) {
mx = 0;
}
if (my < 0) {
my = 0;
}
if (mx > binfo->scrnx - 1) {
mx = binfo->scrnx - 1;
}
if (my > binfo->scrny - 1) {
my = binfo->scrny - 1;
}
new_mx = mx;
new_my = my;
MOUSEX = mx; //////这里添加
MOUSEY = my; //////这里添加
MOUSEBTN = mdec.btn; //////这里添加
......
3. 在console.c中
......
int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax)
{
......
} else if (edx == 15) {
......
if (i >= 512 && i <= 767) { /*512~767是鼠标数据*/
int x, y, b;
extern int MOUSEX, MOUSEY, MOUSEBTN; //从bookpack中得到当前鼠标值
unsigned long int mdec = 0; /* sbxxxxyyyy 无符号int最大值4294967295,所以最大鼠标坐标[9496,7295], 其中第1位固定1作为鼠标数据标识,第2位作为鼠标按键值,第3~6位为X坐标,第7~10位为Y坐标 */
sht = shtctl->sheets[shtctl->top-1];
/* 不在当前窗体或鼠标不在窗体内的返回-1*/
x = ((sht->height != shtctl->top -1) || (MOUSEX - sht->vx0 < 0) || (MOUSEX - sht->vx0 - sht->bxsize > 0)) ? -1 : (MOUSEX - sht->vx0);
y = ((sht->height != shtctl->top -1) || (MOUSEY - sht->vy0 < 0) || (MOUSEY - sht->vy0 - sht->bysize > 0)) ? -1 : (MOUSEY - sht->vy0);
b = sht->height == shtctl->top -1 ? MOUSEBTN : 0;
if (x < 0 || y < 0) {
mdec = -1;
} else {
mdec += x; //X
mdec += y * 10000; //Y
mdec += b * 100000000; //Btn
mdec += 1 * 1000000000; //标识, 把鼠标数据变成一个很大的值与其它数据区分出来
}
reg[7] = mdec;
return 0;
}
......
4. 应用中
......
void HariMain(void)
{
......
int m_x, m_y, m_btn;
int i;
for (;;) {
i = api_getkey(1);
if ( i > 1000 ) { //得到鼠标数据
i -= 1000000000;
m_btn = (int) (i / 100000000);
i %= 100000000;
m_x = (int) (i / 10000);
i %= 10000;
m_y = (int) i;
//鼠标操作
} else { //其它数据为键盘数据
//键盘操作
}
}
api_end();
}
......
至此就可以愉快的在应用中玩耍鼠标了, 小日子说的半天能完成鼠标API还真的没说假话, 只是我太笨一开始没想到这个思路, 尝试+调试差不多花2个小时, 前面想到的用独立的一个接口传送鼠标数据性能不是很好,要用定时器不停的获取当前鼠标数据, 浪费了很多系统资源, 用这个键盘api通过系统中断发送数据资源就省了好多,
做东东前, 还是要多想,多试^_^ 继续努力~
一. 发送原始鼠标数据给应用, 由应用解析鼠标x,y,btn值 (此思路未实现, 应用中解析鼠标数据是可行的, 但目前无法在应用中获取鼠标初始位置, 与应用的当前位置与尺寸)
二. 发送解析后的鼠标数据给应用, 同时把鼠标的x,y值处理成相对于应用的x,y值(当前屏幕鼠标x, y分别减去应用的left, top, 得到鼠标在应用中的x,y值, 同时判断鼠标是否在应用尺寸内, 超出应用的鼠标值置为-1, 应用中获取到-1时不响应鼠标即可), 此思路实现简单, 具体实现如下分析:
1. 在bookpack.h中
......
extern int MOUSEX, MOUSEY, MOUSEBTN; /* 将这三个变量定义为全局变量,键盘接口中需要使用*/
......
2. 在bookpack.c中
.....
for(;;) {
......
else if (512 <= i && i <= 767) { /*鼠标数据*/
if (mouse_decode(&mdec, i - 512) != 0) {
/* 这里添加开始 */
if ((key_win != 0) && (shtctl->top >= 12)) { //桌面图标10+桌面1+鼠标1,这些不发送
fifo32_put(&key_win->task->fifo, i); //将鼠标数据发给应用
}else{
key_win = 0;
}
/* 这里添加结束 */
/* 鼠标指针的移动 */
mx += mdec.x;
my += mdec.y;
if (mx < 0) {
mx = 0;
}
if (my < 0) {
my = 0;
}
if (mx > binfo->scrnx - 1) {
mx = binfo->scrnx - 1;
}
if (my > binfo->scrny - 1) {
my = binfo->scrny - 1;
}
new_mx = mx;
new_my = my;
MOUSEX = mx; //////这里添加
MOUSEY = my; //////这里添加
MOUSEBTN = mdec.btn; //////这里添加
......
3. 在console.c中
......
int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax)
{
......
} else if (edx == 15) {
......
if (i >= 512 && i <= 767) { /*512~767是鼠标数据*/
int x, y, b;
extern int MOUSEX, MOUSEY, MOUSEBTN; //从bookpack中得到当前鼠标值
unsigned long int mdec = 0; /* sbxxxxyyyy 无符号int最大值4294967295,所以最大鼠标坐标[9496,7295], 其中第1位固定1作为鼠标数据标识,第2位作为鼠标按键值,第3~6位为X坐标,第7~10位为Y坐标 */
sht = shtctl->sheets[shtctl->top-1];
/* 不在当前窗体或鼠标不在窗体内的返回-1*/
x = ((sht->height != shtctl->top -1) || (MOUSEX - sht->vx0 < 0) || (MOUSEX - sht->vx0 - sht->bxsize > 0)) ? -1 : (MOUSEX - sht->vx0);
y = ((sht->height != shtctl->top -1) || (MOUSEY - sht->vy0 < 0) || (MOUSEY - sht->vy0 - sht->bysize > 0)) ? -1 : (MOUSEY - sht->vy0);
b = sht->height == shtctl->top -1 ? MOUSEBTN : 0;
if (x < 0 || y < 0) {
mdec = -1;
} else {
mdec += x; //X
mdec += y * 10000; //Y
mdec += b * 100000000; //Btn
mdec += 1 * 1000000000; //标识, 把鼠标数据变成一个很大的值与其它数据区分出来
}
reg[7] = mdec;
return 0;
}
......
4. 应用中
......
void HariMain(void)
{
......
int m_x, m_y, m_btn;
int i;
for (;;) {
i = api_getkey(1);
if ( i > 1000 ) { //得到鼠标数据
i -= 1000000000;
m_btn = (int) (i / 100000000);
i %= 100000000;
m_x = (int) (i / 10000);
i %= 10000;
m_y = (int) i;
//鼠标操作
} else { //其它数据为键盘数据
//键盘操作
}
}
api_end();
}
......
至此就可以愉快的在应用中玩耍鼠标了, 小日子说的半天能完成鼠标API还真的没说假话, 只是我太笨一开始没想到这个思路, 尝试+调试差不多花2个小时, 前面想到的用独立的一个接口传送鼠标数据性能不是很好,要用定时器不停的获取当前鼠标数据, 浪费了很多系统资源, 用这个键盘api通过系统中断发送数据资源就省了好多,
做东东前, 还是要多想,多试^_^ 继续努力~