vb模拟键盘详解
模拟键盘鼠标
![模拟键盘鼠标](https://img.taocdn.com/s3/m/01d65226482fb4daa58d4b97.png)
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
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参数的函数:
WM_KEYUP 表示一个普通键被释放
WM_SYSKEYDOWN 表示一个系统键被按下,比如Alt键
WM_SYSKEYUP 表示一个系统键被释放,比如Alt键
如果你确定要发送以上几个键盘消息,那么再来看看如何确定键盘消息中的wParam 和lParam 这两个参数。在一个键盘消息中,wParam 参数的含义较简单,它表示你要发送的键盘事件的按键虚拟码,比如你要对目标程序模拟按下A键,那么wParam 参数的值就设为VK_A ,至于lParam 这个参数就比较复杂了,因为它包含了多个信息,一般可以把它设为0,但是如果你想要你的模拟更真实一些,那么建议你还是设置一下这个参数。那么我们就详细了解一下lParam 吧。lParam 是一个long类型的参数,它在内存中占4个字节,写成二进制就是00000000 00000000 00000000 00000000 一共是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声明如下:
VB完美模拟键盘输入
![VB完美模拟键盘输入](https://img.taocdn.com/s3/m/f95ec8f87c1cfad6195fa7c0.png)
Public Const VK_CONTEXTKEY = &H5D
Public Const VK_NUMPAD0 = &H60
Public Const VK_NUMPAD1 = &H61
Public Const VK_NUMPAD2 = &H62
'▼该函数检取指定虚拟键的状态。该状态指定此键是UP状态,DOWN状态,还是被触发的(开关每次按下此键时进行切换)。
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
'▼该函数使过程休眠以毫秒计的用户定义时间。
'参数bVk表示要模拟的按键的虚拟码,bScan表示该按键的扫描码(一般可以传0),dwFlags表示是按下键还是释放键(按下键为0,释放键为2),dwExtraInfo是扩展标志,一般没有用。
'▼键码常量表
Private Const KEYEVENTF_KEYUP = &H2
Public Const VK_LBUTTON = &H1
'=============全功能模拟键盘鼠标操作(一)----模拟键盘进行按键或信息录入操作。范围:任意数字、字母的组合,模拟过程:逐个发送连续字符串中键名信息================================
'作者: ghong3298226 (原创)
'作者QQ:87732850
Public Const VK_RETURN = &HD
vb模拟键盘详解汇总
![vb模拟键盘详解汇总](https://img.taocdn.com/s3/m/2fcaa2d67c1cfad6195fa747.png)
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,但是如果你想要你的模拟更真实一些,那么建议你还是设置一下这个参数。
VB制作软键盘
![VB制作软键盘](https://img.taocdn.com/s3/m/39dda0586529647d262852ad.png)
用VB 制作软键盘看见微软智能拼音输入法的小键盘了吗?那东东可以在输入的时候用代替键盘。
当不希望操作员使用键盘的时候,那么你就要考虑为她或他提供软键盘了。
下面我们就用VB 来做这个软键盘。
准备工作:先画两个窗体Form1 和Form2,Form2 是作为接收按键测试用的,在上面放一个文本框Text1,把Text1 的MultiLine 属性设为True,ScrollBars 设为3-Both, 然后写入如下代码:Private Declare Function EnableWindow Lib "user32" (ByV al hwnd As Long, ByV al fEnable As Long) AsLongPrivate Sub Form_Load() ‘调整大小Me.Width = Screen.Width * 0.9Me.Height = Screen.Height * 0.9Form1.Show ‘禁止鼠标和键盘输入EnableWindow Text1.hwnd, FalseEnd SubPrivate Sub Form_Resize() ‘调整文本框大小Text1.Top = 0Text1.Left = 0Text1.Width = Me.ScaleWidthText1.Height = Me.ScaleHeightEnd SubPrivate Sub Form_Unload(Cancel As Integer)EndEnd SubForm1 作为小键盘用,把它的BorderStyle 设为3-Fixed Dialog, 把ControlBox 属性设为False,这样小键盘就没有标题栏了。
Forml得跟微软智能拼音输入法的小键盘完全一样的大小的窗体,经笔者的计算长x高是5310 x 2130。
然后放上10个按扭,其中九个的Caption 分别是Tab、Caps、f Shift、Ins、Del、(空格)、Esc、Enter 和—(退格)。
vbSendKeys方法
![vbSendKeys方法](https://img.taocdn.com/s3/m/415144560a4e767f5acfa1c7aa00b52acfc79c0c.png)
vbSendKeys方法
1.模拟按键:
2.输入文本:
3.模拟组合键:
4.间隔时间:
5. 启用/禁用vbSendKeys方法:
需要注意的是,vbSendKeys方法在模拟键盘输入时,键盘焦点必须在接收输入的窗口上。
因此,在调用vbSendKeys方法前,可以使用AppActivate方法将焦点设置到指定的窗口上。
另外,vbSendKeys方法也可以结合循环和条件语句等控制结构,实现更复杂的键盘输入操作。
例如:
```
'循环输入数字1到9
For i = 1 To 9
Next i
'根据条件输入不同的文本
If condition = True Then
Else
End If
```
需要注意的是,vbSendKeys方法虽然可以实现自动化键盘输入操作,但它并不适用于所有情况。
特别是在与其他窗口同时交互或与网络操作相
关的应用程序中,可能会遇到一些问题。
在使用vbSendKeys方法时,应
谨慎选择使用场景,并测试确保其按预期工作。
总结:vbSendKeys方法是Visual Basic中的一个关键方法,用于模
拟键盘输入操作。
通过该方法,可以模拟按键、输入文本、模拟组合键等
操作。
并且可以结合循环和条件语句等控制结构,实现更复杂的键盘输入
操作。
使用vbSendKeys方法时,需要确保窗口焦点正确设置,且在特定
场景下会有一些限制。
Visual Basic后台模拟按键
![Visual Basic后台模拟按键](https://img.taocdn.com/s3/m/460448c4360cba1aa811da82.png)
VB万能后台模拟按键“相信大家对QQ系列的游戏都有所了解,防外挂技术更是了得!都有所谓的驱动保护,常规方法读写内存都无效,因为TX的驱动过滤了很多常规的API,还有什么分析工具都不能用,对于QQ西游这款游戏来说,CE,ME,RE都不能用,即使能获得目标进程句柄,游戏还会定时检测,一旦发现如上工具就自行了断了!还有QQ西游实现挂机也遇到了难题呢,一般的发送窗口按键消息通通封杀,于是有人想到了硬件级的模拟按键,使用WinIo模拟,默认的驱动被TX封杀了,只有自己写,但是也不能实现后台挂机,这样用处也不大!”[问题一,不能获得窗口句柄]一般寻找窗口句柄都是直接FindWindow吧,这样是不行的,QQ西游在这些函数上做了一些处理.我来给大家说个万能的方法吧,对于GetWindowText方法游戏就管不到了,可以配合使用GetWindow来枚举所有的窗口,再判断枚举的窗口里面是否含有游戏窗口标题文字,最后取其句柄就行了,下面我给段代码,也给还有疑问的朋友一些帮助,唷嘻!Option ExplicitPrivate Declare Function GetDesktopWindow Lib "USER32" () As LongPrivate Declare Function GetWindow Lib "USER32" (ByVal hwnd As Long, ByVal wCmd As Long) As LongPublic Declare Function GetWindowText Lib "USER32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As LongPrivate Const GW_CHILD = 5Private Const GW_HWNDNEXT = 2Public Function GetHandle(Title As String) As LongDim tmp As StringDim hwnd As LongDim lngProcID As LongDim strTitle As String * 255 '//用来存储窗口的标题'//取得桌面窗口hwnd = GetDesktopWindow()'//取得桌面窗口的第一个子窗口hwnd = GetWindow(hwnd, GW_CHILD)'//通过循环来枚举所有的窗口Do While hwnd <> 0'//取得下一个窗口的标题,并写入到列表框中GetWindowText hwnd, strTitle, Len(strTitle)If left$(strTitle, 1) <> vbNullChar Thentmp = left$(strTitle, InStr(1, strTitle, vbNullChar))If left(tmp, Len(Title)) = Title ThenGetHandle=hwndEnd IfEnd If'//调用GetWindow函数,来取得下一个窗口hwnd = GetWindow(hwnd, GW_HWNDNEXT)LoopEnd Function直接调用GetHandle函数,然后传一个窗口标题进去就可以获得其窗口句柄了.[问题二,不能后台模拟按键]一般发送按键消息都是SendMessage吧,也有用PostMessage的,一般人用这两个函数都不成功,于是就走向硬件级的模拟按键,其实这是错误的,这样反而离目标越来越远,使用普通的PostMessage就行了,有人问了,不是过滤了么?呵呵,让我们重新来了解下键盘按键的流程吧。
VB模拟按键终极教程
![VB模拟按键终极教程](https://img.taocdn.com/s3/m/95a9f562783e0912a2162a83.png)
VB模擬按鍵終極教程`有了它`啥游戏都不怕全局級模擬你會發現,用上面的方法類比按鍵並不是對所有程式都有效的,有的程式啊,你向它發了一大堆消息,可是它卻一點反應也沒有。
這是怎麼回事呢?這就要看具體的情況了,有些程式(特別是一些遊戲)出於某些原因,會禁止用戶對它使用類比按鍵程式,這個怎麼實現呢?比如可以在程式中檢查一下,如果發現自己不是活動視窗,就不接受鍵盤消息。
或者仔細檢查一下收到的鍵盤消息,你會發現真實的按鍵和類比的按鍵消息總是有一些小差別,從這些小差別上,目的程式就能判斷出:這是假的!是偽造的!!因此,如果用PostMessage發送局部消息類比按鍵不成功的話,你可以試一試全局級的鍵盤消息,看看能不能騙過目的程式。
類比全局鍵盤消息常見的可以有以下一些方法:(1) 用API函數keybd_event,這個函數可以用來類比一個鍵盤事件,它的VB聲明為:Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags A s Long, ByVal dwExtraInfo As Long)參數bVk表示要類比的按鍵的虛擬碼,bScan表示該按鍵的掃描碼(一般可以傳0),dwFlags表示是按下鍵還是釋放鍵(按下鍵為0,釋放鍵為2),dwExtraInfo是擴展標誌,一般沒有用。
比如要模擬按下A鍵,可以這樣:Const KEYEVENTF_KEYUP = &H2keybd_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表示延時的時間,以毫秒為單位。
VBS基础篇 vbscript Sendkeys模拟键盘操作
![VBS基础篇 vbscript Sendkeys模拟键盘操作](https://img.taocdn.com/s3/m/63be043365ce05087732134e.png)
VBS基础篇vbscript Sendkeys模拟键盘操作vbscript中我们可以使用object.SendKeys模拟键盘操作,将一个或多个按键指令发送到指定Windows窗口来控制应用程序运行。
其使用格式为:object.SendKeys(string)object:表示WshShell对象string:表示要发送的按键指令字符串,需要放在英文双引号中。
WshShel l.SendKeys “string”1、基本键一般来说,要发送的按键指令都可以直接用该按键字符本身来表示,例如要发送字母"x",使用WshShell.SendKeys "x" 即可。
也可直接发送多个按键指令,只需要将按键字符按顺序排列在一起即可。
例如,要发送按键"cfan",可以使用WshShell.SendKeys "cfan"2、特殊功能键对于需要与Shift、Ctrl、Alt三个控制键组合的按键SendKeys使用特殊字符来表示:Shift +Ctrl ^Alt %具体如下:Shift ---------WshShell.SendKeys "+"Ctrl---------WshShell.SendKeys "^"Alt---------WshShell.SendKeys "%"由于“+”、“^”这些字符用来表示特殊的控制按键了,如何表示这些按键呢?只要用大括号括住这些字符即可。
例如: 要发送加号“+”,可使用“WshSh ell.SendKeys "{+}"”另外对于一些不会生成字符的控制功能按键,也同样需要使用大括号括起来按键的名称。
例如要发送回车键,需要用“WshShell.SendKeys "{ENTER}" ”表示;发送向下的方向键用“Wshell.SendKeys "{DOWN}" ”表示Space---------WshShell.SendKeys " "Enter---------WshShell.SendKeys "{ENTER}"←---------WshShell.SendKeys "{RIGHT}"↑---------WshShell.SendKeys "{UP}"F1---------WshShell.SendKeys "{F1}"常见按键代码:如果需要发送多个重复的单字母按键,不必重复输入该字母,SendKeys允许使用简化格式进行描述,使用格式为“{按键数字}”。
VB模拟按键终极教程
![VB模拟按键终极教程](https://img.taocdn.com/s3/m/b792ff295627a5e9856a561252d380eb629423a4.png)
VB模拟按键终极教程教程, 模拟VB模拟按键终极教程,有了他,什么游戏都不怕提示:里面有个小彩蛋,找到了,E里的WI NIO你可以自己写!键盘是我们使用计算机的一个很重要的输入设备了,即使在鼠标大行其道的今天,很多程序依然离不开键盘来操作。
但是有时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样可以把很多重复性的键盘操作交给程序来模拟,省了很多精力,按键精灵就是这样的一个软件。
那么我们怎样才能用VB来写一个程序,达到与按键精灵类似的功能呢?那就让我们来先了解一下wind ows中响应键盘事件的机制。
当用户按下键盘上的一个键时,键盘内的芯片会检测到这个动作,并把这个信号传送到计算机。
如何区别是哪一个键被按下了呢?键盘上的所有按键都有一个编码,称作键盘扫描码。
当你按下一个键时,这个键的扫描码就被传给系统。
扫描码是跟具体的硬件相关的,同一个键,在不同键盘上的扫描码有可能不同。
键盘控制器就是将这个扫描码传给计算机,然后交给键盘驱动程序。
键盘驱动程序会完成相关的工作,并把这个扫描码转换为键盘虚拟码。
什么是虚拟码呢?因为扫描码与硬件相关,不具有通用性,为了统一键盘上所有键的编码,于是就提出了虚拟码概念。
无论什么键盘,同一个按键的虚拟码总是相同的,这样程序就可以识别了。
简单点说,虚拟码就是我们经常可以看到的像VK_A,VK_B这样的常数,比如键A的虚拟码是65,写成16进制就是&H41,注意,人们经常用16进制来表示虚拟码。
当键盘驱动程序把扫描码转换为虚拟码后,会把这个键盘操作的扫描码和虚拟码还有其它信息一起传递给操作系统。
VBS基础篇vbscriptSendkeys模拟键盘操作
![VBS基础篇vbscriptSendkeys模拟键盘操作](https://img.taocdn.com/s3/m/3b6a246f26284b73f242336c1eb91a37f1113204.png)
VBS基础篇vbscriptSendkeys模拟键盘操作模拟键盘操作,将⼀个或多个按键指令发送到指定Windows窗⼝来控制应⽤程序运⾏其使⽤格式为:object.SendKeys(string)object:表⽰WshShell对象string:表⽰要发送的按键指令字符串,需要放在英⽂双引号中基本键每个按键由⼀个或多个字符表⽰。
为了指定单⼀键盘字符,必须按字符本⾝的键。
例如,为了表⽰字母 A,可以⽤ "A"为了表⽰多个字符,就必须在字符后⾯直接加上另⼀个字符。
例如,要表⽰ A、B 及 C,可⽤ "ABC" 作为 string。
特殊功能键对于需要与Shift、Ctrl、Alt三个控制键组合的按键,SendKeys使⽤特殊字符来表⽰: Shift ---------WshShell.SendKeys "+" Ctrl---------WshShell.SendKeys "^" Alt---------WshShell.SendKeys "%"由于“+”、“^”这些字符⽤来表⽰特殊的控制按键了,如何表⽰这些按键呢?只要⽤⼤括号括住这些字符即可。
例如: 要发送加号“+”,可使⽤“WshShell.SendKeys "{+}"”另外对于⼀些不会⽣成字符的控制功能按键,也同样需要使⽤⼤括号括起来按键的名称。
例如要发送回车键,需要⽤“ WshShell.SendKeys "{ENTER}" ”表⽰;发送向下的⽅向键⽤“ Wshell.SendKeys "{DOWN}" ”表⽰Space---------WshShell.SendKeys " "Enter---------WshShell.SendKeys "{ENTER}"←---------WshShell.SendKeys "{RIGHT}"↑---------WshShell.SendKeys "{UP}"F1---------WshShell.SendKeys "{F1}"按键代码BACKSPACE{BACKSPACE},BREAK{BREAK}CAPS LOCKDEL orDOWN ARROWEND{END}ENTER{ENTER}或ESC{ESC}HELP{HELP}HOME{HOME}INS orLEFT ARROWNUM LOCKPAGE DOWNPAGE UPPRINT SCREENRIGHT ARROWRIGHT ARROWTAB{TAB}UP ARROWF2{F2}F3{F3}F4{F4}F5{F5}F6{F6}F7{F7}F9{F9}F10{F10}如果需要发送多个重复的单字母按键,不必重复输⼊该字母,SendKeys允许使⽤简化格式进⾏描述,使⽤格式为“{按键数字}”。
模拟键盘
![模拟键盘](https://img.taocdn.com/s3/m/5fdb1a7a561252d380eb6e46.png)
键盘是我们使用计算机的一个很重要的输入设备了,即使在鼠标大行其道的今天,很多程序依然离不开键盘来操作。
但是有时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样可以把很多重复性的键盘操作交给程序来模拟,省了很多精力,按键精灵就是这样的一个软件。
那么我们怎样才能用VB来写一个程序,达到与按键精灵类似的功能呢?那就让我们来先了解一下windows中响应键盘事件的机制。
当用户按下键盘上的一个键时,键盘内的芯片会检测到这个动作,并把这个信号传送到计算机。
如何区别是哪一个键被按下了呢?键盘上的所有按键都有一个编码,称作键盘扫描码。
当你按下一个键时,这个键的扫描码就被传给系统。
扫描码是跟具体的硬件相关的,同一个键,在不同键盘上的扫描码有可能不同。
键盘控制器就是将这个扫描码传给计算机,然后交给键盘驱动程序。
键盘驱动程序会完成相关的工作,并把这个扫描码转换为键盘虚拟码。
什么是虚拟码呢?因为扫描码与硬件相关,不具有通用性,为了统一键盘上所有键的编码,于是就提出了虚拟码概念。
无论什么键盘,同一个按键的虚拟码总是相同的,这样程序就可以识别了。
简单点说,虚拟码就是我们经常可以看到的像VK_A,VK_B 这样的常数,比如键A的虚拟码是65,写成16进制就是&H41,注意,人们经常用16进制来表示虚拟码。
当键盘驱动程序把扫描码转换为虚拟码后,会把这个键盘操作的扫描码和虚拟码还有其它信息一起传递给操作系统。
然后操作系统则会把这些信息封装在一个消息中,并把这个键盘消息插入到消息列队。
最后,要是不出意外的话,这个键盘消息最终会被送到当前的活动窗口那里,活动窗口所在的应用程序接收到这个消息后,就知道键盘上哪个键被按下,也就可以决定该作出什么响应给用户了。
这个过程可以简单的如下表示:用户按下按键-----键盘驱动程序将此事件传递给操作系统-----操作系统将键盘事件插入消息队列-----键盘消息被发送到当前活动窗口明白了这个过程,我们就可以编程实现在其中的某个环节来模拟键盘操作了。
VB模拟按键终极教程
![VB模拟按键终极教程](https://img.taocdn.com/s3/m/b606ab8771fe910ef12df876.png)
MakeKeyLparam = Val("&H" & s)
End Function
这个函数像这样调用,比如按下A键,那么lParam=MakeKeyLparam(VK_A,WM_KEYDOWN) ,很简单吧。值得注意的是,即使你发送消息时设置了lParam参数的值,但是系统在传递消息时仍然可能会根据当时的情况重新设置该参数,那么目标程序收到的消息中lParam的值可能会和你发送时的有所不同。所以,如果你很懒的话,还是直接把它设为0吧,对大多数程序不会有影响的,呵呵。
VBS基础篇vbscriptSendkeys模拟键盘操作
![VBS基础篇vbscriptSendkeys模拟键盘操作](https://img.taocdn.com/s3/m/3b6a246f26284b73f242336c1eb91a37f1113204.png)
VBS基础篇vbscriptSendkeys模拟键盘操作模拟键盘操作,将⼀个或多个按键指令发送到指定Windows窗⼝来控制应⽤程序运⾏其使⽤格式为:object.SendKeys(string)object:表⽰WshShell对象string:表⽰要发送的按键指令字符串,需要放在英⽂双引号中基本键每个按键由⼀个或多个字符表⽰。
为了指定单⼀键盘字符,必须按字符本⾝的键。
例如,为了表⽰字母 A,可以⽤ "A"为了表⽰多个字符,就必须在字符后⾯直接加上另⼀个字符。
例如,要表⽰ A、B 及 C,可⽤ "ABC" 作为 string。
特殊功能键对于需要与Shift、Ctrl、Alt三个控制键组合的按键,SendKeys使⽤特殊字符来表⽰: Shift ---------WshShell.SendKeys "+" Ctrl---------WshShell.SendKeys "^" Alt---------WshShell.SendKeys "%"由于“+”、“^”这些字符⽤来表⽰特殊的控制按键了,如何表⽰这些按键呢?只要⽤⼤括号括住这些字符即可。
例如: 要发送加号“+”,可使⽤“WshShell.SendKeys "{+}"”另外对于⼀些不会⽣成字符的控制功能按键,也同样需要使⽤⼤括号括起来按键的名称。
例如要发送回车键,需要⽤“ WshShell.SendKeys "{ENTER}" ”表⽰;发送向下的⽅向键⽤“ Wshell.SendKeys "{DOWN}" ”表⽰Space---------WshShell.SendKeys " "Enter---------WshShell.SendKeys "{ENTER}"←---------WshShell.SendKeys "{RIGHT}"↑---------WshShell.SendKeys "{UP}"F1---------WshShell.SendKeys "{F1}"按键代码BACKSPACE{BACKSPACE},BREAK{BREAK}CAPS LOCKDEL orDOWN ARROWEND{END}ENTER{ENTER}或ESC{ESC}HELP{HELP}HOME{HOME}INS orLEFT ARROWNUM LOCKPAGE DOWNPAGE UPPRINT SCREENRIGHT ARROWRIGHT ARROWTAB{TAB}UP ARROWF2{F2}F3{F3}F4{F4}F5{F5}F6{F6}F7{F7}F9{F9}F10{F10}如果需要发送多个重复的单字母按键,不必重复输⼊该字母,SendKeys允许使⽤简化格式进⾏描述,使⽤格式为“{按键数字}”。
VB模拟按键终极教程
![VB模拟按键终极教程](https://img.taocdn.com/s3/m/005dd5997e192279168884868762caaedd33bad6.png)
VB模拟按键终极教程VB(Visual Basic)是一种可视化的编程语言,在Windows操作系统中得到广泛应用。
VB可以通过模拟按键实现自动化操作,比如自动填写表单、自动点击按钮等。
本教程将详细介绍如何使用VB来模拟按键操作的终极方法。
首先,我们需要创建一个新的VB项目。
打开VB开发环境,点击“新建项目”并选择“Windows桌面向导”。
在下一步中,选择“Windows窗体应用程序”并命名项目。
点击“确定”开始创建项目。
```Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, _ByVal bScan As Byte, _ByVal dwFlags As Long, _ByVal dwExtraInfo As Long)Private Const KEYEVENTF_KEYUP = &H2```上述代码声明了一个名为keybd_event的函数和一个名为KEYEVENTF_KEYUP的常量。
keybd_event函数用于模拟按键操作,KEYEVENTF_KEYUP常量用于指定按键的释放事件。
然后,在Form_Load事件处理程序中添加以下代码,实现模拟按键操作:```Private Sub Form_Loadkeybd_event(VBKeyLMenu, 0, 0, 0) '按下左Alt键keybd_event(Keys.F, 0, 0, 0) '按下F键keybd_event(Keys.F, 0, KEYEVENTF_KEYUP, 0) '释放F键keybd_event(VBKeyLMenu, 0, KEYEVENTF_KEYUP, 0) '释放左Alt键End Sub```上述代码会在窗体加载时模拟按下左Alt键和F键,并在F键释放后释放左Alt键。
最后,我们需要在按钮的Click事件处理程序中添加代码来触发模拟按键操作。
VB模拟键盘攻略
![VB模拟键盘攻略](https://img.taocdn.com/s3/m/aa44489b6429647d27284b73f242336c1eb93030.png)
VB模拟键盘攻略如下:Set objShell = CreateObject("Wscript.Shell")strCommandLine = "ttpsetup.exe" '启动安装程序objShell.Run(strCommandLine)set WshShell = CreateObject("WScript.Shell")WScript.Sleep 3000 '延时3秒WshShell.SendKeys "s" '模拟按下 S 键开始安装WScript.Sleep 300 '延时0.3秒WshShell.SendKeys "a" '模拟按下 A 键同意协议WScript.Sleep 300WshShell.SendKeys "{ENTER}" '模拟按下回车键执⾏下⼀步WScript.Sleep 300WshShell.SendKeys "{ENTER}" '模拟按下回车键执⾏下⼀步WScript.Sleep 300WshShell.SendKeys "{ENTER}" '模拟按下回车键执⾏下⼀步WScript.Sleep 2000WshShell.SendKeys "{TAB}" '模拟按下 Tab 键选择安装项⽬WScript.Sleep 300WshShell.SendKeys "{TAB}"WScript.Sleep 300WshShell.SendKeys " " '模拟按下空格键去除安装百度超级搜霸⼀⾏前的√号WScript.Sleep 300WshShell.SendKeys "{ENTER}" '模拟按下回车键完成最后⼀步把以上代码复制到记事本中(右边的⽂字是说明,⼀起复制也不影响),再另存为 AutoSetup.vbs ,把此⽂件存放在千千静听安装执⾏程序(ttpsetup.exe)同⼀⽬录下,双击 AutoSetup.vbs 即可⾃动完成千千静听的安装。
vb模拟键盘详解汇总
![vb模拟键盘详解汇总](https://img.taocdn.com/s3/m/2fcaa2d67c1cfad6195fa747.png)
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,但是如果你想要你的模拟更真实一些,那么建议你还是设置一下这个参数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long
PostMessage 12345,WM_UP,VK_A,0& '释放A键
好了,一次按键就完成了。现在你可以迫不及待的打开记事本做实验,先用FindWindowEx这类API函数找到记事本程序的句柄,再向它发送键盘消息,期望记事本里能诡异的自动出现字符。可是你马上就是失望了,咦,怎么一点反应也没有?你欺骗感情啊~~~~~~~~~~55555555555555 不是的哦,接着往下看啊。
'参数VirtualKey表示按键虚拟码,flag表示是按下键还是释放键,用WM_KEYDOWN和WM_KEYUP这两个常数表示
Dim s As String
Dim Firstbyte As String 'lparam参数的24-31位
If flag = WM_KEYDOWN Then '如果是按下键
好了,做完以上的事情,现在我们可以向目标程序发送键盘消息了。首先取得目标程序接受这个消息的控件的句柄,比如目标句柄是12345,那么我们来对目标模拟按下并释放A键,像这样:(为了简单起见,lParam这个参数就不构造了,直接传0)
PostMessage 12345,WM_KEYDOWN,VK_A,0& '按下A键
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 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 这两个参数是随消息附加的数据,具体内容要由消息决定。
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吧,对大多数程序不会有影响的,呵呵。
当用户按下键盘上的一个键时,键盘内的芯片会检测到这个动作,并把这个信号传送到计算机。如何区别是哪一个键被按下了呢?键盘上的所有按键都有一个编码,称作键盘扫描码。当你按下一个键时,这个键的扫描码就被传给系统。扫描码是跟具体的硬件相关的,同一个键,在不同键盘上的扫描码有可能不同。键盘控制器就是将这个扫描码传给计算机,然后交给键盘驱动程序。键盘驱动程序会完成相关的工作,并把这个扫描码转换为键盘虚拟码。什么是虚拟码呢?因为扫描码与硬件相关,不具有通用性,为了统一键盘上所有键的编码,于是就提出了虚拟码概念。无论什么键盘,同一个按键的虚拟码总是相同的,这样程序就可以识别了。简单点说,虚拟码就是我们经常可以看到的像VK_A,VK_B这样的常数,比如键A的虚拟码是65,写成16进制就是&H41,注意,人们经常用16进制来表示虚拟码。当键盘驱动程序把扫描码转换为虚拟码后,会把这个键盘操作的扫描码和虚拟码还有其它信息一起传递给操作系统。然后操作系统则会把这些信息封装在一个消息中,并把这个键盘消息插入到消息列队。最后,要是不出意外的话,这个键盘消息最终会被送到当前的活动窗口那里,活动窗口所在的应用程序接收到这个消息后,就知道键盘上哪个键被按下,也就可以决定该作出什么响应给用户了。这个过程可以简单的如下表示:
Firstbyte = "00"
Else
Firstbyte = "C0" '如果是释放键
End If
Dim Scancode As Long
'获得键的扫描码
Scancode = MapVirtualKey(VirtualKey, 0)
Dim Secondbyte As String 'lparam参数的16-23位,即虚拟键扫描码
PostMessage 54321,WM_KEYDOWN,VK_F1,0& '按下F1键
PostMessage 54321,WM_UP,VK_F1,0& '释放F1键
怎么样,是不是打开了记事本的“帮助”信息?这说明目标程序已经收到了你发的消息,还不错吧~~~~~~~~
可以马上新问题就来了,你想模拟向记事本按下A这个键,好在记事本里自动输入字符,可是,没有任何反应!这是怎么一回事呢?
用户按下按键-----键盘驱动程序将此事件传递给操作系统-----操作系统将键盘事件插入消息队列-----键盘消息被发送到当前活动窗口
明白了这个过程,我们就可以编程实现在其中的某个环节来模拟键盘操作了。在VB中,有多种方法可以实现键盘模拟,我们就介绍几种比较典型的。
1.局部级模拟
从上面的流程可以看出,键盘事件是最终被送到活动窗口,然后才引起目标程序响应的。那么最直接的模拟方法就是:直接伪造一个键盘消息发给目标程序。哈哈,这实在是很简单,windows提供了几个这样的API函数可以实现直接向目标程序发送消息的功能,常用的有SendMessage和PostMessage,它们的区别是PostMessage函数直接把消息仍给目标程序就不管了,而SendMessage把消息发出去后,还要等待目标程序返回些什么东西才好。这里要注意的是,模拟键盘消息一定要用PostMessage函数才好,用SendMessage是不正确的(因为模拟键盘消息是不需要返回值的,不然目标程序会没反应),切记切记!PostMessage函数的VB声明如下:
再来看看wMsg 这个参数,要模拟按键就靠这个了。键盘消息常用的有如下几个:
WM_KEYDOWN 表示一个普通键被按下
WM_KEYUP 表示一个普通键被释放
WM_SYSKEYDOWN 表示一个系统键被按下,比如Alt键
WM_SYSKEYUP 表示一个系统键被释放,比如Alt键
如果你确定要发送以上几个键盘消息,那么再来看看如何确定键盘消息中的wParam 和lParam 这两个参数。在一个键盘消息中,wParam 参数的含义较简单,它表示你要发送的键盘事件的按键虚拟码,比如你要对目标程序模拟按下A键,那么wParam 参数的值就设为VK_A ,至于lParam 这个参数就比较复杂了,因为它包含了多个信息,一般可以把它设为0,但是如果你想要你的模拟更真实一些,那么建议你还是设置一下这个参数。那么我们就详细了解一下lParam 吧。lParam 是一个long类型的参数,它在内存中占4个字节,写成二进制就是00000000 00000000 00000000 00000000 一共是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 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