www.pudn.com > cwin.rar > GETH.C
/*-----------------------------------------------------------
函数 geth : 接收键盘信息
-----------------------------------------------------------*/
#include
int _TriggerCount = 0; /* 触发器个数 */
TRIGGER _Triggers[20]; /* 触发器向量 */
unsigned (*mouseKB)() = NULL; /* 虚拟键盘函数指针 */
void (*_GethFunction)() = NULL; /* 内部处理函数指针 */
void *_GethParameter; /* 内部函数参数指针 */
unsigned _Cdecl geth(void)
{
unsigned h = 0;
int i;
/*-------------- 循环测试键盘和鼠标 -------------------*/
do
{
/*-------------- 如果有内部函数 -------------------*/
if(_GethFunction)
(*_GethFunction)(_GethParameter);
/*-------------- 如果有键按下 ---------------------*/
if(kbhit())
{
unsigned char al,ah,st;
/*-- 从键盘缓冲区取一键码 ---------------------*/
_AH = 0;
geninterrupt(0x16);
al = _AL;
ah = _AH;
/*-- 查询 Alt, Ctrl 和左右 Shift 键的状态 -----*/
st = peekb(0x40,0x17);
/*-- 如果是左shift+箭头,生成相应代码 ----------*/
if(ah>=0x47 && ah<=0x51 && st&0x01)
h = (unsigned)ah|0x180;
/*-- 如果是右shift+箭头,生成相应代码 ----------*/
else if(ah>=0x47 && ah<=0x51 && st&0x02)
h = (unsigned)ah|0x200;
/*-- 如果是 Ctrl+a-z,生成相应代码 -------------*/
else if(al>=0x01 && al<=0x1a && st&0x04)
h = (unsigned)al|0x280;
/*-- 如果不是组合键或功能键的扫描码,继续判断 --*/
else if(al)
{
/*-- 如果是汉字,继续取后半个汉字 ----------*/
if(al&0x80)
{
ah = al;
_AH = 0;
geninterrupt(0x16);
al = _AL;
h = (unsigned)(al*256+ah);
}
/*-- 否则就是 ASCII 码 --------------------*/
else
h = (unsigned)al;
}
/*-- 生成组合键或功能键的统一键盘扫描码 -------*/
else
h = (unsigned)ah|0x100;
}
/*-- 无键按下则查看是否有鼠标按钮按下 -------------*/
else
{
h = get_mouse_status(&i,&i);
/*-- 如果虚拟键盘己安装,由虚拟键盘处理 --------*/
if(mouseKB && h==LEFT_BUTTON)
h = (*mouseKB)(h);
}
}while(h==0);
/*--------------- 检查并激活事件触发器 ----------------*/
for(i=0;i<_TriggerCount;i++)
if(h==_Triggers[i].press_key || h==_Triggers[i].mouse_affair
&& mouse_enter(_Triggers[i].left,_Triggers[i].top,_Triggers[i].right,_Triggers[i].bottom))
return (*(_Triggers[i].trigger))(h);
/*-------------- 返回HANENV系统的统一键盘码 -----------*/
return h;
}