WinIo.vxd 驱动在机器上是安装成功了,但是模拟按键非常不稳定,跪求驱动高手解围,非常紧急该怎么处理
WinIo.vxd 驱动在机器上是安装成功了,但是模拟按键非常不稳定,跪求驱动高手解围,非常紧急
大家好,我是熊猫媛元,这个问题拖了一个星期了,实在迫不得已上了论坛,希望有高手解围.非常感谢..
我在程序项目工程和Debug里都装了Winio.vxd,WinIo.dll,WinIo.sys,WinIo.lib,WinIo.h
然后我写了一个类
CKeyboard::~CKeyboard(void)
{
}
void CKeyboard::KBCWait4IBE()
{
DWORD dwVal=0;
do
{
GetPortVal(KBC_CMD,&dwVal,1);
}
while((&dwVal)&&(0x2)==0);
}
void CKeyboard::KEY_DOWN(int vk_in)
{
int myscancode;
myscancode=MapVirtualKey(byte(vk_in),0);
KBCWait4IBE();
//SetPortVal(KBC_CMD,0xD2,1);
//KBCWait4IBE();
//SetPortVal(KBC_DATA,0xE2,1);
//KBCWait4IBE();
SetPortVal(KBC_CMD,0xD2,1);
KBCWait4IBE();
SetPortVal(KBC_DATA,myscancode,1);
}
void CKeyboard::KEY_UP(int vk_in)
{
int myscancode;
myscancode=MapVirtualKey(byte(vk_in),0);
KBCWait4IBE();
//SetPortVal(KBC_CMD,0xD2,1);
//KBCWait4IBE();
//SetPortVal(KBC_DATA,0xE0,1);
//KBCWait4IBE();
SetPortVal(KBC_CMD,0xD2,1);
KBCWait4IBE();
SetPortVal(KBC_DATA,(myscancode|0x80),1);
}
void CKeyboard::KeyboardInit()
{
bool br1;
br1=InstallWinIoDriver("WinIo.sys");
if(br1==false)
{
MessageBox(NULL,"安装IO_device失败,程序自动关闭,请您不用担心~","XD友情提示2",MB_OK);
RemoveWinIoDriver();
ShutdownWinIo();
exit(0);
}
else
{
MessageBox(NULL,"安装IO_device成功","XD友情提示1",MB_OK);
}
br1=InitializeWinIo();
if(br1==true)
{
MessageBox(NULL,"InitializeWinIo成功~","XD友情提示2",MB_OK);
}
else
{
MessageBox(NULL,"InitializeWinIo不成功~","XD友情提示2",MB_OK);
}
}
//移除驱动
void CKeyboard::KeyboardRemoveWinIo()
{
RemoveWinIoDriver();
ShutdownWinIo();
}
................................................
................................................
//调用这个类,每隔1秒,打印字符a键
void main()
{
CKeyboard keyboard
keyboard.KeyboardInit();
while(true)
{
Sleep(1000);
Keyboard.KEYDOWN(65)
Sleep(150);
Keyboard.EY_UP(65);
Sleep(500);
}
}
虽然驱动安装没有问题,字符可以在记事本上打印
但是问题在于在我的机器上打印非常非常的不稳定,不是隔一秒打印一个a,秒甚至等了很长的时间才打印1个a..
而在另一个同事的机器上打印非常顺畅和连续.
我非常的困惑,在网上也搜了资料,WinIo.vxd是有些接触底层的,跟硬件有些关系,希望能够集思广义,能有人能说明一下具体的原由,还请高手们提出一些具体的解决方案.
还有我想再问一个问题,是不是按键精灵用了WinIo.vxd
麻烦大伙了,再次谢谢
------解决方案--------------------
sleep和定时器函数都是不准确的。 它只能指定一个时间标示,但是系统并不会非常准确的按照这个时间来操作。
------解决方案--------------------
跟运行环境有关。
------解决方案--------------------
这个跟内核有关,其实不管你的环境如何,都不会非常准的。
比如你Sleep 1秒。
刚开始sleep的时候cpu会去找其他的高优先级的线程去执行,然后运行一个时间片再跳到别的线程。
假如说现在跳回到sleep所在的线程了,cpu一看,这还没sleep完呢。 然后他又跳到别的线程。
最后经过N个时间片跳了回来,看到已经执行了1秒了。就继续执行。
显然这个时间不可能十分准。
PS:CPU跳回到Sleep的线程后到底是重新Sleep1秒还是接着之前已经Sleep的时间这个我确定。我感觉是接着的。
------解决方案--------------------
4楼说的正确,要想十分准确建议用硬件中断,不过牵涉到驱动程序编写。windows下如果要求不是很高,大约1秒钟即可,用timer也可以,如果要求较高,你可以试一下多媒体定时器。
------解决方案--------------------
汗死,笔误
PS:CPU跳回到Sleep的线程后到底是重新Sleep1秒还是接着之前已经Sleep的时间这个我不确定。我感觉是接着的。
------解决方案--------------------
哥们,你要养成结贴的好习惯。
大家好,我是熊猫媛元,这个问题拖了一个星期了,实在迫不得已上了论坛,希望有高手解围.非常感谢..
我在程序项目工程和Debug里都装了Winio.vxd,WinIo.dll,WinIo.sys,WinIo.lib,WinIo.h
然后我写了一个类
CKeyboard::~CKeyboard(void)
{
}
void CKeyboard::KBCWait4IBE()
{
DWORD dwVal=0;
do
{
GetPortVal(KBC_CMD,&dwVal,1);
}
while((&dwVal)&&(0x2)==0);
}
void CKeyboard::KEY_DOWN(int vk_in)
{
int myscancode;
myscancode=MapVirtualKey(byte(vk_in),0);
KBCWait4IBE();
//SetPortVal(KBC_CMD,0xD2,1);
//KBCWait4IBE();
//SetPortVal(KBC_DATA,0xE2,1);
//KBCWait4IBE();
SetPortVal(KBC_CMD,0xD2,1);
KBCWait4IBE();
SetPortVal(KBC_DATA,myscancode,1);
}
void CKeyboard::KEY_UP(int vk_in)
{
int myscancode;
myscancode=MapVirtualKey(byte(vk_in),0);
KBCWait4IBE();
//SetPortVal(KBC_CMD,0xD2,1);
//KBCWait4IBE();
//SetPortVal(KBC_DATA,0xE0,1);
//KBCWait4IBE();
SetPortVal(KBC_CMD,0xD2,1);
KBCWait4IBE();
SetPortVal(KBC_DATA,(myscancode|0x80),1);
}
void CKeyboard::KeyboardInit()
{
bool br1;
br1=InstallWinIoDriver("WinIo.sys");
if(br1==false)
{
MessageBox(NULL,"安装IO_device失败,程序自动关闭,请您不用担心~","XD友情提示2",MB_OK);
RemoveWinIoDriver();
ShutdownWinIo();
exit(0);
}
else
{
MessageBox(NULL,"安装IO_device成功","XD友情提示1",MB_OK);
}
br1=InitializeWinIo();
if(br1==true)
{
MessageBox(NULL,"InitializeWinIo成功~","XD友情提示2",MB_OK);
}
else
{
MessageBox(NULL,"InitializeWinIo不成功~","XD友情提示2",MB_OK);
}
}
//移除驱动
void CKeyboard::KeyboardRemoveWinIo()
{
RemoveWinIoDriver();
ShutdownWinIo();
}
................................................
................................................
//调用这个类,每隔1秒,打印字符a键
void main()
{
CKeyboard keyboard
keyboard.KeyboardInit();
while(true)
{
Sleep(1000);
Keyboard.KEYDOWN(65)
Sleep(150);
Keyboard.EY_UP(65);
Sleep(500);
}
}
虽然驱动安装没有问题,字符可以在记事本上打印
但是问题在于在我的机器上打印非常非常的不稳定,不是隔一秒打印一个a,秒甚至等了很长的时间才打印1个a..
而在另一个同事的机器上打印非常顺畅和连续.
我非常的困惑,在网上也搜了资料,WinIo.vxd是有些接触底层的,跟硬件有些关系,希望能够集思广义,能有人能说明一下具体的原由,还请高手们提出一些具体的解决方案.
还有我想再问一个问题,是不是按键精灵用了WinIo.vxd
麻烦大伙了,再次谢谢
------解决方案--------------------
sleep和定时器函数都是不准确的。 它只能指定一个时间标示,但是系统并不会非常准确的按照这个时间来操作。
------解决方案--------------------
跟运行环境有关。
------解决方案--------------------
这个跟内核有关,其实不管你的环境如何,都不会非常准的。
比如你Sleep 1秒。
刚开始sleep的时候cpu会去找其他的高优先级的线程去执行,然后运行一个时间片再跳到别的线程。
假如说现在跳回到sleep所在的线程了,cpu一看,这还没sleep完呢。 然后他又跳到别的线程。
最后经过N个时间片跳了回来,看到已经执行了1秒了。就继续执行。
显然这个时间不可能十分准。
PS:CPU跳回到Sleep的线程后到底是重新Sleep1秒还是接着之前已经Sleep的时间这个我确定。我感觉是接着的。
------解决方案--------------------
4楼说的正确,要想十分准确建议用硬件中断,不过牵涉到驱动程序编写。windows下如果要求不是很高,大约1秒钟即可,用timer也可以,如果要求较高,你可以试一下多媒体定时器。
------解决方案--------------------
汗死,笔误
PS:CPU跳回到Sleep的线程后到底是重新Sleep1秒还是接着之前已经Sleep的时间这个我不确定。我感觉是接着的。
------解决方案--------------------
哥们,你要养成结贴的好习惯。