python驱动级模拟按键 检测_模拟任意按键(驱动级)
昨儿装了一XP的离开模式补丁,愕然发现自己的键盘没有Sleep键……
无奈开始着手写一个模拟按键的小程序,就这么一个小东西算是难住我了。
先后试了 SendKeys 、keybd_event 、PostMessage 都就不能模拟Sleep键,别的都行。
最后终于baidu到了方法~ 奉上。
驱动级模拟:直接读写键盘的硬件端口
在这里我们可以使用一个组件WINIO来完成读写端口操作。什么是WINIO?WINIO是一个全免费的、无需注册的、含源程序的WINDOWS2000 端口操作驱动程序组件(可以到http://www.internals.com/上 去下载)。它不仅可以操作端口,还可以操作内存;不仅能在VB下用,还可以在DELPHI、VC等其它环境下使用,性能特别优异。下载该组件,解压缩后可 以看到几个文件夹,其中Release文件夹下的3个文件就是我们需要的,这3个文件是WinIo.sys(用于win xp下的驱动程 序),WINIO.VXD(用于win 98下的驱动程序),WinIo.dll(封装函数的动态链接库),我们只需要调用WinIo.dll中的函数, 然后WinIo.dll就会安装并调用驱动程序来完成相应的功能。值得一提的是这个组件完全是绿色的,无需安装,你只需要把这3个文件复制到与你的程序相 同的文件夹下就可以使用了。用法很简单,先用里面的InitializeWinIo函数安装驱动程序,然后就可以用GetPortVal来读取端口或者用 SetPortVal来写入端口了。好,让我们来做一个驱动级的键盘模拟吧。先把winio的3个文件拷贝到你的程序的文件夹下,然后在VB中新建一个工 程,添加一个模块,在模块中加入下面的winio函数声明:
CodeDeclareFunctionMapPhysToLinLib"WinIo.dll"(ByValPhysAddrAsInt32,ByValPhysSizeAsInt32,ByRefPhysMemHandleAsObject)AsInt32DeclareFunctionUnmapPhysicalMemoryLib"WinIo.dll"(ByValPhysMemHandle,ByValLinAddr)AsBooleanDeclareFunctionGetPhysint32Lib"WinIo.dll"(ByValPhysAddrAsInt32,ByRefPhysValAsInt32)AsBooleanDeclareFunctionSetPhysint32Lib"WinIo.dll"(ByValPhysAddrAsInt32,ByValPhysValAsInt32)AsBooleanDeclareFunctionGetPortValLib"WinIo.dll"(ByValPortAddrAsInteger,ByRefPortValAsInt32,ByValbSizeAsByte)AsBooleanDeclareFunctionSetPortValLib"WinIo.dll"(ByValPortAddrAsInteger,ByValPortValAsInt32,ByValbSizeAsByte)AsBooleanDeclareFunctionInitializeWinIoLib"WinIo.dll"()AsBooleanDeclareFunctionShutdownWinIoLib"WinIo.dll"()AsBooleanDeclareFunctionInstallWinIoDriverLib"WinIo.dll"(ByValDriverPathAsString,ByValModeAsInteger)AsBooleanDeclareFunctionRemoveWinIoDriverLib"WinIo.dll"()AsBoolean'---------以上是WINIO函数声明--------DeclareFunctionMapVirtualKeyLib"user32"Alias"MapVirtualKeyA"(ByValwCodeAsInt32,ByValwMapTypeAsInt32)AsInt32'---------以上是WIN32 API函数声明--------
再添加下面五个过程:
CodeSubKBCWait4IBE()'等待键盘缓冲区为空DimdwValAsInt32DoGetPortVal(&H64, dwVal,1)'这句表示从&H64端口读取一个字节并把读出的数据放到变量dwVal中'GetPortVal函数的用法是GetPortVal 端口号,存放读出数据的变量,读入的长度LoopWhile(dwValAnd&H2)End SubPublicConstKBC_KEY_CMD=&H64'键盘命令端口PublicConstKBC_KEY_DATA=&H60'键盘数据端口SubMyKeyDown(ByValvKeyCoadAsInt32)'这个用来模拟按下键,参数vKeyCoad传入按键的虚拟码DimbtScancodeAsInt32
btScancode=MapVirtualKey(vKeyCoad,0)
KBCWait4IBE()'发送数据前应该先等待键盘缓冲区为空SetPortVal(KBC_KEY_CMD,&HD2,1)'发送键盘写入命令'SetPortVal函数用于向端口写入数据,它的用法是SetPortVal 端口号,欲写入的数据,写入数据的长度KBCWait4IBE()
SetPortVal(KBC_KEY_DATA, btScancode,1)'写入按键信息,按下键End SubSubMyKeyUp(ByValvKeyCoadAsInt32)'这个用来模拟释放键,参数vKeyCoad传入按键的虚拟码DimbtScancodeAsInt32
btScancode=MapVirtualKey(vKeyCoad,0)
KBCWait4IBE()'等待键盘缓冲区为空SetPortVal(KBC_KEY_CMD,&HD2,1)'发送键盘写入命令KBCWait4IBE()
SetPortVal(KBC_KEY_DATA, (btScancodeOr&H80),1)'写入按键信息,释放键End SubSubMyKeyDownEx(ByValvKeyCoadAsInt32)'模拟扩展键按下,参数vKeyCoad是扩展键的虚拟码DimbtScancodeAsInt32
btScancode=MapVirtualKey(vKeyCoad,0)
KBCWait4IBE()'等待键盘缓冲区为空SetPortVal(KBC_KEY_CMD,&HD2,1)'发送键盘写入命令KBCWait4IBE()
SetPortVal(KBC_KEY_DATA,&HE0,1)'写入扩展键标志信息KBCWait4IBE()'等待键盘缓冲区为空SetPortVal(KBC_KEY_CMD,&HD2,1)'发送键盘写入命令KBCWait4IBE()
SetPortVal(KBC_KEY_DATA, btScancode,1)'写入按键信息,按下键End SubSubMyKeyUpEx(ByValvKeyCoadAsInt32)'模拟扩展键弹起DimbtScancodeAsInt32
btScancode=MapVirtualKey(vKeyCoad,0)
KBCWait4IBE()'等待键盘缓冲区为空SetPortVal(KBC_KEY_CMD,&HD2,1)'发送键盘写入命令KBCWait4IBE()
SetPortVal(KBC_KEY_DATA,&HE0,1)'写入扩展键标志信息KBCWait4IBE()'等待键盘缓冲区为空SetPortVal(KBC_KEY_CMD,&HD2,1)'发送键盘写入命令KBCWait4IBE()
SetPortVal(KBC_KEY_DATA, (btScancodeOr&H80),1)'写入按键信息,释放键End Sub
在From_Load事件加载驱动,Form_FormClosing卸载驱动:
CodePrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.LoadIfInitializeWinIo=FalseThen'用InitializeWinIo函数加载驱动程序,如果成功会返回true,否则返回falseMsgBox("驱动程序加载失败!")Me.Close()EndIfEnd SubPrivateSubForm1_FormClosing(ByValsenderAsObject,ByValeAsSystem.Windows.Forms.FormClosingEventArgs)HandlesMe.FormClosing
ShutdownWinIo()End Sub
调用方法:
CodePrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click
MyKeyDown(Keys.NumLock)
MyKeyUp(Keys.NumLock)End Sub
试试看NumLock灯是不是有变化?
将按键改成 Keys.Sleep 就可以休眠了。
里面还有 keybd_event 、PostMessage 的VB6用法。
PS:有网友说要程序,这就奉上。
http://files.cnblogs.com/mx1700/休眠.rar
python驱动级模拟按键 检测_模拟任意按键(驱动级)相关推荐
- scrapy模拟模拟点击_模拟大流行
scrapy模拟模拟点击 复杂系统 (Complex Systems) In our daily life, we encounter many complex systems where indiv ...
- python 无头模式 绕过检测_网络爬虫之使用pyppeteer替代selenium完美绕过webdriver检测...
1引言 曾经使用模拟浏览器操作(selenium + webdriver)来写爬虫,但是稍微有点反爬的网站都会对selenium和webdriver进行识别,网站只需要在前端js添加一下判断脚本,很容 ...
- 矩阵键盘_按键检测_按键次数检测
在进行矩阵按键检测的时候,对于51单片机来说,由于IO输出电流较小,驱动能力不足,若用一个A号IO口去检测B号IO口,无论B口高电平还是低电平,A口皆是低电平:若A口置高,可用来检测B口的低电平. I ...
- 自动按键脚本_阔怕...按键精灵还能将别人的脚本导入为自己所用
在按键精灵中你可以自己编辑脚本也可以直接导入别人的脚本直接使用.但是按键精灵的脚本文件是按键一定的数据格式保存的,如果单纯地把Q文件里面的内容直接复制到编辑器上是无法识别的.那如何导入别人的脚本? 一 ...
- linux 按键检测 防抖,GPIO输入——按键检测
当按下一个按键时,系统是如何检测到的呢? 我们通过LED灯的亮灭状态来间接完成按键检测.当按下按键时,LED灯亮,再次按下时,LED灯灭. 要完成这个实验,我们就会用到GPIO外设的基本输入功能. 查 ...
- 龙芯2k按键中断驱动_外部中断按键驱动
我的开发板上一共有四个按键,分别影射到GPF0.GPF2.GPG3.GPG11,当按下按键时分别产生0.2.11.19号外部中断.由于没有安装驱动,当按下按键时,没有任何反应.所以需要编写一个驱动,将 ...
- python网球比赛模拟主持稿_模拟课堂比赛主持人稿
模拟课堂比赛主持人稿 尊敬的各位评委嘉宾亲爱的老师同学们大家晚上好!欢迎大家来 到地理科学学院第十三届 ' 为了明天 ' 师范技能大赛的比赛现场. 我是今晚的明亮我是沈慧都说教师是灵魂的工程师,而课堂 ...
- python网球比赛模拟主持稿_模拟讲课大赛主持人稿
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090@qq.com,我 ...
- 下列选项中能够实现python循环结构的是_模拟试卷B
1. 关于算法的描述,以下选项中错误的是 算法是指解题方案的准确而完整的描述 算法具有可行性.确定性.有穷性的基本特征 算法的复杂度主要包括时间复杂度和数据复杂度 算法的基本要素包括数据对象的运算和操 ...
最新文章
- 在ROS中使用奥比中光Orbbec Astra Pro
- boost::yap::make_expression_function相关的测试程序
- 游戏运营杂谈之-----IB推荐算法
- Android8.0及以上系统 WiFi热点 版本适配
- C++中size_t和int区别
- Latex 排版第一页出现空白页
- 高等数学(第七版)同济大学 习题2-1 个人解答
- ABP (ASP.NET Core 5.x + Vue)小白基础入门(一)
- RGB转NV21格式
- 产品经理与程序员之间的孽缘发展历程
- mac如何共享windows的打印机
- 博士申请 | 香港城市大学赵翔宇老师招收人工智能全奖PhD/联培PhD/RA
- 【数据结构与算法】LeetCode面试真题,带你领略算法思想
- spoolsv解决方法
- 辗转相除法的原理,一看就懂,一学就会
- sourcetree下载安装和配置
- 专用来处理图像的工具-Photoshop CS5 中文版提供下载
- PowerPC的嵌入式Linux培训大纲
- 联想电脑的手触屏失灵
- 奢侈品行业数字化也要保持优雅
热门文章
- oracle purge和drop,Oracle 数据库中 drop table 与purge
- CSM认证部分题目分析(1)
- Carbon 一个在线代码美图生成工具
- FS9170马达驱动IC全新原装L9170 L9170SSOP8贴片5A18V马达驱动芯片
- asp.net汽车租赁系统
- 《Java编程那些事儿》正式出版!
- 梦古服务器端公告文件修改,9月8日开放新服以及限制部分服务器角色创建公告...
- C语言怎么存储结构体,C语言结构体Struct怎么使用?
- nightwatch运行测试
- Linux挂载FAT32格式的U盘