您的位置:首页 > 其它

key_event 键盘模拟(转集)

2008-10-20 21:15 218 查看
''键盘表

'VB中的键码 '常数'键码值'描述

Const vbKeyLButton = 1 '鼠标左键

Const vbKeyRButton = 2 '鼠标右键

Const vbKeyCancel = 3 'CANCEL 键

Const vbKeyMButton = 4 '鼠标中键

Const vbKeyBack = 8 'Backspace 键

Const vbKeyTab = 9 'TAB 键

Const vbKeyClear = 12 'CLEAR 键

Const vbKeyReturn = 13 'Enter 键

Const vbKeyShift = 16 'Shift 键

Const vbKeyConterol = 17 'Ctrl 键

Const vbKeyMenu = 18 '菜单键

Const vbKeyPause = 19 'PAUSE 键

Const vbKeyCapital = 20 'CAPS 'LOCK 键

Const vbKeyEscape = 27 'ESC 键

Const vbKeySpace = 32 'SPACEBAR 键

Const vbKeyPageUp = 33 'PAGEUP 键

Const vbKeyPageDown = 34 'PAGEDOWN 键

Const vbKeyEnd = 35 'END 键

Const vbKeyHome = 36 'HOME 键

Const vbKeyLeft = 37 'LEFT 'ARROW 键←

Const vbKeyUp = 38 'UP 'ARROW 键↑

Const vbKeyRight = 39 'RIGHT 'ARROW 键→

Const vbKeyDown = 40 'DOWN 'ARROW 键↓

Const vbKeySelect = 41 'SELECT 键

Const vbKeyPrint = 42 'PRINT 'SCREEN 键

Const vbKeyExecute = 43 'EXECUTE 键

Const vbKeySnapshot = 44 'SNAP 'SHOT 键

Const vbKeyInser = 45 'INSERT 键

Const vbKeyDelete = 46 'DELETE 键

Const vbKeyHelp = 47 'HELP 键

Const vbKey0 = 48 '0 键

Const vbKey1 = 49 '1 键

Const vbKey2 = 50 '2 键

Const vbKey3 = 51 '3 键

Const vbKey4 = 52 '4 键

Const vbKey5 = 53 '5 键

Const vbKey6 = 54 '6 键

Const vbKey7 = 55 '7 键

Const vbKey8 = 56 '8 键

Const vbKey9 = 57 '9 键

Const vbKeyA = 65 'A 键

Const vbKeyB = 66 'B 键

Const vbKeyC = 67 'C 键

Const vbKeyD = 68 'D 键

Const vbKeyE = 69 'E 键

Const vbKeyF = 70 'F 键

Const vbKeyG = 71 'G 键

Const vbKeyH = 72 'H 键

Const vbKeyI = 73 'I 键

Const vbKeyJ = 74 'J 键

Const vbKeyK = 75 'K 键

Const vbKeyL = 76 'L 键

Const vbKeyM = 77 'M 键

Const vbKeyN = 78 'N 键

Const vbKeyO = 79 'O 键

Const vbKeyP = 80 'P 键

Const vbKeyQ = 81 'Q 键

Const vbKeyR = 82 'R 键

Const vbKeyS = 83 'S 键

Const vbKeyT = 84 'T 键

Const vbKeyU = 85 'U 键

Const vbKeyV = 86 'V 键

Const vbKeyW = 87 'W 键

Const vbKeyX = 88 'X 键

Const vbKeyY = 89 'Y 键

Const vbKeyZ = 90 'Z 键

Const vbKeyNum0 = 96 '0 键 '(在数字小键盘上)

Const vbKeyNum1 = 97 '1 键 '(在数字小键盘上)

Const vbKeyNum2 = 98 '2 键 '(在数字小键盘上)

Const vbKeyNum3 = 99 '3 键 '(在数字小键盘上)

Const vbKeyNum4 = 100 '4 键 '(在数字小键盘上)

Const vbKeyNum5 = 101 '5 键 '(在数字小键盘上)

Const vbKeyNum6 = 102 '6 键 '(在数字小键盘上)

Const vbKeyNum7 = 103 '7 键 '(在数字小键盘上)

Const vbKeyNum8 = 104 '8 键 '(在数字小键盘上)

Const vbKeyNum9 = 105 '9 键 '(在数字小键盘上)

Const vbKeyMultiply = 106 '乘号(*) 键

Const vbKeyAdd = 107 '加号(+) 键

Const vbKeySeparator = 108 'Enter键(在数字小键盘上)

Const vbKeySubtract = 109 '减号(-) 键

Const vbKeyDecimal = 110 '小数点(.) 键

Const vbKeyDivide = 111 '除号(/) 键

Const vbKeyF1 = 112 'F1 键

Const vbKeyF2 = 113 'F2 键

Const vbKeyF3 = 114 'F3 键

Const vbKeyF4 = 115 'F4 键

Const vbKeyF5 = 116 'F5 键

Const vbKeyF6 = 117 'F6 键

Const vbKeyF7 = 118 'F7 键

Const vbKeyF8 = 119 'F8 键

Const vbKeyF9 = 120 'F9 键

Const vbKeyF10 = 121 'F10 键

Const vbKeyF11 = 122 'F11 键

Const vbKeyF12 = 123 'F12 键

Const vbKeyF13 = 124 'F13 键

Const vbKeyF14 = 125 'F14 键

Const vbKeyF15 = 126 'F15 键

Const vbKeyF16 = 127 'F16 键

Const vbKeyNumlock = 144 'NUM 'LOCK 键 '

''

Const KEYEVENTF_KEYUP = &H2

''

Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal Scan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As Integer

Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long '计算扫描码

Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Integer) As Integer '这个比较正确

''休眠

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

''输入法相关

Private Declare Function GetKeyboardLayoutList Lib "user32" (ByVal nBuff As Long, lpList As Long) As Long '所有输入法

Private Declare Function ImmGetDescription Lib "imm32.dll" Alias "ImmGetDescriptionA" (ByVal hkl As Long, ByVal lpsz As String, ByVal uBufLen As Long) As Long

Private Declare Function ImmIsIME Lib "imm32.dll" (ByVal hkl As Long) As Long '中文输入法

Private Declare Function ActivateKeyboardLayout Lib "user32" (ByVal hkl As Long, ByVal flags As Long) As Long '使用输入法

Private Declare Function GetKeyboardLayout Lib "user32" (ByVal dwLayout As Long) As Long '取输入法 '0当前

Private Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long

Private Declare Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long

Const KLF_REORDER = &H8

Private NoOfKBDLayout As Long, i As Long, j As Long

Private hKB(24) As Long, BuffLen As Long

Private Buff As String

Private RetStr As String

Private RetCount As Long

Private kln As String

Private hCurKBDLayout As Variant

''换成英文输入法

Private Sub set_kb_en()

Buff = String(255, 0)

hCurKBDLayout = GetKeyboardLayout(0) '取得目前的输入法

NoOfKBDLayout = GetKeyboardLayoutList(25, hKB(0)) '取得所有输入法

For i = 1 To NoOfKBDLayout

If ImmIsIME(hKB(i - 1)) = 1 Then '中文输入法

BuffLen = 255

RetCount = ImmGetDescription(hKB(i - 1), Buff, BuffLen)

RetStr = Left(Buff, RetCount)

Debug.Print i & ":" & RetStr

Else

RetStr = "English (American)" '英文输入法

Debug.Print i, RetStr

ActivateKeyboardLayout GetKeyboardLayout(hKB(i - 1)), 0 '使用英文输入法

End If

Next

End Sub

''换成原输入法

Private Sub set_kb_re()

'ActivateKeyboardLayout hCurKBDLayout, 0 '恢复原来的输入法

End Sub

''输入一个字符 ,一串字符

Public Function set_key(key_char As String)

Dim isUper As Boolean, isCapital As Boolean, isShift As Boolean

Dim key_CH As String

key_CH = Left(key_char, 1)

isCapital = GetKeyState(vbKeyCapital) '大写状态

'相异就得SHIFT,针对字母

isShift = IIf(Asc(key_CH) >= 65 And Asc(key_CH) <= 90 And isCapital = False, True, False)

isShift = isShift Or IIf(Asc(key_CH) >= Asc("a") And Asc(key_CH) <= Asc("z") And isCapital = True, True, False)

If Len(key_char) = 0 Then Call set_kb_re: Exit Function '无字符退出

key_CH = Asc(UCase(key_CH)) 'vkey

'hCurKBDLayout = GetKeyboardLayout(0) '取得目前的输入法

'Debug.Print ImmGetDescription(hCurKBDLayout, Buff, 255)

'If key_CH < 128 Then Debug.Print IMEStatus()

If isUper Xor isCapital Then '锁定与字符状态相异则用SHIFT

keybd_event vbKeyShift, MapVirtualKey(vbKeyShift, 0), 0, 0

Sleep 5

End If

keybd_event key_CH, MapVirtualKey(key_CH, 0), 0, 0

Sleep 10

''弹起

keybd_event key_CH, MapVirtualKey(key_CH, 0), KEYEVENTF_KEYUP, 0

Sleep 5

If isUper Xor isCapital Then '锁定与字符状态相异则用SHIFT

keybd_event vbKeyShift, MapVirtualKey(vbKeyShift, 0), KEYEVENTF_KEYUP, 0

Sleep 5

End If

If Len(key_char) = 1 Then set_key = Chr(key_CH): Call set_kb_re: Exit Function '单字符退出

set_key = Chr(key_CH) & set_key(Mid(key_char, 2)) '多字符继续

End Function
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: