rainmeter 记事本皮肤键盘皮肤

按键精灵打开记事本的命令 _ [新]综合讨论 - 按键精灵论坛
腾讯微博:
软件版本:2014.03软件大小:55.1M更新时间:
软件版本:3.1.2(免root)软件大小:61.2M更新时间:
软件版本:1.2.2软件大小:37.4M更新时间:
查看: 3303|回复: 5
guowei5851
按键精灵开发者6级可通过提升认证等级来升级勋章:学有所成学有所成勋章,新手步入按键学堂的第一枚勋章爱心大使积极帮助新手(可向管理员进行申请)按键图书勋章尊贵的按键图书用户黄瓜勋章(永久)体验商业小精灵活动的奖励鹰眼勋章鹰眼注册用户专属勋章认证考霸(90天)参加考霸活动,对认证考了十次以上用户的鼓励马年勋章(360天) 马年纪念勋章(360天)
我记得按键有一个打开记事本的命令,哪位大神记得吗,说下,多谢了
花花哪里去
の守々护々星
学有所成学有所成勋章,新手步入按键学堂的第一枚勋章按键会员(月)按键会员绑定账号后自动赠送按键精灵开发者6级可通过提升认证等级来升级勋章:黄瓜勋章(永久)体验商业小精灵活动的奖励幸运草勋章(永久)商业小精灵限时活动勋章。按键14周年庆纪念勋章按键14周年庆纪念勋章(360天)单身汪勋章单身贵族的专属勋章猴年勋章猴年专属“大圣”勋章
RunApp ("notepad.exe")
MessageBox "花花 不解释O(∩_∩)O哈!"
脚本订购 软件设计 请联系 QQ: 添加请注明原因! 脚本订购起步价:100 RMB 非诚勿扰
承接: 小型/中型
个人/工作室
项目脚本开发提示: 电脑版 / 安卓版[仅限图色脚本 外挂免谈]软件保障条约:【暂不收徒 不无偿指导 !谢谢支持】1:脚本维护与更新视情况收费一定的费用!2:所有定制均需订金,否则勿扰. 非诚勿扰 !3:天下没有白吃的午餐.所以别浪费彼此宝贵的时间.4:天道酬勤
,人道酬诚 .人无信则不立.
hailong2012
学有所成学有所成勋章,新手步入按键学堂的第一枚勋章小红帽对论坛提出良好建议(可向管理员申请)骨灰级按键用户3年以上的按键论坛用户黄金之翼黄金之翼勋章按键图书勋章尊贵的按键图书用户黄瓜勋章(永久)体验商业小精灵活动的奖励微信达人(90天)微信签到活动(90天)鹰眼勋章鹰眼注册用户专属勋章认证考霸(90天)参加考霸活动,对认证考了十次以上用户的鼓励马年勋章(360天) 马年纪念勋章(360天)微博达人(90天)完成新浪微博加V的奖励,结合活动不定期开放申请。按键精灵开发者6级(新浪V认证)通过新浪微博加V后自动发放,并替换普通的认证6级勋章。 体验先锋勋章新版本体验先锋纪念勋章(360天)脚本作者商业小精灵作者绑定账号后自动赠送
RunApp "Notepad"
如果我的回复对你有帮助,记得给鲜花!
renjinqiaoqq
按键精灵开发者6级(新浪V认证)通过新浪微博加V后自动发放,并替换普通的认证6级勋章。 微博达人(90天)完成新浪微博加V的奖励,结合活动不定期开放申请。学有所成学有所成勋章,新手步入按键学堂的第一枚勋章爱心大使积极帮助新手(可向管理员进行申请)论坛GG按键论坛男性用户勋章教程达人教程达人骨灰级按键用户3年以上的按键论坛用户黄金之翼黄金之翼勋章按键明星按键明星勋章天使勋章天使一样的用户黄瓜勋章(永久)体验商业小精灵活动的奖励幸运草勋章(永久)商业小精灵限时活动勋章。马年勋章(360天) 马年纪念勋章(360天)
楼上都是新建记事本的。。。如果楼主需要直接新建一个记事本
就是楼上两位的那样了当然了
打开已知的的话(比如我们打开d盘下的a.txt文件)
RunApp ("d:\a.txt")这样。。。runapp还有更多的方法操作文件:。。。。。。。。。。。。。。。。。那些你不知道的 RunApp 。。。。。。。。。。。。
如果你觉得帖子可以或者回复不错,请点下边 评分 给朵花花
按键精灵开发者4级可通过提升认证等级来升级勋章:
Plugin.File.OpenFile (路径)
guowei5851
按键精灵开发者6级可通过提升认证等级来升级勋章:学有所成学有所成勋章,新手步入按键学堂的第一枚勋章爱心大使积极帮助新手(可向管理员进行申请)按键图书勋章尊贵的按键图书用户黄瓜勋章(永久)体验商业小精灵活动的奖励鹰眼勋章鹰眼注册用户专属勋章认证考霸(90天)参加考霸活动,对认证考了十次以上用户的鼓励马年勋章(360天) 马年纪念勋章(360天)
多谢各位了哈,已经想起来了,我用的是RunApp "notepad.exe"这个新建一个记事本,多谢多谢,鲜花攒满一一送上
花花哪里去记事本! – 轻巧带手势的记事应用[iOS]
(快来投票)
Loading...
Notepad+ 在细节处理上非常不错,比如可以设置为打开应用即新建一个笔记并且直接进入编辑界面。普通的拖拽排序就不说了,在编辑界面,针对一段文字,右滑添加删除线,左滑改变段落格式,包括 !!! 重要、引用以及项目符号。
Notepad+ 很巧妙的把笔记与列表融合到一起,直接编辑就是笔记,分段就是列表。填写个任务列表很是方便。还支持第三方应用 TextExpander。
每一条笔记都可以设置提醒,内置三小时、今晚、明天、周末、星期一以及 1 个月以后,并且可以在主页右下角的 Reminders 里看到所有设置了提醒的项目。可以添加到通知栏的 Widget 里。
Notepad+ 还支持多级撤销/重做、字体变化、全文搜索、导出 PDF、导入到 Evernote,用 Dropbox 还能进行版本控制。
轻扫清单:创建列表,划掉已完成,并突出显示重要的事项,只需用一个简单的轻扫滑动手势
单击提醒:更快速地保存笔记,包括重复的提醒备忘事项
与所有安装 Dropbox 的设备同步
为iPhone 和 iPad(兼容通用)优化性能
保存到 Evernote
多层次复原和重做
以文件新旧程度、字母顺序、或反向字母顺序来排序
直接打开一个新的笔记,立即捕捉好主意(于“设置”内开启)
全文搜索(标题及记事内容)
输出至 PDF、电子邮件、文本,甚至是 Facebook 和 twitter
夜间模式,可在黑暗中打字
链接模式使手机号码及网址皆可轻击启动
支持 TextExpander
X-url-callback 操作
Premium 付费版本还支持重复提醒、收藏夹、多个主题界面等功能。非常值得一试。
我還以爲是抄UpWord的,結果發現,是改名了……
按分类查看文章:
大家都在讨论些什么
: 可以 经过设置达到我想要的效果
但我还是用会原来的2345的平滑缩放看起来很舒服: 我就看个图,只需要缩放和切换图片和更多的缩略图支持,其他功能说实话我很少用得上,另外我是个追求视觉效果的业余设计,所以我对老风格很抗拒: 玩了几圈 发现这其实还是单机游戏: 不支持复制粘贴,不支持鼠标右键。要命: 那是你只是装上试了试,并没有发现它的可定制性。你所说的问题,设置一下全解决了。你还没有发现它的人性化。: honeyview界面都是可以设置的,菜单栏,悬浮菜单和很多组件都是可以隐藏的,功能不缩水,支持简单的编辑,支持调用其他图片处理软件,支持各种浏览模式,支持各种个性化定制。反正我能想到的小功能它都有了,尤其是能支持根据图片大小调节窗口大小,这个可是我找了很久才找到一个有这个功能的图片浏览器了。
除非你想要一个管理大量图片的工具或者支持云存储的工具,否则honeyview真的非常好。我想要的就是点开一个图片能马上给我不含任何多余的东西的显示出来,但同时又能让我定制其他功能还能有点颜值的,honeyview做到了。: 分别推荐一个比这三个小工具nice的:
Tickeys:按键音效,全平台支持,使用优雅;
WGestures:全局鼠标手势,跟Tickeys是同一个开发者,颜值不错,功能则是比FlyQuick强大了太多。
EverEdit:这个不算小工具了,一个收费的文本编辑器,同样颜值不错,看着挺轻量级但是功能灰常强大,windows下用过最nice的文本编辑器了,就像notepad++和UltraEdit的折中,非常讨喜。
最热门标签
传说中的小众软件 让你的手机应用与众不同。
个人 blog 转载时请遵循 “署名-非商业性使用-相同方式共享” 的创作共用协议;
商业网站或未授权媒体不得复制本站内容。键盘是我们使用计算机的一个很重要的输入设备了,即使在鼠标大行其道的今天,很多程序依然离不开键盘来操作。但是有时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样可以把很多重复性的键盘操作交给程序来模拟,省了很多精力,按键精灵就是这样的一个软件。那么我们怎样才能用VB来写一个程序,达到与按键精灵类似的功能呢?那就让我们来先了解一下windows中响应键盘事件的机制。
& & & & 当用户按下键盘上的一个键时,键盘内的芯片会检测到这个动作,并把这个信号传送到计算机。如何区别是哪一个键被按下了呢?键盘上的所有按键都有一个编码,称作键盘扫描码。当你按下一个键时,这个键的扫描码就被传给系统。扫描码是跟具体的硬件相关的,同一个键,在不同键盘上的扫描码有可能不同。键盘控制器就是将这个扫描码传给计算机,然后交给键盘驱动程序。键盘驱动程序会完成相关的工作,并把这个扫描码转换为键盘虚拟码。什么是虚拟码呢?因为扫描码与硬件相关,不具有通用性,为了统一键盘上所有键的编码,于是就提出了虚拟码概念。无论什么键盘,同一个按键的虚拟码总是相同的,这样程序就可以识别了。简单点说,虚拟码就是我们经常可以看到的像VK_A,VK_B这样的常数,比如键A的虚拟码是65,写成16进制就是&H41,注意,人们经常用16进制来表示虚拟码。当键盘驱动程序把扫描码转换为虚拟码后,会把这个键盘操作的扫描码和虚拟码还有其它信息一起传递给操作系统。然后操作系统则会把这些信息封装在一个消息中,并把这个键盘消息插入到消息列队。最后,要是不出意外的话,这个键盘消息最终会被送到当前的活动窗口那里,活动窗口所在的应用程序接收到这个消息后,就知道键盘上哪个键被按下,也就可以决定该作出什么响应给用户了。这个过程可以简单的如下表示:
用户按下按键-----键盘驱动程序将此事件传递给操作系统-----操作系统将键盘事件插入消息队列-----键盘消息被发送到当前活动窗口
明白了这个过程,我们就可以编程实现在其中的某个环节来模拟键盘操作了。在VB中,有多种方法可以实现键盘模拟,我们就介绍几种比较典型的。
1.局部级模拟
& & & & 从上面的流程可以看出,键盘事件是最终被送到活动窗口,然后才引起目标程序响应的。那么最直接的模拟方法就是:直接伪造一个键盘消息发给目标程序。哈哈,这实在是很简单,windows提供了几个这样的API函数可以实现直接向目标程序发送消息的功能,常用的有SendMessage和PostMessage,它们的区别是PostMessage函数直接把消息仍给目标程序就不管了,而SendMessage把消息发出去后,还要等待目标程序返回些什么东西才好。这里要注意的是,模拟键盘消息一定要用PostMessage函数才好,用SendMessage是不正确的(因为模拟键盘消息是不需要返回值的,不然目标程序会没反应),切记切记!PostMessage函数的VB声明如下:
Declare & Function & PostMessage & Lib & &user32 & & Alias & &PostMessageA & & (ByVal & hwnd & As & Long, & ByVal & wMsg & As & Long, & ByVal & wParam & As & Long, & lParam & As & Any) & As & Long
参数hwnd & 是你要发送消息的目标程序上某个控件的句柄,参数wMsg & 是消息的类型,表示你要发送什么样的消息,最后wParam & 和lParam & 这两个参数是随消息附加的数据,具体内容要由消息决定。
再来看看wMsg & 这个参数,要模拟按键就靠这个了。键盘消息常用的有如下几个:
WM_KEYDOWN & & & & & 表示一个普通键被按下
WM_KEYUP & & & & & & & 表示一个普通键被释放
WM_SYSKEYDOWN & & 表示一个系统键被按下,比如Alt键
WM_SYSKEYUP & & & & 表示一个系统键被释放,比如Alt键
如果你确定要发送以上几个键盘消息,那么再来看看如何确定键盘消息中的wParam & 和lParam & 这两个参数。在一个键盘消息中,wParam & 参数的含义较简单,它表示你要发送的键盘事件的按键虚拟码,比如你要对目标程序模拟按下A键,那么wParam & 参数的值就设为VK_A & ,至于lParam & 这个参数就比较复杂了,因为它包含了多个信息,一般可以把它设为0,但是如果你想要你的模拟更真实一些,那么建议你还是设置一下这个参数。那么我们就详细了解一下lParam & 吧。lParam & 是一个long类型的参数,它在内存中占4个字节,写成二进制就是
& & 一共是32位,我们从右向左数,假设最右边那位为第0位(注意是从0而不是从1开始计数),最左边的就是第31位,那么该参数的的0-15位表示键的发送次数等扩展信息,16-23位为按键的扫描码,24-31位表示是按下键还是释放键。大家一般习惯写成16进制的,那么就应该是&H00 & 00 & 00 & 00 & ,第0-15位一般为&H0001,如果是按下键,那么24-31位为&H00,释放键则为&HC0,那么16-23位的扫描码怎么会得呢?这需要用到一个API函数MapVirtualKey,这个函数可以将虚拟码转换为扫描码,或将扫描码转换为虚拟码,还可以把虚拟码转换为对应字符的ASCII码。它的VB声明如下:
Declare & Function & MapVirtualKey & Lib & &user32 & & Alias & &MapVirtualKeyA & & (ByVal & wCode & As & Long, & ByVal & wMapType & As & Long) & As & Long
参数wCode & 表示待转换的码,参数wMapType & 表示从什么转换为什么,如果是虚拟码转扫描码,则wMapType & 设置为0,如果是虚拟扫描码转虚拟码,则wMapType & 设置为1,如果是虚拟码转ASCII码,则wMapType & 设置为2.相信有了这些,我们就可以构造键盘事件的lParam参数了。下面给出一个构造lParam参数的函数:
Declare & Function & MapVirtualKey & Lib & &user32 & & Alias & &MapVirtualKeyA & & (ByVal & wCode & As & Long, & ByVal & wMapType & As & Long) & As & Long
Function & MakeKeyLparam(ByVal & VirtualKey & As & Long, & ByVal & flag & As & Long) & As & Long
'参数VirtualKey表示按键虚拟码,flag表示是按下键还是释放键,用WM_KEYDOWN和WM_KEYUP这两个常数表示
& & & & Dim & s & As & String
& & & & Dim & Firstbyte & As & String & & & & 'lparam参数的24-31位
& & & & If & flag & = & WM_KEYDOWN & & Then & '如果是按下键
& & & & & & & & Firstbyte & = & &00 &
& & & & Else
& & & & & & & & Firstbyte & = & &C0 & & & & & & & & '如果是释放键
& & & & End & If
& & & & Dim & Scancode & As & Long
& & & & '获得键的扫描码
& & & & Scancode & = & MapVirtualKey(VirtualKey, & 0)
& & & & Dim & Secondbyte & As & String & & & 'lparam参数的16-23位,即虚拟键扫描码
& & & & Secondbyte & = & Right( &00 & & & & Hex(Scancode), & 2)
& & & & s & = & Firstbyte & & & Secondbyte & & & &0001 & & & '0001为lparam参数的0-15位,即发送次数和其它扩展信息
& & & & MakeKeyLparam & = & Val( &&H & & & & s)
End & Function
这个函数像这样调用,比如按下A键,那么lParam=MakeKeyLparam(VK_A,WM_KEYDOWN) & ,很简单吧。值得注意的是,即使你发送消息时设置了lParam参数的值,但是系统在传递消息时仍然可能会根据当时的情况重新设置该参数,那么目标程序收到的消息中lParam的值可能会和你发送时的有所不同。所以,如果你很懒的话,还是直接把它设为0吧,对大多数程序不会有影响的,呵呵。
& & & & 好了,做完以上的事情,现在我们可以向目标程序发送键盘消息了。首先取得目标程序接受这个消息的控件的句柄,比如目标句柄是12345,那么我们来对目标模拟按下并释放A键,像这样:(为了简单起见,lParam这个参数就不构造了,直接传0)
PostMessage & 12345,WM_KEYDOWN,VK_A,0& & & & '按下A键
PostMessage & 12345,WM_UP,VK_A,0& & & & & & & & & '释放A键
好了,一次按键就完成了。现在你可以迫不及待的打开记事本做实验,先用FindWindowEx这类API函数找到记事本程序的句柄,再向它发送键盘消息,期望记事本里能诡异的自动出现字符。可是你马上就是失望了,咦,怎么一点反应也没有?你欺骗感情啊~~~~~~~~~~55 & & 不是的哦,接着往下看啊。
一般目标程序都会含有多个控件,并不是每个控件都会对键盘消息作出反应,只有把键盘消息发送给接受它的控件才会得到期望的反应。那记事本来说,它的编辑框其实是个edit类,只有这个控件才对键盘事件有反应,如果只是把消息发给记事本的窗体,那是没有用的。现在你找出记事本那个编辑框的句柄,比如是54321,那么写如下代码:
PostMessage & 54321,WM_KEYDOWN,VK_F1,0& & & & '按下F1键
PostMessage & 54321,WM_UP,VK_F1,0& & & & & & & & & '释放F1键
怎么样,是不是打开了记事本的“帮助”信息?这说明目标程序已经收到了你发的消息,还不错吧~~~~~~~~
可以马上新问题就来了,你想模拟向记事本按下A这个键,好在记事本里自动输入字符,可是,没有任何反应!这是怎么一回事呢?
原来,如果要向目标程序发送字符,光靠WM_KEYDOWN和WM_UP这两个事件还不行,还需要一个事件:WM_CHAR,这个消息表示一个字符,程序需靠它看来接受输入的字符。一般只有A,B,C等这样的按键才有WM_CHAR消息,别的键(比如方向键和功能键)是没有这个消息的,WM_CHAR消息一般发生在WM_KEYDOWN消息之后。WM_CHAR消息的lParam参数的含义与其它键盘消息一样,而它的wParam则表示相应字符的ASCII编码(可以输入中文的哦^_^),现在你可以写出一个完整的向记事本里自动写入字符的程序了,下面是一个例子,并附有这些消息常数的具体值:
Declare & Function & PostMessage & Lib & &user32 & & Alias & &PostMessageA & & (ByVal & hwnd & As & Long, & ByVal & wMsg & As & Long, & ByVal & wParam & As & Long, & lParam & As & Any) & As & Long
Declare & Function & MapVirtualKey & Lib & &user32 & & Alias & &MapVirtualKeyA & & (ByVal & wCode & As & Long, & ByVal & wMapType & As & Long) & As & Long
Public & Const & WM_KEYDOWN & = & &H100
Public & Const & WM_KEYUP & = & &H101
Public & Const & WM_CHAR & = & &H102
Public & Const & VK_A & = & &H41 &
Function & MakeKeyLparam(ByVal & VirtualKey & As & Long, & ByVal & flag & As & Long) & As & Long
& & & & Dim & s & As & String
& & & & Dim & Firstbyte & As & String & & & & 'lparam参数的24-31位
& & & & If & flag & = & WM_KEYDOWN & & Then & '如果是按下键
& & & & & & & & Firstbyte & = & &00 &
& & & & Else
& & & & & & & & Firstbyte & = & &C0 & & & & & & & & '如果是释放键
& & & & End & If
& & & & Dim & Scancode & As & Long
& & & & '获得键的扫描码
& & & & Scancode & = & MapVirtualKey(VirtualKey, & 0)
& & & & Dim & Secondbyte & As & String & & & 'lparam参数的16-23位,即虚拟键扫描码
& & & & Secondbyte & = & Right( &00 & & & & Hex(Scancode), & 2)
& & & & s & = & Firstbyte & & & Secondbyte & & & &0001 & & & '0001为lparam参数的0-15位,即发送次数和其它扩展信息
& & & & MakeKeyLparam & = & Val( &&H & & & & s)
End & Function
Private & Sub & Form_Load()
& & & & dim & hwnd & as & long
& & & & hwnd & = & XXXXXX & & 'XXXXX表示记事本编辑框的句柄
& & & & PostMessage & hwnd,WM_KEYDOWN,VK_A,MakeKeyLparam(VK_A,WM_KEYDOWN) & & '按下A键
& & & & PostMessage & hwnd,WM_CHAR,ASC( &A &),MakeKeyLparam(VK_A,WM_KEYDOWN) & & '输入字符A
& & & & PostMessage & hwnd,WM_UP,VK_A,MakeKeyLparam(VK_A,WM_UP) & & & & & & & '释放A键
这就是通过局部键盘消息来模拟按键。这个方法有一个极大的好处,就是:它可以实现后台按键,也就是说他对你的前台操作不会有什么影响。比如,你可以用这个方法做个程序在游戏中模拟按键来不断地执行某些重复的操作,而你则一边喝茶一边与QQ上的MM们聊得火热,它丝毫不会影响你的前台操作。无论目标程序是否获得焦点都没有影响,这就是后台模拟按键的原理啦~~~~
2.全局级模拟
& & & & 你会发现,用上面的方法模拟按键并不是对所有程序都有效的,有的程序啊,你向它发了一大堆消息,可是它却一点反应也没有。这是怎么回事呢?这就要看具体的情况了,有些程序(特别是一些游戏)出于某些原因,会禁止用户对它使用模拟按键程序,这个怎么实现呢?比如可以在程序中检查一下,如果发现自己不是活动窗口,就不接受键盘消息。或者仔细检查一下收到的键盘消息,你会发现真实的按键和模拟的按键消息总是有一些小差别,从这些小差别上,目标程序就能判断出:这是假的!是伪造的!!因此,如果用PostMessage发送局部消息模拟按键不成功的话,你可以试一试全局级的键盘消息,看看能不能骗过目标程序。
模拟全局键盘消息常见的可以有以下一些方法:
(1) & 用API函数keybd_event,这个函数可以用来模拟一个键盘事件,它的VB声明为:
Declare & Sub & keybd_event & Lib & &user32 & & (ByVal & bVk & As & Byte, & ByVal & bScan & As & Byte, & ByVal & dwFlags & As & Long, & ByVal & dwExtraInfo & As & Long)
参数bVk表示要模拟的按键的虚拟码,bScan表示该按键的扫描码(一般可以传0),dwFlags表示是按下键还是释放键(按下键为0,释放键为2),dwExtraInfo是扩展标志,一般没有用。比如要模拟按下A键,可以这样:
Const & KEYEVENTF_KEYUP & = & &H2
keybd_event & VK_A, & 0, & 0, & 0 & & & '按下A键
keybd_event & VK_A, & 0, & KEYEVENTF_KEYUP, & 0 & & & '释放A键
注意有时候按键的速度不要太快,否则会出问题,可以用API函数Sleep来进行延时,声明如下:
Declare & Sub & Sleep & Lib & &kernel32 & & (ByVal & dwMilliseconds & As & Long)
参数dwMilliseconds表示延时的时间,以毫秒为单位。
那么如果要模拟按下功能键怎么做呢?比如要按下Ctrl+C实现拷贝这个功能,可以这样:
keybd_event & VK_Ctrl, & 0, & 0, & 0 & & & '按下Ctrl键
keybd_event & VK_C, & 0, & 0, & 0 & & & & & & '按下C键
Sleep & 500 & & & & & & & & & & & & '延时500毫秒
keybd_event & VK_C, & 0, & KEYEVENTF_KEYUP, & 0 & & & '释放C键
keybd_event & VK_Ctrl, & 0, & KEYEVENTF_KEYUP, & 0 & & & '释放Ctrl键
好了,现在你可以试试是不是可以骗过目标程序了,这个函数对大部分的窗口程序都有效,可是仍然有一部分游戏对它产生的键盘事件熟视无睹,这时候,你就要用上bScan这个参数了。一般的,bScan都传0,但是如果目标程序是一些DirectX游戏,那么你就需要正确使用这个参数传入扫描码,用了它可以产生正确的硬件事件消息,以被游戏识别。这样的话,就可以写成这样:
keybd_event & VK_A, & MapVirtualKey(VK_A, & 0), & 0, & 0 & & & '按下A键
keybd_event & VK_A, & MapVirtualKey(VK_A, & 0), & KEYEVENTF_KEYUP, & 0 & & & '释放A键
以上就是用keybd_event函数来模拟键盘事件。除了这个函数,SendInput函数也可以模拟全局键盘事件。SendInput可以直接把一条消息插入到消息队列中,算是比较底层的了。它的VB声明如下:
Declare & Function & SendInput & Lib & &user32.dll & & (ByVal & nInputs & As & Long, & pInputs & As & GENERALINPUT, & ByVal & cbSize & As & Long) & As & Long
nlnprts:定义plnputs指向的结构的数目。
plnputs:指向INPUT结构数组的指针。每个结构代表插人到键盘或鼠标输入流中的一个事件。
cbSize:定义INPUT结构的大小。若cbSize不是INPUT结构的大小,则函数调用失败。
返回值:函数返回被成功地插人键盘或鼠标输入流中的事件的数目。若要获得更多的错误信息,可以调用GetlastError函数。
备注:Sendlnput函数将INPUT结构中的事件顺序地插入键盘或鼠标的输入流中。这些事件与用户插入的(用鼠标或键盘)或调用keybd_event,mouse_event,或另外的Sendlnput插人的键盘或鼠标的输入流不兼容。
嗯,这个函数用起来蛮复杂的,因为它的参数都是指针一类的东西。要用它来模拟键盘输入,先要构造一组数据结构,把你要模拟的键盘消息装进去,然后传给它。为了方便起见,把它做在一个过程里面,要用的时候直接调用好了,代码如下:
Declare & Function & SendInput & Lib & &user32.dll & & (ByVal & nInputs & As & Long, & pInputs & As & GENERALINPUT, & ByVal & cbSize & As & Long) & As & Long
Declare & Sub & CopyMemory & Lib & &kernel32 & & Alias & &RtlMoveMemory & & (pDst & As & Any, & pSrc & As & Any, & ByVal & ByteLen & As & Long)
& Type & GENERALINPUT
& & & dwType & As & Long
& & & xi(0 & To & 23) & As & Byte
& End & Type
& Type & KEYBDINPUT
& & wVk & As & Integer
& & wScan & As & Integer
& & dwFlags & As & Long
& & time & As & Long
& & dwExtraInfo & As & Long
& End & Type
Const & INPUT_KEYBOARD & = & 1
Sub & MySendKey(bkey & As & Long)
'参数bkey传入要模拟按键的虚拟码即可模拟按下指定键
Dim & GInput(0 & To & 1) & As & GENERALINPUT
Dim & KInput & As & KEYBDINPUT
& KInput.wVk & = & bkey & & '你要模拟的按键
& KInput.dwFlags & = & 0 & '按下键标志
& GInput(0).dwType & = & INPUT_KEYBOARD
& CopyMemory & GInput(0).xi(0), & KInput, & Len(KInput) & '这个函数用来把内存中KInput的数据复制到GInput
& KInput.wVk & = & bkey & &
& KInput.dwFlags & = & KEYEVENTF_KEYUP & & ' & 释放按键
& GInput(1).dwType & = & INPUT_KEYBOARD & ' & 表示该消息为键盘消息
& CopyMemory & GInput(1).xi(0), & KInput, & Len(KInput)
'以上工作把按下键和释放键共2条键盘消息加入到GInput数据结构中
& SendInput & 2, & GInput(0), & Len(GInput(0)) & & & & '把GInput中存放的消息插入到消息列队
& & & & 除了以上这些,用全局钩子也可以模拟键盘消息。如果你对windows中消息钩子的用法已经有所了解,那么你可以通过设置一个全局HOOK来模拟键盘消息,比如,你可以用WH_JOURNALPLAYBACK这个钩子来模拟按键。WH_JOURNALPLAYBACK是一个系统级的全局钩子,它和WH_JOURNALRECORD的功能是相对的,常用它们来记录并回放键盘鼠标操作。WH_JOURNALRECORD钩子用来将键盘鼠标的操作忠实地记录下来,记录下来的信息可以保存到文件中,而WH_JOURNALPLAYBACK则可以重现这些操作。当然亦可以单独使用WH_JOURNALPLAYBACK来模拟键盘操作。你需要首先声明SetWindowsHookEx函数,它可以用来安装消息钩子:
Declare & Function & SetWindowsHookEx & Lib & &user32 & & Alias & &SetWindowsHookExA & & (ByVal & idHook & As & Long,ByVal & lpfn & As & Long, & ByVal & hmod & As & Long, & ByVal & dwThreadId & As & Long) & As & Long
先安装WH_JOURNALPLAYBACK这个钩子,然后你需要自己写一个钩子函数,在系统调用它时,把你要模拟的事件传递给钩子参数lParam所指向的EVENTMSG区域,就可以达到模拟按键的效果。不过用这个钩子模拟键盘事件有一个副作用,就是它会锁定真实的鼠标键盘,不过如果你就是想在模拟的时候不会受真实键盘操作的干扰,那么用用它倒是个不错的主意。
3.驱动级模拟
& & & & 如果上面的方法你都试过了,可是你发现目标程序却仍然顽固的不接受你模拟的消息,寒~~~~~~~~~还好,我还剩下最后一招,这就是驱动级模拟:直接读写键盘的硬件端口!
& & & & 有一些使用DirectX接口的游戏程序,它们在读取键盘操作时绕过了windows的消息机制,而使用DirectInput.这是因为有些游戏对实时性控制的要求比较高,比如赛车游戏,要求以最快速度响应键盘输入。而windows消息由于是队列形式的,消息在传递时会有不少延迟,有时1秒钟也就传递十几条消息,这个速度达不到游戏的要求。而DirectInput则绕过了windows消息,直接与键盘驱动程序打交道,效率当然提高了不少。因此也就造成,对这样的程序无论用PostMessage或者是keybd_event都不会有反应,因为这些函数都在较高层。对于这样的程序,只好用直接读写键盘端口的方法来模拟硬件事件了。要用这个方法来模拟键盘,需要先了解一下键盘编程的相关知识。
& & & & 在DOS时代,当用户按下或者放开一个键时,就会产生一个键盘中断(如果键盘中断是允许的),这样程序会跳转到BIOS中的键盘中断处理程序去执行。打开windows的设备管理器,可以查看到键盘控制器由两个端口控制。其中&H60是数据端口,可以读出键盘数据,而&H64是控制端口,用来发出控制信号。也就是,从&H60号端口可以读此键盘的按键信息,当从这个端口读取一个字节,该字节的低7位就是按键的扫描码,而高1位则表示是按下键还是释放键。当按下键时,最高位为0,称为通码,当释放键时,最高位为1,称为断码。既然从这个端口读数据可以获得按键信息,那么向这个端口写入数据就可以模拟按键了!用过QbASIC4.5的朋友可能知道,QB中有个OUT命令可以向指定端口写入数据,而INP函数可以读取指定端口的数据。那我们先看看如果用QB该怎么写代码:
假如你想模拟按下一个键,这个键的扫描码为&H50,那就这样
OUT & &H64,&HD2 & & & '把数据&HD2发送到&H64端口。这是一个KBC指令,表示将要向键盘写入数据
OUT & &H60,&H50 & & & '把扫描码&H50发送到&H60端口,表示模拟按下扫描码为&H50的这个键
那么要释放这个键呢?像这样,发送该键的断码:
OUT & &H64,&HD2 & & & '把数据&HD2发送到&H64端口。这是一个KBC指令,表示将要向键盘写入数据
OUT & &H60,(&H50 & OR & &H80) & & & '把扫描码&H50与数据&H80进行或运算,可以把它的高位置1,得到断码,表示释放这个键
& & & & 好了,现在的问题就是在VB中如何向端口写入数据了。因为在windows中,普通应用程序是无权操作端口的,于是我们就需要一个驱动程序来帮助我们实现。在这里我们可以使用一个组件WINIO来完成读写端口操作。什么是WINIO?WINIO是一个全免费的、无需注册的、含源程序的WINDOWS2000端口操作驱动程序组件(可以到/上去下载)。它不仅可以操作端口,还可以操作内存;不仅能在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函数声明:
Declare & Function & MapPhysToLin & Lib & &WinIo.dll & & (ByVal & PhysAddr & As & Long, & ByVal & PhysSize & As & Long, & ByRef & PhysMemHandle) & As & Long
Declare & Function & UnmapPhysicalMemory & Lib & &WinIo.dll & & (ByVal & PhysMemHandle, & ByVal & LinAddr) & As & Boolean
Declare & Function & GetPhysLong & Lib & &WinIo.dll & & (ByVal & PhysAddr & As & Long, & ByRef & PhysVal & As & Long) & As & Boolean
Declare & Function & SetPhysLong & Lib & &WinIo.dll & & (ByVal & PhysAddr & As & Long, & ByVal & PhysVal & As & Long) & As & Boolean
Declare & Function & GetPortVal & Lib & &WinIo.dll & & (ByVal & PortAddr & As & Integer, & ByRef & PortVal & As & Long, & ByVal & bSize & As & Byte) & As & Boolean
Declare & Function & SetPortVal & Lib & &WinIo.dll & & (ByVal & PortAddr & As & Integer, & ByVal & PortVal & As & Long, & ByVal & bSize & As & Byte) & As & Boolean
Declare & Function & InitializeWinIo & Lib & &WinIo.dll & & () & As & Boolean
Declare & Function & ShutdownWinIo & Lib & &WinIo.dll & & () & As & Boolean
Declare & Function & InstallWinIoDriver & Lib & &WinIo.dll & & (ByVal & DriverPath & As & String, & ByVal & Mode & As & Integer) & As & Boolean
Declare & Function & RemoveWinIoDriver & Lib & &WinIo.dll & & () & As & Boolean
' & ------------------------------------以上是WINIO函数声明-------------------------------------------
Declare & Function & MapVirtualKey & Lib & &user32 & & Alias & &MapVirtualKeyA & & (ByVal & wCode & As & Long, & ByVal & wMapType & As & Long) & As & Long
'-----------------------------------以上是WIN32 & API函数声明-----------------------------------------
再添加下面这个过程:
Sub & KBCWait4IBE() & & & '等待键盘缓冲区为空
Dim & dwVal & As & Long
& & GetPortVal & &H64, & dwVal, & 1
'这句表示从&H64端口读取一个字节并把读出的数据放到变量dwVal中
'GetPortVal函数的用法是GetPortVal & 端口号,存放读出数据的变量,读入的长度
& & Loop & While & (dwVal & And & &H2)
上面的是一个根据KBC规范写的过程,它的作用是在向键盘端口写入数据前等待一段时间,后面将会用到。
然后再添加如下过程,这2个过程用来模拟按键:
Public & Const & KBC_KEY_CMD & = & &H64 & & & & '键盘命令端口
Public & Const & KBC_KEY_DATA & = & &H60 & & & '键盘数据端口
Sub & MyKeyDown(ByVal & vKeyCoad & As & Long) & & &
'这个用来模拟按下键,参数vKeyCoad传入按键的虚拟码
Dim & btScancode & As & Long
btScancode & = & MapVirtualKey(vKeyCoad, & 0)
& & & & KBCWait4IBE & & & '发送数据前应该先等待键盘缓冲区为空
& & & & SetPortVal & KBC_KEY_CMD, & &HD2, & 1 & & & & & '发送键盘写入命令
'SetPortVal函数用于向端口写入数据,它的用法是SetPortVal & 端口号,欲写入的数据,写入数据的长度
& & & & KBCWait4IBE
& & & & SetPortVal & KBC_KEY_DATA, & btScancode, & 1 & & '写入按键信息,按下键
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:219213次
积分:3515
积分:3515
排名:第6585名
原创:121篇
转载:85篇
评论:44条
(1)(8)(2)(3)(1)(1)(1)(2)(1)(1)(12)(5)(2)(1)(1)(3)(1)(5)(8)(3)(4)(1)(1)(5)(4)(2)(1)(4)(1)(2)(4)(2)(5)(1)(1)(4)(1)(1)(1)(6)(1)(3)(12)(1)(1)(4)(4)(2)(2)(3)(1)(2)(6)(3)(1)(7)(6)(3)(12)(2)(3)(2)(11)(2)

我要回帖

更多关于 ipad键盘怎么换皮肤 的文章

 

随机推荐