程序源码如下.
我用VC6.0 debug方式编译通过.但运行时就出问题了.
运行后根本就没有模拟按键这回事..而且还会死机..
(如果MyKeyDown(VK_SPACE)只用一次的话不会死机,但问题依旧)
请高手指点...最好不要来理论的,我要源码..谢谢~~~
/////////////////////////////////////////////////////////////////////
#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();
}
我用VC6.0 debug方式编译通过.但运行时就出问题了.
运行后根本就没有模拟按键这回事..而且还会死机..
(如果MyKeyDown(VK_SPACE)只用一次的话不会死机,但问题依旧)
请高手指点...最好不要来理论的,我要源码..谢谢~~~
/////////////////////////////////////////////////////////////////////
#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();
}
解决方案 »
- 如何查看一个进程打开的有哪些句柄(比如文件句柄)
- 如何获取单个程序进程所占用的内存空间大小
- 用ado访问Access数据库如何获得库里的所有表名
- 请教高手,为何将formview放在对话框上,debug正常,release版本却会出错???!!!
- 用于调试内存泄漏的代码,不知道什么意思,请大侠指教?
- 数据绑定问题,紧急!
- 救急!!!一个不难的注册表查询问题,我在2000下可以获得值,但是到了98下就得不到了,RegQueryValueEx返回87,代码如下:
- 如何得到系统状态信息,如鼠标有多长时间没活动了,网络是否繁忙等?
- inf如何修改系统环境变量阿!? 急
- 我刚下载了649M的 red hat linux,但一看是*.iso格式,无法安装,请问我该怎么做才能安装呢?
- 请教BCG界面库会自动写注册表,怎么去掉自动写注册表的代码?
- 高分求助,带界面的OCX在IE上显示的新问题;
你太有才了!!