WinIO模拟键盘代码《根据其他文章修改》

最近在用模拟键盘来控制一个DX游戏,发现用SendMessage和Key_event都不起反应,无奈的研究了WinIO的使用,在网上看了很多文章,根据http://www.cppblog.com/pencil/archive/2009/06/06/86891.html的相关代码,很感谢

程序源码如下. 


#include   "windows.h " 
#include   "WinIo.h " 
#include   "winuser.h " 
#include   "iostream.h " 
#define   VK_A   0x41 

#define   KBC_KEY_CMD   0x64         //键盘命令端口 
#define   KBC_KEY_DATA   0x60       //键盘数据端口 


void   KBCWait4IBE() 

DWORD   dwRegVal=0; 
do 
{   
GetPortVal(0x64,&dwRegVal,1); 

while(dwRegVal   &   0x00000001); 


void   MyKeyDownEx(long   vKeyCoad)       //模拟扩展键按下,参数vKeyCoad是扩展键的虚拟码 

long   btScancode; 
btScancode   =   MapVirtualKey(vKeyCoad,   0); 

        KBCWait4IBE();       //等待键盘缓冲区为空 
        SetPortVal(KBC_KEY_CMD,   0xD2,   1     );       //发送键盘写入命令 
        KBCWait4IBE(); 
        SetPortVal(KBC_KEY_DATA,   0xE0,   1   );   //写入扩展键标志信息 
        
        
        KBCWait4IBE();       //等待键盘缓冲区为空 
        SetPortVal(   KBC_KEY_CMD,   0xD2,   1   );         //发送键盘写入命令 
        KBCWait4IBE(); 
        SetPortVal(   KBC_KEY_DATA,   btScancode,   1   );   //写入按键信息,按下键 



void   MyKeyUpEx(long   vKeyCoad)       //模拟扩展键弹起 

long   btScancode; 
btScancode   =   MapVirtualKey(vKeyCoad,   0); 

        KBCWait4IBE();       //等待键盘缓冲区为空 
        SetPortVal(KBC_KEY_CMD,   0xD2,   1   );         //发送键盘写入命令 
        KBCWait4IBE(); 
        SetPortVal   (KBC_KEY_DATA,   0xE0,   1   );   //写入扩展键标志信息 
        
        
        KBCWait4IBE();     //等待键盘缓冲区为空 
        SetPortVal(KBC_KEY_CMD,   0xD2,   1   );         //发送键盘写入命令 
        KBCWait4IBE(); 
        SetPortVal(KBC_KEY_DATA,   (btScancode   |   0x80),   1);     //写入按键信息,释放键 


void   MyKeyDown(long   vKeyCoad) 

long   byScancode   =   MapVirtualKey(vKeyCoad,0);   
KBCWait4IBE();//等待键盘缓冲区为空   
if(SetPortVal(0x64,0xD2,1)==false)cout < < "发送键盘写入命令失败! " < <endl;//发送键盘写入命令 

KBCWait4IBE();//等待键盘缓冲区为空   
if(SetPortVal(0x60,(ULONG)byScancode,1)==false)cout < < "按下键失败! " < <endl;//写入按键信息,按下键 



void   MyKeyUp(long   vKeyCoad) 

long   byScancode   =   MapVirtualKey(vKeyCoad,0);   
KBCWait4IBE();//等待键盘缓冲区为空   
if(SetPortVal(0x64,0xD2,1)==false)cout < < "发送键盘写入命令失败! " < <endl;//发送键盘写入命令 

KBCWait4IBE();//等待键盘缓冲区为空   
if(SetPortVal(0x60,(ULONG)(byScancode   |   0x80),1)==false)cout < < "释放键失败! " < <endl;//写入按键信息,释放键 



void   main() 

if(InitializeWinIo()==false)cout < < "驱动程序加载失败! " < <endl; 

Sleep(3000); 

//MyKeyDownEx(VK_LEFT);       //按下左方向键 
//Sleep(200);                         //延时200毫秒 
//MyKeyUpEx(VK_LEFT);           //释放左方向键   
//Sleep(500); 
//MyKeyDown(VK_SPACE);       //按下空格键,注意要发送两次 
//MyKeyDown(VK_SPACE); 
//Sleep(200); 
//MyKeyUp(VK_SPACE   )   ;       //释放空格键 
for(int i = 0;i<100;i++)
{
MyKeyDown(65);//输入a
Sleep(100);
MyKeyDown(65);
}
getchar();
ShutdownWinIo(); 

本人用的是WinIo 2.0版本;资源可在(http://download.csdn.net/detail/mjesse88/4787653);但是有个问题发现有些电脑上可以 有些电脑上可行,有些电脑上不行(相关资料说不行就是有可能你输入了20个a 它只是显示了一个这样的情况,根据实验确实是这样,当然如果用usb键盘的没有测试);

       头痛了一天多,因为在本人的开发机器是可以完美运行的;继续CSDN中 有些可能是键盘清空清空的问题,于是

void   KBCWait4IBE() 

DWORD   dwRegVal=0; 
do 
{   

Sleep(4);
GetPortVal(0x64,&dwRegVal,1); 

while(dwRegVal   &   0x00000001); 

果然 实验了几台机都可以运行了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值