C# WinIo获取键盘记录
网上搜了很多关于WinIo的调用方法,但大部分都是模拟按键,小部分获取记录,但要么有问题要么别的语言写的看不懂,那就只好自己想。
运行环境:WIN7 X86,WinIo3.0 的32位版,时间是2013-3-23。
因为Winio是对端口进行直接读写的,所以要记录键盘就必须了解键盘输入到系统读取输入这过程发生了什么。这里以QQ登录界面做测试,因为QQ密码框的保护原理只是防钩子,没做到驱动级别。另外因为加载了WinIo,安全卫士可能会拦截。
QQ密码框防钩子原理:http://wenku.baidu.com/view/05ecf86727d3240c8447ef9e.html
PS/2键盘驱动原理:http://blog.csdn.net/vangoals/article/details/4405032
WinIo使用方法:http://www.cnblogs.com/zhuiyi/archive/2012/07/10/2584645.html
winFrom 鼠标、键盘监听器:http://blog.csdn.net/woaicsharp/article/details/6054526
下面开始正式的说明:
从PS/2键盘驱动原理知道系统驱动读数据的原理:
当有数据需要被驱动读走的时候,数据被放入输出缓冲器,同时将状态寄存器的bit0(OUTPUT_BUFFER_FULL)置1,引发键 盘中断(键盘中断的IRQ为1)。由于键盘中断,引起由键盘驱动提供的键盘中断服务例程被执行。在键盘中断服务例程中,驱动会从i8042读走数据。一旦 数据读取完成,状态寄存器的bit0会被清0。
因此,只要不断监控64端口的bit0位,等待bit0位从0变1再从60端口获取键盘扫描码,然后再循环上一步,这样就可以知道系统驱动读走了什么扫描码,又因为QQ密码框保护没做到驱动这级别,所以并不会对键盘扫描码的获取造成干扰。
接下来就是真个程序的设计思想:
1. 通过窗体名获取窗体句柄(FindWindow);
2. 通过获得的窗体句柄获取获取窗体的位置(GetWindowPlacement);
3. 在上述都没有意外(GetWindowPlacement函数不知道获取的位置会不对,求教导)的情况下启动鼠标钩子和WinIo监控相应端口;
4. 当鼠标点击QQ登录界面的账号框和密码框(通过鼠标点击位置知道)并用键盘输入时存入相应数组。
5. 当点击登录按钮或按下回车后就执行你想做的事,然后卸载鼠标钩子,停止WinIo端口监控线程,但是仍然执行查找窗体的Timer。
上述过程参考上面给的最后一个连接。