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; 
    }