手机重力感应控制电脑(二)

WinIo:WinIo是一个可以完成读写端口操作的驱动程序组件。作者是这样介绍的:

The WinIo library allows 32-bit and 64-bit Windows applications to directly access

I/O ports and physical memory.

我们可以非常方便的在http://www.internals.com/免费下载。

作者很贴心的在帮助手册中给出了详细的说明。其中包含的10个函数原型如下:

bool _stdcall InitializeWinIo();
void _stdcall ShutdownWinIo();
bool _stdcall InstallWinIoDriver(PSTR pszWinIoDriverPath,bool IsDemandLoaded);
bool _stdcall RemoveWinIoDriver();
bool _stdcall GetPortVal(WORD wPortAddr,PDWORD pdwPortVal,BYTE bSize);
bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal,BYTE bSize); 
bool _stdcall GetPhysLong(PBYTE pbPhysAddr,PDWORD pdwPhysVal); 
bool _stdcall SetPhysLong(PBYTE pbPhysAddr,DWORD dwPhysVal);
PBYTE _stdcall MapPhysToLin(tagPhysStruct &PhysStruct);
bool _stdcall UnmapPhysicalMemory(tagPhysStruct &PhysStruct );

具体的用法帮助中写的很清楚了,虽然是英文版,相信我们程序员都不难看懂吧。百度百科有中文介绍,不过版本比较老。这里我们只需要用到其中的四个函数:
InitializeWinIo;
ShutdownWinIo;
GetPortVal;
SetPortVal;
作者在Binaries文件夹中提供了 WinIo32.dll  ;
WinIo32.sys  ; WinIo64.dll  ; WinIo64.sys 四个文件。我们只要把需要用到的文件放在项目目录下就可以了。
我使用显示调用的方式加载了
WinIo32.dll 。定义了下面三个函数:

void Receiver::KBCWait4IBE() //等待键盘缓冲区为空
{
    DWORD dwRegVal=0;
    do
    {
        GetPortVal(0x64,&dwRegVal,1);
    }
    while(dwRegVal & 0x2);
}
void Receiver::MyKeyUp(DWORD KCode)
{
        KBCWait4IBE(); //等待键盘缓冲区为空
        SetPortVal(0X64, 0xD2, 1 ); //发送键盘写入命令
        KBCWait4IBE();
        SetPortVal(0X60, (MapVirtualKey(KCode, 0) | 0x80), 1); //写入按键信息,释放键
}
void Receiver::MyKeyDown(DWORD KCode)
{
        KBCWait4IBE(); //等待键盘缓冲区为空
        SetPortVal( 0X64, 0xD2, 1 ); //发送键盘写入命令
        KBCWait4IBE();
        SetPortVal( 0X60, MapVirtualKey(KCode, 0), 1 ); //写入按键信息,按下键
}

这步完成之后,剩下的工作就简单多了,只要编写合适的逻辑调用这三个函数就OK了!

       程序完成之后,我又遇到了大麻烦
InitializeWinIo总是失败。上网搜搜,检查了文件目录的位置,一切正常。 这可让我郁闷了。又把作者的帮助看了一遍,原来解决办法在这里啊!

64-bit versions of Windows only load device drivers that are signed by a code signing certificate issued by a public CA such as Verisign, Thawte, etc. WinIo64.sys must not be deployed on production machines unless a code signing certificate is obtained and used to sign this file. The bundled copy of WinIo64.sys is signed with a self-signed certificate and can only be used on development/test machines with Windows running in a special "test" mode.

在win7 64bit环境下,实际用到的是 WinIo32.dll ; WinIo64.sys这两个文件。WinIo64.sys没有证书,只能运行在windows的测试模式下。好了,现在以管理员权限打开命令提示符,输入 bcdedit /set testsigning on,重启系统就可以进入测试模式了。然后,右键 WinIo64.sys属性,选择数字签名选项卡:
手机重力感应控制电脑(二) - e易 - E的博客
 
依次点击:详细信息-->查看证书-->安装证书-->下一步-->将所有的证书放入下列存储:受信任的根证书颁发机构-->下一步 安装证书。
手机重力感应控制电脑(二) - e易 - E的博客
 
     
        这样,以管理员权限在运行你的程序,WinIo就可以成功初始化了!
        最后,这是我的测试视频
点击打开链接

最后还有一个 小问题:游戏里我都是模拟WSAD四个键控制的。 方向键模拟还不行,因为方向键的上下左右的硬件扫描码和小键盘的8、2、4、6是一样的,模拟方向键,游戏中实际响应的是小键盘。大家有什么好的解决办法吗?

后记
     这次制作在网上查了很多资料,学习了很多!非常感谢前辈们的分享!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值