Pencil.C++

更新速度可能会晚于http://blog.csdn.net/bilaopao

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  34 随笔 :: 0 文章 :: 40 评论 :: 0 Trackbacks
程序源码如下.

/////////////////////////////////////////////////////////////////////
#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   )   ;       //释放空格键

ShutdownWinIo();
}
posted on 2009-06-06 01:46 Pencil.C++ 阅读(4032) 评论(6)  编辑 收藏 引用

评论

# re: WINIO模拟键盘时间代码(VC) 2009-11-24 17:47 小哥
为什么空格要发送2次  回复  更多评论
  

# re: WINIO模拟键盘时间代码(VC) 2010-05-20 15:16 haowang520
因为开始模拟的是扩展键,转到模拟普通键的时候,要down两下
  回复  更多评论
  

# re: WINIO模拟键盘时间代码(VC) 2011-03-26 20:45 大虾炒饭
呵呵,不好用的代码  回复  更多评论
  

# re: WINIO模拟键盘时间代码(VC) 2011-03-26 20:46 大虾炒饭
代码不好用  回复  更多评论
  

# re: WINIO模拟键盘时间代码(VC) 2011-08-05 12:17 afun
用不了  回复  更多评论
  

# re: WINIO模拟键盘时间代码(VC) 2012-03-02 18:55 wgh
代码无效...
for(int i=0; i<10; i++){
MyKeyDown(VK_SPACE);
MyKeyDown(VK_SPACE);
Sleep(500);
MyKeyUp(VK_SPACE);
Sleep(500);
qDebug() << " " << i;
}  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理