VB实现向指定窗口发送组合键(用在向STM8烧录软件STVP捣入数据)
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)
keybd_event vbKeyControl, &H11, 0, 0 ' 模拟按下CTRL键,&H11是vbKeyControl的扫描码 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 键
资料一:key_event 键盘模拟(转集)
常数 值 描述
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 键被按下
阅读(14535) | 评论(1) | 转发(1) |