VB实现向指定窗口发送组合键(用在向STM8烧录软件STVP捣入数据)
Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal Scan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
PostMessage hSupper, WM_KEYDOWN, vbKeyG, MakeKeyLparam(vbKeyG, WM_KEYDOWN) ' 模拟按下 G 键,SHIFT+A产生一个大写A字符, hSupper为指定窗口的句柄
PostMessage hSupper, WM_KEYUP, vbKeyG, MakeKeyLparam(vbKeyG, WM_KEYUP) ' 模拟抬起 G 键
keybd_event vbKeyControl, &H11, 2, 0 ' 模拟抬起 vbKeyControl 键
常数 值 描述
vbKeyLButton &H1 鼠标左键
vbKeyRButton &H2 鼠标右键
vbKeyCancel &H3 CANCEL 键
vbKeyMButton &H4 鼠标中键
vbKeyBack &H8 BACKSPACE键
vbKeyTab &H9 TAB 键
vbKeyClear &HC CLEAR 键
vbKeyReturn &HD ENTER 键
vbKeyShift &H10 SHIFT 键
vbKeyControl &H11 CTRL 键
vbKeyMenu &H12 MENU 键
vbKeyPause &H13 PAUSE 键
vbKeyCapital &H14 CAPS LOCK键
vbKeyEscape &H1B ESC 键
vbKeySpace &H20 SPACEBAR键
vbKeyPageUp &H21 PAGE UP 键
vbKeyPageDown &H22 PAGE DOWN键
vbKeyEnd &H23 END 键
vbKeyHome &H24 HOME 键
vbKeyLeft &H25 LEFT 键
vbKeyUp &H26 UP 键
vbKeyRight &H27 RIGHT 键
vbKeyDown &H28 DOWN 键
vbKeySelect &H29 SELECT 键
vbKeyPrint &H2A PRINT SCREEN键
vbKeyExecute &H2B EXECUTE 键
vbKeySnapshot &H2C SNAPSHOT键
vbKeyInsert &H2D INSERT 键
vbKeyDelete &H2E DELETE 键
vbKeyHelp &H2F HELP 键
vbKeyNumlock &H90 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 &H60 0 键
vbKeyNumpad1 &H61 1 键
vbKeyNumpad2 &H62 2 键
vbKeyNumpad3 &H63 3 键
vbKeyNumpad4 &H64 4 键
vbKeyNumpad5 &H65 5 键
vbKeyNumpad6 &H66 6 键
vbKeyNumpad7 &H67 7 键
vbKeyNumpad8 &H68 8 键
vbKeyNumpad9 &H69 9 键
vbKeyMultiply &H6A MULTIPLICATION SIGN (*)键
vbKeyAdd &H6B PLUS SIGN (+) 键
vbKeySeparator &H6C ENTER 键
vbKeySubtract &H6D MINUS SIGN (杴) 键
vbKeyDecimal &H6E DECIMAL POINT (.) 键
vbKeyDivide &H6F DIVISION SIGN (/) 键
下列常数代表功能键:
常数 值 描述
vbKeyF1 &H70 F1 键
vbKeyF2 &H71 F2 键
vbKeyF3 &H72 F3 键
vbKeyF4 &H73 F4 键
vbKeyF5 &H74 F5 键
vbKeyF6 &H75 F6 键
vbKeyF7 &H76 F7 键
vbKeyF8 &H77 F8 键
vbKeyF9 &H78 F9 键
vbKeyF10 &H79 F10 键
vbKeyF11 &H7A F11 键
vbKeyF12 &H7B F12 键
vbKeyF13 &H7C F13 键
vbKeyF14 &H7D F14 键
vbKeyF15 &H7E F15 键
vbKeyF16 &H7F F16 键
资料二:
向未激活的窗口发送组合键,一般情况下都是不可以的。
如何在VB中用PostMessage向指定窗口发送带有修饰键的组合键?2010-01-27 17:01向任意应用程序(包括后台的)发送任意按键消息(包括普通字符键、功能键、Shift/Control/Alt加任意按键的组合键),以实现自动执行特定功能,是一个用途很广、很有实用价值的功能,很多人都受困于此,不得其解,本人也遇到这种需求并受阻。刚开始查了很多资料和网上网友的解决方案,有些能起到一定作用,但也有许多方案经试验证实不可行。尤其是关于发送 Shift/Control/Alt 加任意按键的组合键这个问题,没有发现一个可行的方案,例如以下代码并不能向指定Window(hwnd)发送 Ctrl+C:
PostMessage hwnd,WM_KEYDOWN,VK_CONTROL,&H001D0001 '按下Ctrl键
PostMessage hwnd,WM_KEYDOWN,VK_C,&H002E0001 '按下C键
PostMessage hwnd,WM_KEYUP,VK_C,&HC02E0001 '释放C键
PostMessage hwnd,WM_KEYUP,VK_CONTROL,&HC01D0001 '释放Ctrl键
上例只能发送一个小写字母c。
以下代码虽可以模拟 Ctrl+C 按键,但却不能向指定的后台窗口发送:
keybd_event VK_Ctrl, 0, 0, 0 '按下Ctrl键
keybd_event VK_C, 0, 0, 0 '按下C键
keybd_event VK_C, 0, KEYEVENTF_KEYUP, 0 '释放C键
keybd_event VK_Ctrl, 0, KEYEVENTF_KEYUP, 0 '释放Ctrl键
难道真的没有解决这个问题的办法吗?我想这个应该是可以做到的呀!后来经过反复的研究Windows的消息机制和键盘输入系统调用的资料,终于找到了解决方案,并经试验成功证实。自己也是曾经受困于此,终得其解,不敢独享,现拿出来献给广大同需此求的朋友,也让这个问题不再是少数“高手”们独享的秘籍。
要实现向任意应用程序窗口发送模拟的按键,在不需激活该应用程序使其获得输入焦点的情况下,首先必须取得要接收按键的窗口句柄,这要用到Windows API FindWindow 及 FindWindowEx,首先用 FindWindow 取得应用程序顶层(Top Level)窗口的句柄,然后再用 FindWindowEx 取得要接收按键的子窗口或控件的句柄,因为应用程序顶层窗口不一定就是接受按键的窗口(如“NotePad.exe”记事本程序,实际接受按键的窗口是Notepad主窗口下的Edit控件),可以通过ClassID或Caption来查找。假设目标窗口的句柄已取得(hwnd),然后要用PostMessage向该窗口发送按键消息,对于普通字符键,直接用WM_CHAR消息最简单,如下:
PostMessage hwnd, WM_CHAR, Asc("A"), 0 ' 发送一个 A 字符
对于非普通字符按键,如功能键、方向键等,要用 WM_KEYDOWN、WM_KEYUP 消息,如下:
PostMessage hWndMsg, WM_KEYDOWN, VK_ESCAPE, &H00010001 ' 模拟按下 Esc 键
PostMessage hWndMsg, WM_KEYUP, VK_ESCAPE, &HC0010001 ' 模拟抬起 Esc 键
以上最后一个参数(lParam)低16位(0001)表示按键一次,高8位00表示按下,C0表示抬起,次高8位(01)表示该键的扫描码,可用 API MapVirtualKey(VirtualKey, 0)取得(注意:扫描码在各系统可能会不同,在此以具体数值示例,实际应用MapVirtualKey取得)。
下面要讲Shift/Control/Alt修饰键与其它按键的组合怎样发送,对于Shift和Control用以下方式(用到 API keybd_event):
keybd_event VK_SHIFT, &H2A, 0, 0 ' 模拟按下SHIFT键,&H2A是VK_SHIFT的扫描码
PostMessage hWndMsg, WM_KEYDOWN, VK_A, &H001E0001 ' 模拟按下 A 键,SHIFT+A产生一个大写A字符
PostMessage hWndMsg, WM_KEYUP, VK_A, &HC01E0001 ' 模拟抬起 A 键
keybd_event VK_SHIFT, &H2A, KEYEVENTF_KEYUP, 0 ' 模拟抬起 SHIFT 键
以上VK_SHIFT(扫描码2A)换成VK_CONTROL(扫描码1D)就可以实现Ctrl组合键,VK_A(扫描码1E)也可以换成任意功能键,如VK_F4(扫描码3E)。
对于Alt修饰键比较特别,它属于系统按键,要用 WM_SYSKEYDOWN/WM_SYSKEYUP 消息,如下:
PostMessage hWndMsg, WM_SYSKEYDOWN, VK_F4, &H003E0001 Or &H20000000 ' 模拟按下 Alt+F4
PostMessage hWndMsg, WM_SYSKEYUP, VK_F4, &HC03E0001 Or &H20000000 ' 模拟抬起 Alt+F4
' &H20000000 为 context code 位,置 1 表示 Alt 键被按下