最近在用模拟键盘来控制一个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++)
/
#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();
}
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);
}
果然 实验了几台机都可以运行了