VB做键盘
基于VB的键盘钩子算法的实现

输入 的运作 ,然 后根据 虚拟键 表判断 按键 的类 型 , 最 后把 得到的准 确的按键类 型输 出。
21 键 盘 工作 流 程 图 ( 1 . 图 )
少 的一 部分 在使 用计算机 进行操 作的 时候 , 经常会 使用 到一些快捷 的操作方 式或获取 键盘 的按键 信息 . 例 如使用 快捷 键来实 现复 制 、粘 贴或 是否 按 了 E c s、
2 键 盘 模 块 ( 2 . 3 图 )
机 息 . 可以强制结 束消息 的传递 。 还 总 2 键 盘 钩 子 的 工作 原 理 第
三
一
3 键 盘 钩 子 实现 算 法
使 用 不 同 的 W idw P 函 数 获 取 键 盘 的 动 作 n o sA I
固
9 1 6
簟 麓纛 蠢
T b 键 a Si t hf 键
vK y sae b e e c p v Ky  ̄ e be H vKy be
vKy rn b eP i t vK y b 2 6 5 9 7
空 格 键 等 操 作 信 息 。 捷 键 具 有 操 作 简单 、 便 、 捷 快 方 快 等优 点 . 就 需 要 我 们 在 编 写 程 序 代 码 的 过 程 中增 加 这 对 键 盘 的 按 键 进 行 判 断 . 个 过 程 就 是 所 谓 的 键 盘 钩 这 子 功 能 利 用 V 在 B来 编 写 所 需 要 的 应 用 程 序 时 . 于 由 V B无 法 直 接 对 系 统 的 注 册 表 进 行 操 作 对 于 此 类 操
图 1 键 盘 工 作 流程 图
22 键 盘的虚拟键 简表 ( 1 . 表 )
在 表 1中 . 一 列 是 系 统 各 个 键 中 的 名 称 . 二 第 第
VB完美模拟键盘输入

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模拟键盘详解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第45、46课时(制作键盘按键测试程序)

第45、46课时(总第46课时)课题:制作键盘按键测试程序备课时间: 2016.11.2 上课时间:教学目标:1、掌握窗体的KEYPREVIEW属性2、掌握窗体的键盘事件3、掌握窗体的KEYPRESS事件教学重点:窗体的KEYPREVIEW属性教学难点:键盘事件教学方法:讲练结合法,演示法,任务驱动法教具:计算机、班班通投影仪设备教学过程:一、课前检测1、窗体的外观尺寸有哪两个属性决定?2、窗体的RESIZE事件什么时候发生?3、窗体的UNLOAD事件什么时候发生?二、新课<一>确定主题明确目标学习目标:1、掌握窗体的KEYPREVIEW属性2、掌握窗体的键盘事件3、掌握窗体的KEYPRESS事件学习重难点:窗体的KEYPREVIEW属性,键盘事件<二>依据提纲合作学习1、窗体的键盘事件有哪三个?2、窗体的KEYPRESS事件的语法格式是什么?3、窗体的KEYPREVIEW属性的功能是什么?4、当KEYPREVIEW值为TRUE时表示什么含义?5、当KEYPREVIEW值为FALSE时表示什么含义?6、如果窗体中没有可见和有效控件,则窗体会自动接收什么事件?7、如要要在窗体级处理键盘事件,而不允许控件接收键盘,则应进行什么设置?8、在窗体的KEYUP和KEYDOWN事件中,参数SHIFT有哪几个值?含义分别是什么?9、参数KEYCODE表示什么含义?10、当参数SHIFT值为6时,表示什么含义?<三>交流展示教师点拨各小组同学依据提纲内容认真研讨答案,并指派代表在班上进行回答,教师根据回答情况及时做出补充、纠正、点评。
<四>课堂训练信息反馈练习:1、当用户按下或松开一个可见字符键时发生_______事件。
2、如果只允许窗体接收键盘事件,而不允许控件接收键盘事件,则应在KEYPRESS事件中,将参数KEYASCII设置为______。
3、窗体的KEYPREVIEW属性值是______类型的数据。
VB 键盘常用代码

vbKeyL 76 字母 L 键
vbKeyM 77 字母 M 键
vbKeyN 78 字母 N 键
vbKeyO 79 字母 O 键
vbKeyP 80 字母 P 键
vbKeyQ 81 字母 Q 键
vbKeyR 82 字母 R 键
vbKeyS 83 字母 S 键
vbKeyF2 0x71 F2 功能键
vbKeyF3 0x72 F3 功能键
vbKeyF4 0x73 F4 功能键
vbKeyF5 0x74 F5 功能键
vbKeyF6 0x75 F6 功能键
vbKeyF7 0x76 F7 功能键
vbKeyF8 0x77 F8 功能键
vbKeyF9 0x78 F9 功能键
vbKeySnapshot 0x2C SnapShot 键
vbKeyInsert 0x2D INSERT 键
vbKeyDelete 0x2E DELETE 键
vbKeyHelp 0x2F HELP 键
vbKeyNumlock 0x90 NUM LOCK 键
vbKeyA 65 字母 A 键
vbKeyT 84 字母 T 键
vbKeyU 85 字母 U 键
vbKeyV 86 字母 V 键
vbKeyW 87 字母 W 键
vbKeyX 88 字母 X 键
vbKeyY 89 字母 Y 键
vbKeyZ 90 字母 Z 键
vbKey0 48 数字 0 键
vbKey1 49 数字 1 键
vbKeyReturn 0xD 回车键
vbKeyShift 0x10 SHIFT 键
VB模拟按键终极教程

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表示延時的時間,以毫秒為單位。
vb中提供全部键盘对应的编码

vb中提供全部键盘对应的编码vbkeylbutton 1 鼠标左键vbkeyrbutton 2 鼠标右键vbkeycancel 3 cancel 键vbkeymbutton 4 鼠标中键vbkeyback 8 backspace 键vbkeytab 9 tab 键vbkeyclear 12 clear 键vbkeyreturn 13 enter 键vbkeyshift 16 shift 键vbkeycontrol 17 ctrl 键vbkeymenu 18 菜单键vbkeypause 19 pause 键vbkeycapital 20 caps lock 键vbkeyescape 27 esc 键vbkeyspace 32 spacebar 键vbkeypageup 33 pageup 键vbkeypagedown 34 pagedown 键vbkeyend 35 end 键vbkeyhome 36 home 键vbkeyleft 37 left arrow 键vbkeyup 38 up arrow 键vbkeyright 39 right arrow 键vbkeydown 40 down arrow 键vbkeyselect 41 select 键vbkeyprint 42 print screen 键vbkeyexecute 43 execute 键vbkeysnapshot 44 snap shot 键vbkeyinser 45 ins 键vbkeydelete 46 del 键vbkeyhelp 47 help 键vbkeynumlock 144 num lock 键a 键到 z 键与其 ascii 码的相应值'a' 到 'z' 是一致的常数值描述vbkeya 65 a 键vbkeyb 66 b 键vbkeyc 67 c 键vbkeyd 68 d 键vbkeye 69 e 键vbkeyf 70 f 键vbkeyg 71 g 键vbkeyh 72 h 键vbkeyi 73 i 键vbkeyj 74 j 键vbkeyk 75 k 键vbkeyl 76 l 键vbkeym 77 m 键vbkeyn 78 n 键vbkeyo 79 o 键vbkeyp 80 p 键vbkeyq 81 q 键vbkeyr 82 r 键vbkeys 83 s 键vbkeyt 84 t 键vbkeyu 85 u 键vbkeyv 86 v 键vbkeyw 87 w 键vbkeyx 88 x 键vbkeyy 89 y 键vbkeyz 90 z 键0 键到 9 键与其 ascii 码的相应值 '0' 到 '9' 是一致的常数值描述vbkey0 48 0 键vbkey1 49 1 键vbkey2 50 2 键vbkey3 51 3 键vbkey4 52 4 键vbkey5 53 5 键vbkey6 54 6 键vbkey7 55 7 键vbkey8 56 8 键vbkey9 57 9 键数字小键盘上的键常数值描述vbkeynumpad0 96 0 键vbkeynumpad1 97 1 键vbkeynumpad2 98 2 键vbkeynumpad3 99 3 键vbkeynumpad4 100 4 键vbkeynumpad5 101 5 键vbkeynumpad6 102 6 键vbkeynumpad7 103 7 键vbkeynumpad8 104 8 键vbkeynumpad9 105 9 键vbkeymultiply 106 乘号 (*) 键vbkeyadd 107 加号 (+) 键vbkeyseparator 108 enter 键(在数字小键盘上)vbkeysubtract 109 减号 (-) 键vbkeydecimal 110 小数点 (.) 键vbkeydivide 111 除号 (/) 键功能键常数值描述vbkeyf1 112 f1 键vbkeyf2 113 f2 键vbkeyf3 114 f3 键vbkeyf4 115 f4 键vbkeyf5 116 f5 键vbkeyf6 117 f6 键vbkeyf7 118 f7 键vbkeyf8 119 f8 键vbkeyf9 120 f9 键vbkeyf10 121 f10 键vbkeyf11 122 f11 键vbkeyf12 123 f12 键vbkeyf13 124 f13 键vbkeyf14 125 f14 键vbkeyf15 126 f15 键vbkeyf16 127 f16 键KeyCode常数用法可在代码中的任何地方用下列常数代替实际值:常数值描述vbKeyLButton 0x1 鼠标左键vbKeyRButton 0x2 鼠标右键vbKeyCancel 0x3 CANCEL 键vbKeyMButton 0x4 鼠标中键vbKeyBack 0x8 BACKSPACE 键vbKeyTab 0x9 TAB 键vbKeyClear 0xC CLEAR 键vbKeyReturn 0xD ENTER 键vbKeyShift 0x10 SHIFT 键vbKeyControl 0x11 CTRL 键vbKeyMenu 0x12 MENU 键vbKeyPause 0x13 PAUSE 键vbKeyCapital 0x14 CAPS LOCK 键vbKeyEscape 0x1B ESC 键vbKeySpace 0x20 SPACEBAR 键vbKeyPageUp 0x21 PAGE UP 键vbKeyPageDown 0x22 PAGE DOWN 键vbKeyEnd 0x23 END 键vbKeyHome 0x24 HOME 键vbKeyLeft 0x25 LEFT ARROW 键vbKeyUp 0x26 UP ARROW 键vbKeyRight 0x27 RIGHT ARROW 键vbKeyDown 0x28 DOWN ARROW 键vbKeySelect 0x29 SELECT 键vbKeyPrint 0x2A PRINT SCREEN 键vbKeyExecute 0x2B EXECUTE 键vbKeySnapshot 0x2C SNAPSHOT 键vbKeyInsert 0x2D INSERT 键vbKeyDelete 0x2E DELETE 键vbKeyHelp 0x2F HELP 键vbKeyNumlock 0x90 NUM LOCK 键A 至 Z 键与 A 杴 Z 字母的 ASCII 码相同:常数值描述vbKeyA 65 A 键vbKeyB 66 B 键vbKeyC 67 C 键vbKeyD 68 D 键vbKeyE 69 E 键vbKeyF 70 F 键vbKeyG 71 G 键vbKeyH 72 H 键vbKeyI 73 I 键vbKeyJ 74 J 键vbKeyK 75 K 键vbKeyL 76 L 键vbKeyM 77 M 键vbKeyN 78 N 键vbKeyO 79 O 键vbKeyP 80 P 键vbKeyQ 81 Q 键vbKeyR 82 R 键vbKeyS 83 S 键vbKeyT 84 T 键vbKeyU 85 U 键vbKeyV 86 V 键vbKeyW 87 W 键vbKeyX 88 X 键vbKeyY 89 Y 键vbKeyZ 90 Z 键0 至 9 键与数字 0 杴 9 的 ASCII 码相同:常数值描述vbKey0 48 0 键vbKey1 49 1 键vbKey2 50 2 键vbKey3 51 3 键vbKey4 52 4 键vbKey5 53 5 键vbKey6 54 6 键vbKey7 55 7 键vbKey8 56 8 键vbKey9 57 9 键下列常数代表数字键盘上的键:常数值描述vbKeyNumpad0 0x60 0 键vbKeyNumpad1 0x61 1 键vbKeyNumpad2 0x62 2 键vbKeyNumpad3 0x63 3 键vbKeyNumpad4 0x64 4 键vbKeyNumpad5 0x65 5 键vbKeyNumpad6 0x66 6 键vbKeyNumpad7 0x67 7 键vbKeyNumpad8 0x68 8 键vbKeyNumpad9 0x69 9 键vbKeyMultiply 0x6A MULTIPLICATION SIGN (*) 键vbKeyAdd 0x6B PLUS SIGN (+) 键vbKeySeparator 0x6C ENTER 键vbKeySubtract 0x6D MINUS SIGN (杴) 键vbKeyDecimal 0x6E DECIMAL POINT (.) 键vbKeyDivide 0x6F DIVISION SIGN (/) 键下列常数代表功能键:常数值描述vbKeyF1 0x70 F1 键vbKeyF2 0x71 F2 键vbKeyF3 0x72 F3 键vbKeyF4 0x73 F4 键vbKeyF5 0x74 F5 键vbKeyF6 0x75 F6 键vbKeyF7 0x76 F7 键vbKeyF8 0x77 F8 键vbKeyF9 0x78 F9 键vbKeyF10 0x79 F10 键vbKeyF11 0x7A F11 键vbKeyF12 0x7B F12 键vbKeyF13 0x7C F13 键vbKeyF14 0x7D F14 键vbKeyF15 0x7E F15 键vbKeyF16 0x7F F16 键。
VB制作软键盘

先画两个窗体Form1和Form2,Form2是作为接收按键测试用的,在上面放一个文本框Text1,把Text1的MultiLine属性设为
True,ScrollBars设为3-Both,然后写入如下代码:
Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As
太小,系统会自动换行பைடு நூலகம்看上去A在a的上面。复制该按扭,然后在窗体上粘贴,程序会提示你是否产生控件数组,选择是
Command8变成了Command8(0),新产生的按扭为Command8(1),一直粘贴,直到Command8(46),修改它们的Caption使之与键盘上的
其它键一样。这里要注意几点:
1、按扭的字体为“小五”,有几个键显示的结果是纵向并排,可把字体设为“六号”,使之横向并排,字体使用宋体,否则↑和←显示的不漂亮。
End Sub
‘让小键盘在最前面
Private Sub Form_Load()
rtn = SetWindowPos(Me.hwnd, -1, 0, 0, 0, 0, 3)
End Sub
‘移动没有标题的小键盘
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y
As Single)
If Button = 1 Then
Dim ReturnVal As Long
X = ReleaseCapture()
ReturnVal = SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0)
自制小键盘(vb源代码)

自制小键盘(vb源代码)'API声明Private Declare Function SetWindowPos& Lib "user32" (ByV al hwnd As Long, ByV al hWndInsertAfter As Long, ByV al X As Long, ByV al Y As Long, ByV al cx As Long, ByV al cy As Long, ByV al wFlags As Long)Dim MoveScreen As Boolean'鼠标位置Dim MousX As IntegerDim MousY As Integer'窗体位置Dim CurrX As IntegerDim CurrY As IntegerPrivate Sub Command1_Click()'Shift键If Command1.BackColor = &H8000000F ThenCommand1.BackColor = &H8000000DElseCommand1.BackColor = &H8000000FEnd IfEnd Sub'退格键Private Sub Command10_Click()Form2.ActiveControl.SetFocusSendKeys ("{BS}")End Sub'大小写转换键Private Sub Command2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)If Command2.BackColor = &H8000000F Then Command2.BackColor = vbGreenElseCommand2.BackColor = &H8000000FEnd IfEnd Sub'TAB键Private Sub Command3_Click()Form2.ActiveControl.SetFocusSendKeys ("{tab}")End Sub'Ins键Private Sub Command4_Click()Form2.ActiveControl.SetFocusSendKeys ("{INSERT}")End Sub'Del键Private Sub Command5_Click()Form2.ActiveControl.SetFocusSendKeys ("{DEL}")End Sub'空格键Private Sub Command6_Click()Form2.ActiveControl.SetFocusSendKeys ("{BREAK} ")End Sub'Esc键Private Sub Command7_Click()Form2.ActiveControl.SetFocusSendKeys ("{Esc}")End Sub'普通键Private Sub Command8_Click(Index As Integer)Dim keyxFor i = 0 To 18If i = Index ThenIf Command1.BackColor = &H8000000D Thenkeyx = "{" & Mid(Command8(i).Caption, 1, 1) & "}": Command1.BackColor = &H8000000FElsekeyx = Mid(Command8(i).Caption, 3, 1)End IfEnd IfNext iSelect Case IndexCase 19If Command1.BackColor = &H8000000D Thenkeyx = "——": Command1.BackColor = &H8000000FElsekeyx = Mid(Command8(Index).Caption, 3, 1)End IfCase 20If Command1.BackColor = &H8000000D Thenkeyx = Mid(Command8(Index).Caption, 1, 1): Command1.BackColor = &H8000000F Elsekeyx = Mid(Command8(Index).Caption, 4, 1)End IfEnd SelectFor i = 21 To 46If i = Index ThenIf Command1.BackColor = &H8000000D And Command2.BackColor = vbGreen Thenkeyx = Mid(Command8(i).Caption, 3, 1): Command1.BackColor = &H8000000FElseIf Command1.BackColor = &H8000000D And Command2.BackColor = &H8000000F Then keyx = Mid(Command8(i).Caption, 1, 1): Command1.BackColor = &H8000000FElseIf Command1.BackColor = &H8000000F And Command2.BackColor = &H8000000F Then keyx = Mid(Command8(i).Caption, 3, 1)Elsekeyx = Mid(Command8(i).Caption, 1, 1)End IfEnd IfNext iForm2.ActiveControl.SetFocusSendKeys keyxEnd Sub'回车键Private Sub Command9_Click()Form2.ActiveControl.SetFocusSendKeys ("{ENTER}")End Sub'让小键盘在最前面Private Sub Form_Load()Me.Left = Screen.Width * 0.75Me.Top = Screen.Height * 0.75rtn = SetWindowPos(Me.hwnd, -1, 0, 0, 0, 0, 3)Command1.BackColor = &H8000000FCommand2.BackColor = &H8000000FFor i = 0 To 46Command8(i).MouseIcon = LoadPicture(App.Path & ("\harrow.cur"))Command8(i).MousePointer = 99Next iEnd Sub'移动没有标题的小键盘Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)If Button = 1 Then'标示为移动状态MoveScreen = True'得到鼠标在窗体上的位置(相对与窗体内部坐标)MousX = XMousY = YEnd IfIf Button = 2 Then Unload Form1End SubPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) '如果处于鼠标左键按下的状态,即MoveScreen = True时If MoveScreen Then'计算新的窗体坐标值'仔细想一下,看看是不是这样CurrX = Form1.Left - MousX + XCurrY = Form1.T op - MousY + Y'移动窗体到新的位置Form1.Move CurrX, CurrYEnd IfEnd SubPrivate Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) MoveScreen = False End Sub'这个可有可无,做这个是为了好看点Private Sub Timer1_Timer()If Label1.ForeColor = &HFFFF00 ThenLabel1.ForeColor = &HFF&ElseLabel1.ForeColor = &HFFFF00End IfEnd Sub下面是form2中的代码Private Sub Form_Unload(Cancel As Integer)EndEnd SubPrivate Sub form_load()Form1.ShowEnd Sub本例在VB6+xp2中通过。
VB编程的键盘控制

VB编程的键盘控制VB编程的键盘控制我们利用VisualBASIC编写程序,多数情况只涉及到鼠标操作(如单击、双击、拖动等),但如果程序中需要实现文本编辑、热键激活或利用键盘进行游戏控制等功能时,将不可避免地碰到键盘捕获及处理的问题。
下面,我们就来看一看VB编程中如何进行键盘控制。
一、概述在VB中,很多控件都提供了键盘输入功能(如文本框、组合框等),但它们对键盘的处理较简单,遇到复杂一点的要求即无能为力。
因而VB提供了KeyPress、KeyUp、KeyDown三种键盘事件,当用户按键时,会触发这三种事件,而且窗体和接受键盘输入的控件都识别这三种事件。
下表对这些事件作了描述。
可用这些事件检测KeyPress事件无法检测到的情况:◆SHIFT、CTRL和ALT键的特殊组合。
◆光标控制键。
◆HOME、END、PAGEUP、PAGEDOWN等。
◆数字小键盘的数字键与打字键盘数字键的区别。
◆不仅响应按键操作而且响应释放键操作(KeyPress只响应按键操作)。
键盘事件彼此不相互排斥。
按下某键时将生成KeyDown和KeyPress事件,而松开此键时生成KeyUp 事件。
当用户按下一个KeyPress不能检测的键时将触发KeyDown事件,松开此键时生成KeyUp 事件。
若使用KeyUp和KeyDown事件应确保KeyPress事件的功能不够用,通常编写KeyPress事件的代码比较容易。
二、KeyPress事件在按下与ASCII字符对应的键时将触发KeyPress事件。
ASCII字符集代表标准键盘的字母、数字和标点符号以及部分控制键(ENTER、TAB、BACKSPACE键等)。
KeyDown和KeyUp事件能够检测其它功能键、编辑键和光标定位键。
当处理标准ASCII字符时应使用KeyPress事件。
例如,如果希望将输入到文本框中的所有字符都强制转换为大写字符,则可在输入时使用此事件转换大小写:PrivateSubText1_KeyPress(KeyAsciiAsInteger)KeyAscii=Asc(Ucase(Chr(KeyAscii)))EndSubKeyAscii参数返回对应所按键的ASCII代码。
VB模拟按键终极教程

MakeKeyLparam = Val("&H" & s)
End Function
这个函数像这样调用,比如按下A键,那么lParam=MakeKeyLparam(VK_A,WM_KEYDOWN) ,很简单吧。值得注意的是,即使你发送消息时设置了lParam参数的值,但是系统在传递消息时仍然可能会根据当时的情况重新设置该参数,那么目标程序收到的消息中lParam的值可能会和你发送时的有所不同。所以,如果你很懒的话,还是直接把它设为0吧,对大多数程序不会有影响的,呵呵。
VB模拟按键终极教程

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模拟键盘攻略如下: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键盘与鼠标事件过程在VB中,键盘和鼠标事件是通过事件处理程序来实现的。
事件处理程序是一段代码,当用户与应用程序的用户界面交互时,会触发这段代码。
下面将详细介绍VB中键盘和鼠标事件的过程。
键盘事件过程:1.事件注册:在VB中,要处理键盘事件,首先需要将事件与特定的控件关联起来。
可以通过在设计视图中选择控件,然后在属性窗口中选择“事件”选项卡来注册事件。
2.事件处理程序:在事件注册后,可以在代码视图中看到为该事件创建的事件处理程序。
事件处理程序是一个特定的过程或函数,当事件触发时,会执行这段代码。
可以在事件处理程序中编写逻辑代码来响应键盘事件。
3. 事件参数:在事件处理程序中,可以使用事件参数来获取有关事件的信息。
键盘事件参数通常包括键码(KeyCode)和修饰键(Shift、Ctrl、Alt等)。
通过使用这些参数,可以确定用户按下的是哪个键,并采取相应的操作。
4.事件处理:在事件处理程序中,可以根据需要执行特定的操作。
例如,可以根据用户按下的键,执行不同的操作或调用不同的函数。
可以使用条件语句(如If语句)来根据键码执行不同的逻辑。
5.事件冒泡:在VB中,键盘事件通常具有冒泡的特性。
这意味着,当用户在一个控件上按下键时,除了该控件的键盘事件被触发外,还会触发其父控件的键盘事件。
这样可以在不同层次的控件中处理键盘事件。
鼠标事件过程:1.事件注册:与键盘事件类似,要处理鼠标事件,首先需要将事件与特定的控件关联起来。
可以通过在设计视图中选择控件,然后在属性窗口中选择“事件”选项卡来注册事件。
2.事件处理程序:在事件注册后,可以在代码视图中看到为该事件创建的事件处理程序。
事件处理程序是一个特定的过程或函数,当事件触发时,会执行这段代码。
可以在事件处理程序中编写逻辑代码来响应鼠标事件。
3. 事件参数:在事件处理程序中,可以使用事件参数来获取有关事件的信息。
鼠标事件参数通常包括鼠标按钮(Button)和鼠标位置(X、Y 坐标)。
VB编写键盘记录

VB编写键盘记录这个程序主要是利用GetAsyncKeyState函数,使用GetAsyncKeyState可以获得键盘的动作。
GetAsyncKeyState函数根据虚拟键表判断按键的类型。
返回值为一个16位的二进值数,如果被按下则最高位为1,即返回-32767。
下面是API函数及鼠标中左右键在虚拟键表中的定义:Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer好了,函数就先介绍这么多,下面开始动手实战了first,当然是创建窗口了在时间控件的Timer时间中定义检查按键类型,代码如下:Dim AddKeyKeyResult = GetAsyncKeyState(13) '回车键If KeyResult = -32767 ThenAddKey = "[ENTER]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(17) 'Ctrl键If KeyResult = -32767 ThenAddKey = "[CTRL]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(8) '退格键If KeyResult = -32767 ThenAddKey = "[BKSPACE]"GoTo KeyFoundKeyResult = GetAsyncKeyState(9) If KeyResult = -32767 Then AddKey = "[TAB]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(18) If KeyResult = -32767 Then AddKey = "[ALT]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(19) If KeyResult = -32767 Then AddKey = "[PAUSE]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(20) If KeyResult = -32767 Then AddKey = "[CAPS]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(27) If KeyResult = -32767 Then AddKey = "[ESC]"GoTo KeyFoundKeyResult = GetAsyncKeyState(33) If KeyResult = -32767 Then AddKey = "[PGUP]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(34) If KeyResult = -32767 Then AddKey = "[PGDN]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(35) If KeyResult = -32767 Then AddKey = "[END]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(36) If KeyResult = -32767 Then AddKey = "[HOME]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(44) If KeyResult = -32767 Then AddKey = "[SYSRQ]"GoTo KeyFoundKeyResult = GetAsyncKeyState(45) If KeyResult = -32767 Then AddKey = "[INS]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(46) If KeyResult = -32767 Then AddKey = "[DEL]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(144) If KeyResult = -32767 Then AddKey = "[NUM]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(37) If KeyResult = -32767 Then AddKey = "[LEFT]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(38) If KeyResult = -32767 Then AddKey = "[UP]"GoTo KeyFoundKeyResult = GetAsyncKeyState(39) If KeyResult = -32767 Then AddKey = "[RIGHT]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(40) If KeyResult = -32767 Then AddKey = "[DOWN]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(112) If KeyResult = -32767 Then AddKey = "[F1]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(113) If KeyResult = -32767 Then AddKey = "[F2]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(114) If KeyResult = -32767 Then AddKey = "[F3]"GoTo KeyFoundKeyResult = GetAsyncKeyState(115) If KeyResult = -32767 Then AddKey = "[F4]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(116) If KeyResult = -32767 Then AddKey = "[F5]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(117) If KeyResult = -32767 Then AddKey = "[F6]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(118) If KeyResult = -32767 Then AddKey = "[F7]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(119) If KeyResult = -32767 Then AddKey = "[F8]"GoTo KeyFoundKeyResult = GetAsyncKeyState(120) If KeyResult = -32767 Then AddKey = "[F9]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(121) If KeyResult = -32767 Then AddKey = "[F10]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(122) If KeyResult = -32767 Then AddKey = "[F11]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(123) If KeyResult = -32767 Then AddKey = "[F12]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(124) If KeyResult = -32767 Then AddKey = "[F13]"GoTo KeyFoundKeyResult = GetAsyncKeyState(125) If KeyResult = -32767 Then AddKey = "[F14]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(126) If KeyResult = -32767 Then AddKey = "[F15]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(127) If KeyResult = -32767 Then AddKey = "[F16]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(32) If KeyResult = -32767 Then AddKey = " "GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(186) If KeyResult = -32767 Then AddKey = ";"GoTo KeyFoundKeyResult = GetAsyncKeyState(187) If KeyResult = -32767 Then AddKey = "="GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(188) If KeyResult = -32767 ThenGoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(189) If KeyResult = -32767 Then AddKey = "-"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(190) If KeyResult = -32767 Then AddKey = "."GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(191) If KeyResult = -32767 Then AddKey = "/" '/GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(192) If KeyResult = -32767 Then AddKey = "`" '`GoTo KeyFoundEnd If'----------NUM PADKeyResult = GetAsyncKeyState(96) If KeyResult = -32767 Then AddKey = "0"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(97) If KeyResult = -32767 Then AddKey = "1"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(98) If KeyResult = -32767 Then AddKey = "2"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(99) If KeyResult = -32767 Then AddKey = "3"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(100) If KeyResult = -32767 Then AddKey = "4"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(101) If KeyResult = -32767 Then AddKey = "5"GoTo KeyFoundEnd If'版权所有:教程中国KeyResult = GetAsyncKeyState(102) If KeyResult = -32767 Then AddKey = "6"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(103) If KeyResult = -32767 Then AddKey = "7"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(104) If KeyResult = -32767 Then AddKey = "8"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(105) If KeyResult = -32767 Then AddKey = "9"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(106) If KeyResult = -32767 Then AddKey = "*"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(107) If KeyResult = -32767 Then AddKey = "+"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(108) If KeyResult = -32767 Then AddKey = "[ENTER]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(109) If KeyResult = -32767 Then AddKey = "-"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(110) If KeyResult = -32767 Then AddKey = "."GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(2) If KeyResult = -32767 Then AddKey = "/"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(220) If KeyResult = -32767 Then AddKey = "\"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(222) If KeyResult = -32767 Then AddKey = "'"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(221)If KeyResult = -32767 ThenAddKey = "]"GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(219)If KeyResult = -32767 ThenAddKey = "["GoTo KeyFoundEnd IfKeyResult = GetAsyncKeyState(16) 'shift键If KeyResult = -32767 And TimeOut = 0 ThenAddKey = "[SHIFT]"LastKey = AddKeyTimeOut = 1GoTo KeyFoundEnd IfKeyLoop = 41Do Until KeyLoop = 256 ' 显示其他键KeyResult = GetAsyncKeyState(KeyLoop)If KeyResult = -32767 Then Text1.Text = Text1.Text + Chr(KeyLoop)KeyLoop = KeyLoop + 1LoopLastKey = AddKeyExit SubKeyFound: '显示键的信息Text1 = Text1 & AddKeyEnd Sub上面的()里面的数字实际是就是那些键的Ascii码,比如13就代表回车,17代表Ctrl,……由于数目太多,一一列举不方便下面是其他的事件Private Sub Timer2_Timer()TimeOut = 0End Sub目的是随时刷新清空记录键盘输入后就准备你自己所设定的程序了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Firstbyte = "00"
Else
Firstbyte = "C0" '如果是释放键
End If
Dim Scancode As Long
'获得键的扫描码
Scancode = MapVirtualKey(VirtualKey, 0)
PostMessage 12345,WM_UP,VK_A,0& '释放A键
好了,一次按键就完成了。现在你可以迫不及待的打开记事本做实验,先用FindWindowEx这类API函数找到记事本程序的句柄,再向它发送键盘消息,期望记事本里能诡异的自动出现字符。可是你马上就是失望了,咦,怎么一点反应也没有?你欺骗感情啊~~~~~~~~~~55555555555555 不是的哦,接着往下看啊。
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参数的函数:
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键
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
用户按下按键-----键盘驱动程序将此事件传递给操作系统-----操作系统将键盘事件插入消息队列-----键盘消息被发送到当前活动窗口
明白了这个过程,我们就可以编程实现在其中的某个环节来模拟键盘操作了。在VB中,有多种方法可以实现键盘模拟,我们就介绍几种比较典型的。
1.局部级模拟
从上面的流程可以看出,键盘事件是最终被送到活动窗口,然后才引起目标程序响应的。那么最直接的模拟方法就是:直接伪造一个键盘消息发给目标程序。哈哈,这实在是很简单,windows提供了几个这样的API函数可以实现直接向目标程序发送消息的功能,常用的有SendMessage和PostMessage,它们的区别是PostMessage函数直接把消息仍给目标程序就不管了,而SendMessage把消息发出去后,还要等待目标程序返回些什么东西才好。这里要注意的是,模拟键盘消息一定要用PostMessage函数才好,用SendMessage是不正确的(因为模拟键盘消息是不需要返回值的,不然目标程序会没反应),切记切记!PostMessage函数的VB声明如下:
当用户按下键盘上的一个键时,键盘内的芯片会检测到这个动作,并把这个信号传送到计算机。如何区别是哪一个键被按下了呢?键盘上的所有按键都有一个编码,称作键盘扫描码。当你按下一个键时,这个键的扫描码就被传给系统。扫描码是跟具体的硬件相关的,同一个键,在不同键盘上的扫描码有可能不同。键盘控制器就是将这个扫描码传给计算机,然后交给键盘驱动程序。键盘驱动程序会完成相关的工作,并把这个扫描码转换为键盘虚拟码。什么是虚拟码呢?因为扫描码与硬件相关,不具有通用性,为了统一键盘上所有键的编码,于是就提出了虚拟码概念。无论什么键盘,同一个按键的虚拟码总是相同的,这样程序就可以识别了。简单点说,虚拟码就是我们经常可以看到的像VK_A,VK_B这样的常数,比如键A的虚拟码是65,写成16进制就是&H41,注意,人们经常用16进制来表示虚拟码。当键盘驱动程序把扫描码转换为虚拟码后,会把这个键盘操作的扫描码和虚拟码还有其它信息一起传递给操作系统。然后操作系统则会把这些信息封装在一个消息中,并把这个键盘消息插入到消息列队。最后,要是不出意外的话,这个键盘消息最终会被送到当前的活动窗口那里,活动窗口所在的应用程序接收到这个消息后,就知道键盘上哪个键被按下,也就可以决定该作出什么响应给用户了。这个过程可以简单的如下表示:
'参数VirtualKey表示按键虚拟码,flag表示是按下键还是释放键,用WM_KEYDOWN和WM_KEYUP这两个常数表示
Dim s As String
Dim Firstbyte As String 'lparam参数的24-31位
If flag = WM_K你确定要发送以上几个键盘消息,那么再来看看如何确定键盘消息中的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声明如下:
再来看看wMsg 这个参数,要模拟按键就靠这个了。键盘消息常用的有如下几个:
WM_KEYDOWN 表示一个普通键被按下
WM_KEYUP 表示一个普通键被释放
WM_SYSKEYDOWN 表示一个系统键被按下,比如Alt键
WM_SYSKEYUP 表示一个系统键被释放,比如Alt键
VB做的键盘模拟外挂学习2007年03月22日 星期四 15:28
键盘是我们使用计算机的一个很重要的输入设备了,即使在鼠标大行其道的今天,很多程序依然离不开键盘来操作。但是有时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样可以把很多重复性的键盘操作交给程序来模拟,省了很多精力,按键精灵就是这样的一个软件。那么我们怎样才能用VB来写一个程序,达到与按键精灵类似的功能呢?那就让我们来先了解一下windows中响应键盘事件的机制。
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编码(可以输入中文的哦^_^),现在你可以写出一个完整的向记事本里自动写入字符的程序了,下面是一个例子,并附有这些消息常数的具体值: