Excel VBA如何发送主键盘上下箭头而非小键盘箭头?
解决Excel VBA发送主键盘向下箭头的问题
可行,你可以通过以下两种方法实现:
方法1:使用keybd_event指定主键盘向下箭头的扫描码
主键盘向下箭头的虚拟键码仍是VK_DOWN(&H28),但需指定对应的扫描码(主键盘DOWN的扫描码为&H50),以此区分小键盘按键。示例代码:
Private Declare PtrSafe Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As LongPtr) Const VK_DOWN As Byte = &H28 Const KEYEVENTF_KEYUP As Long = &H2 Sub SendMainKeyboardDown() ' 按下主键盘向下箭头 keybd_event VK_DOWN, &H50, 0, 0 ' 释放按键 keybd_event VK_DOWN, &H50, KEYEVENTF_KEYUP, 0 End Sub
方法2:使用更可靠的SendInput API(推荐)
keybd_event已被微软标记为过时,SendInput是更稳定的替代方案,可精准模拟主键盘按键。示例代码:
Private Declare PtrSafe Function SendInput Lib "user32.dll" (ByVal nInputs As LongPtr, pInputs As INPUT, ByVal cbSize As LongPtr) As LongPtr Private Type INPUT dwType As Long xi(0 To 31) As Byte End Type Private Type KEYBDINPUT wVk As Integer wScan As Integer dwFlags As Long time As Long dwExtraInfo As LongPtr End Type Const INPUT_KEYBOARD As Long = 1 Const KEYEVENTF_KEYUP As Long = &H2 Sub SendMainDownArrow() Dim inputDown As INPUT, inputUp As INPUT Dim kbDown As KEYBDINPUT, kbUp As KEYBDINPUT ' 配置按下事件:通过扫描码指定主键盘向下箭头 kbDown.wVk = 0 ' 设为0,依赖wScan指定按键 kbDown.wScan = &H50 ' 主键盘向下箭头的扫描码 kbDown.dwFlags = 0 ' 标记为按下操作 inputDown.dwType = INPUT_KEYBOARD LSet inputDown.xi = kbDown ' 配置释放事件 kbUp.wVk = 0 kbUp.wScan = &H50 kbUp.dwFlags = KEYEVENTF_KEYUP inputUp.dwType = INPUT_KEYBOARD LSet inputUp.xi = kbUp ' 发送按键输入 SendInput 1, inputDown, LenB(inputDown) SendInput 1, inputUp, LenB(inputUp) End Sub
关键说明
- 主键盘与小键盘箭头键的虚拟键码相同,但扫描码不同,指定扫描码
&H50可精准触发主键盘向下箭头。 - 使用
SendInput时,设置wVk=0并通过wScan指定扫描码,能避免系统混淆主/小键盘按键。
内容的提问来源于stack exchange,提问作者Jerry
相关产品推荐
相关产品推荐

