Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2496695
  • 博文数量: 319
  • 博客积分: 9650
  • 博客等级: 中将
  • 技术积分: 3881
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-27 21:05
文章分类

全部博文(319)

文章存档

2017年(5)

2016年(10)

2015年(3)

2014年(3)

2013年(10)

2012年(26)

2011年(67)

2010年(186)

2009年(9)

分类: 嵌入式

2011-12-10 10:22:50

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 键被按下  
阅读(14208) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

最乖啦啦2011-12-13 01:18:46

怎样记录非普通字符按键呢?