• 关于 keybd_event (vb篇)


    最近有个VB的项目,做到64位的win7上,传统的VB6.0的sendkeys()函数没法用,可能是由于微软的证书验证机制造成的,于是最常用的一句话指令没法用了“SendKeys "{Home}+{End}"”(也就是全选当前的文本框字符)。

    很自然的想到的API,轻松的改完:

    Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
    
    Private Const VK_ADD As Long = &H6B          '加号键
    Private Const VK_APPS As Long = &H5D         'Applications 键(相当于鼠标右键)
    Private Const VK_BACK As Long = &H8          'BackSpace 键
    Private Const VK_CAPITAL As Long = &H14      'Caps Lock 键(大小写转换键)
    Private Const VK_CANCEL As Long = &H3        'Ctrl + Break 过程
    Private Const VK_CONTROL As Long = &H11
    Private Const VK_DECIMAL As Long = &H6E      '小数点号键
    Private Const VK_DELETE As Long = &H2E
    Private Const VK_DIVIDE As Long = &H6F       '除号键
    Private Const VK_DOWN As Long = &H28
    Private Const VK_END As Long = &H23
    Private Const VK_ESCAPE As Long = &H1B
    Private Const VK_F1 As Long = &H70
    Private Const VK_F10 As Long = &H79
    Private Const VK_F11 As Long = &H7A
    Private Const VK_F12 As Long = &H7B
    Private Const VK_F2 As Long = &H71
    Private Const VK_F3 As Long = &H72
    Private Const VK_F4 As Long = &H73
    Private Const VK_F5 As Long = &H74
    Private Const VK_F6 As Long = &H75
    Private Const VK_F7 As Long = &H76
    Private Const VK_F8 As Long = &H77
    Private Const VK_F9 As Long = &H78
    Private Const VK_HOME As Long = &H24
    Private Const VK_INSERT As Long = &H2D
    Private Const VK_LCONTROL As Long = &HA2
    Private Const VK_LEFT As Long = &H25
    Private Const VK_LMENU As Long = &HA4        '左 Alt 键
    Private Const VK_LSHIFT As Long = &HA0
    Private Const VK_LWIN As Long = &H5B
    Private Const VK_MENU As Long = &H12         'Alt 键
    Private Const VK_MULTIPLY As Long = &H6A     '乘号键
    Private Const VK_NEXT As Long = &H22         '下翻页键
    Private Const VK_NUMLOCK As Long = &H90
    Private Const VK_NUMPAD0 As Long = &H60
    Private Const VK_NUMPAD1 As Long = &H61
    Private Const VK_NUMPAD2 As Long = &H62
    Private Const VK_NUMPAD3 As Long = &H63
    Private Const VK_NUMPAD4 As Long = &H64
    Private Const VK_NUMPAD5 As Long = &H65
    Private Const VK_NUMPAD6 As Long = &H66
    Private Const VK_NUMPAD7 As Long = &H67
    Private Const VK_NUMPAD8 As Long = &H68
    Private Const VK_NUMPAD9 As Long = &H69
    Private Const VK_PAUSE As Long = &H13
    Private Const VK_PRINT As Long = &H2A
    Private Const VK_PRIOR As Long = &H21        '上翻页键
    Private Const VK_RCONTROL As Long = &HA3
    Private Const VK_RETURN As Long = &HD        '回车键
    Private Const VK_RIGHT As Long = &H27
    Private Const VK_RMENU As Long = &HA5        '右 Alt 键
    Private Const VK_RSHIFT As Long = &HA1
    Private Const VK_RWIN As Long = &H5C
    Private Const VK_SCROLL As Long = &H91       'Scroll Lock 键
    Private Const VK_SEPARATOR As Long = &H6C    '小键盘上的回车键
    Private Const VK_SHIFT As Long = &H10
    Private Const VK_SLEEP As Long = &H5F        '休眠键
    Private Const VK_SNAPSHOT As Long = &H2C     'Print Screen 键
    Private Const VK_SPACE As Long = &H20
    Private Const VK_SUBTRACT As Long = &H6D     '减号键
    Private Const VK_TAB As Long = &H9
    Private Const VK_UP As Long = &H26
    Private Const VK_OEM_1 As Long = &HBA        'Windows 2000:对于 US 标准键盘,是“;:”键
    Private Const VK_OEM_2 As Long = &HBF        'Windows 2000:对于 US 标准键盘,是“/?”键
    Private Const VK_OEM_3 As Long = &HC0        'Windows 2000:对于 US 标准键盘,是“`~”键
    Private Const VK_OEM_4 As Long = &HDB        'Windows 2000:对于 US 标准键盘,是“[{”键
    Private Const VK_OEM_5 As Long = &HDC        'Windows 2000:对于 US 标准键盘,是“|”键
    Private Const VK_OEM_6 As Long = &HDD        'Windows 2000:对于 US 标准键盘,是“]}”键
    Private Const VK_OEM_7 As Long = &HDE        'Windows 2000:对于 US 标准键盘,是“单/双引号”键
    Private Const VK_OEM_COMMA As Long = &HBC    'Windows 2000:对于任何国家/地区,是“,”键
    Private Const VK_OEM_MINUS As Long = &HBD    'Windows 2000:对于任何国家/地区,是“-”键
    Private Const VK_OEM_PERIOD As Long = &HBE   'Windows 2000:对于任何国家/地区,是“.”键
    Private Const VK_OEM_PLUS As Long = &HBB     'Windows 2000:对于任何国家/地区,是“+”键
    
    Private Const KEYEVENTF_KEYUP = &H2
    
    Public Sub SendKeysAPI_HOME_END(frmCur As String)
    '下面是发送 组合 键码:
    Call keybd_event(VK_HOME, 0, 0, 0)
    Call keybd_event(VK_LSHIFT,0, 0, 0)
    Call keybd_event(VK_END, 0,0, 0)
    Call keybd_event(VK_END, 0, KEYEVENTF_EXTENDEDKEY, 0)
    Call keybd_event(VK_LSHIFT, 0,KEYEVENTF_EXTENDEDKEY , 0)
    Call keybd_event(VK_HOME, 0, KEYEVENTF_EXTENDEDKEY , 0)
    End Sub

    可是测试的时候很多问题,这个函数很简单,网上大家都这么用,为什么我这不行呢,现象是有时没反应,有时shift按下不放,无奈啊,抱着无解的心态打开MSDN,看了下函数说明,才知道用的有问题,修改如下:

    Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
    
    Private Const VK_ADD As Long = &H6B          '加号键
    Private Const VK_APPS As Long = &H5D         'Applications 键(相当于鼠标右键)
    Private Const VK_BACK As Long = &H8          'BackSpace 键
    Private Const VK_CAPITAL As Long = &H14      'Caps Lock 键(大小写转换键)
    Private Const VK_CANCEL As Long = &H3        'Ctrl + Break 过程
    Private Const VK_CONTROL As Long = &H11
    Private Const VK_DECIMAL As Long = &H6E      '小数点号键
    Private Const VK_DELETE As Long = &H2E
    Private Const VK_DIVIDE As Long = &H6F       '除号键
    Private Const VK_DOWN As Long = &H28
    Private Const VK_END As Long = &H23
    Private Const VK_ESCAPE As Long = &H1B
    Private Const VK_F1 As Long = &H70
    Private Const VK_F10 As Long = &H79
    Private Const VK_F11 As Long = &H7A
    Private Const VK_F12 As Long = &H7B
    Private Const VK_F2 As Long = &H71
    Private Const VK_F3 As Long = &H72
    Private Const VK_F4 As Long = &H73
    Private Const VK_F5 As Long = &H74
    Private Const VK_F6 As Long = &H75
    Private Const VK_F7 As Long = &H76
    Private Const VK_F8 As Long = &H77
    Private Const VK_F9 As Long = &H78
    Private Const VK_HOME As Long = &H24
    Private Const VK_INSERT As Long = &H2D
    Private Const VK_LCONTROL As Long = &HA2
    Private Const VK_LEFT As Long = &H25
    Private Const VK_LMENU As Long = &HA4        '左 Alt 键
    Private Const VK_LSHIFT As Long = &HA0
    Private Const VK_LWIN As Long = &H5B
    Private Const VK_MENU As Long = &H12         'Alt 键
    Private Const VK_MULTIPLY As Long = &H6A     '乘号键
    Private Const VK_NEXT As Long = &H22         '下翻页键
    Private Const VK_NUMLOCK As Long = &H90
    Private Const VK_NUMPAD0 As Long = &H60
    Private Const VK_NUMPAD1 As Long = &H61
    Private Const VK_NUMPAD2 As Long = &H62
    Private Const VK_NUMPAD3 As Long = &H63
    Private Const VK_NUMPAD4 As Long = &H64
    Private Const VK_NUMPAD5 As Long = &H65
    Private Const VK_NUMPAD6 As Long = &H66
    Private Const VK_NUMPAD7 As Long = &H67
    Private Const VK_NUMPAD8 As Long = &H68
    Private Const VK_NUMPAD9 As Long = &H69
    Private Const VK_PAUSE As Long = &H13
    Private Const VK_PRINT As Long = &H2A
    Private Const VK_PRIOR As Long = &H21        '上翻页键
    Private Const VK_RCONTROL As Long = &HA3
    Private Const VK_RETURN As Long = &HD        '回车键
    Private Const VK_RIGHT As Long = &H27
    Private Const VK_RMENU As Long = &HA5        '右 Alt 键
    Private Const VK_RSHIFT As Long = &HA1
    Private Const VK_RWIN As Long = &H5C
    Private Const VK_SCROLL As Long = &H91       'Scroll Lock 键
    Private Const VK_SEPARATOR As Long = &H6C    '小键盘上的回车键
    Private Const VK_SHIFT As Long = &H10
    Private Const VK_SLEEP As Long = &H5F        '休眠键
    Private Const VK_SNAPSHOT As Long = &H2C     'Print Screen 键
    Private Const VK_SPACE As Long = &H20
    Private Const VK_SUBTRACT As Long = &H6D     '减号键
    Private Const VK_TAB As Long = &H9
    Private Const VK_UP As Long = &H26
    Private Const VK_OEM_1 As Long = &HBA        'Windows 2000:对于 US 标准键盘,是“;:”键
    Private Const VK_OEM_2 As Long = &HBF        'Windows 2000:对于 US 标准键盘,是“/?”键
    Private Const VK_OEM_3 As Long = &HC0        'Windows 2000:对于 US 标准键盘,是“`~”键
    Private Const VK_OEM_4 As Long = &HDB        'Windows 2000:对于 US 标准键盘,是“[{”键
    Private Const VK_OEM_5 As Long = &HDC        'Windows 2000:对于 US 标准键盘,是“|”键
    Private Const VK_OEM_6 As Long = &HDD        'Windows 2000:对于 US 标准键盘,是“]}”键
    Private Const VK_OEM_7 As Long = &HDE        'Windows 2000:对于 US 标准键盘,是“单/双引号”键
    Private Const VK_OEM_COMMA As Long = &HBC    'Windows 2000:对于任何国家/地区,是“,”键
    Private Const VK_OEM_MINUS As Long = &HBD    'Windows 2000:对于任何国家/地区,是“-”键
    Private Const VK_OEM_PERIOD As Long = &HBE   'Windows 2000:对于任何国家/地区,是“.”键
    Private Const VK_OEM_PLUS As Long = &HBB     'Windows 2000:对于任何国家/地区,是“+”键
    
    Private Const KEYEVENTF_KEYUP = &H2
    Private Const KEYEVENTF_EXTENDEDKEY = &H1
    Public Sub SendKeysAPI_HOME_END(frmCur As String)
    '下面是发送 组合 键码:
    Call keybd_event(VK_HOME, MapVirtualKey(VK_HOME, 0), KEYEVENTF_EXTENDEDKEY Or 0, 0)
    Call keybd_event(VK_LSHIFT, MapVirtualKey(VK_SHIFT, 0), KEYEVENTF_EXTENDEDKEY Or 0, 0)
    Call keybd_event(VK_END, MapVirtualKey(VK_END, 0), KEYEVENTF_EXTENDEDKEY Or 0, 0)
    Call keybd_event(VK_END, MapVirtualKey(VK_END, 0), KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
    Call keybd_event(VK_LSHIFT, MapVirtualKey(VK_LSHIFT, 0), KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
    Call keybd_event(VK_HOME, MapVirtualKey(VK_HOME, 0), KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
    End Sub

    也就是与上KEYEVENTF_EXTENDEDKEY(扩展键)的标识就行了,至于原因,我猜某些特殊键,例如shift等得加吧。

  • 相关阅读:
    鼠标的移动触发函数改变字体颜色
    Godaddy创始人:成就亿万富翁的10条规则
    关于编程,大学没有传授的十件事
    Using XAMPP for Local WordPress Theme Development
    100+ Resources for Web Developer
    你必须非常努力,才能看起来毫不费力
    建立WordPress博客网站——个人教程
    函数指针和指针函数
    每天写出好代码的5个建议
    LumiSoft Mail Server
  • 原文地址:https://www.cnblogs.com/swack/p/3976378.html
Copyright © 2020-2023  润新知