支持第三方软件键盘模拟输入的keybd_event函数

Windows提供了一个模拟键盘API函数Keybd_event(),使用该函数可以相应的屏蔽键盘的动作。Keybd_event()函数能触发一个按键事件,也就是说会产生一个WM_KEYDOWN或WM_KEYUP消息。

 

该函数原型如下:

1
2
3
4
5
6
VOID  keybd_event(
   BYTE  bVk,  // virtual-key code
   BYTE  bScan,  // hardware scan code
   DWORD  dwFlags,  // flags specifying various function options
   DWORD  dwExtraInfo  // additional data associated with keystroke
);

  

  从原型可以看出,Keybd_event()共有四个参数:

      第一个为按键的虚拟键值,如回车键为vk_return, tab键为vk_tab(其他具体的参见附录:常用模拟键的键值对照表);

      第二个参数为扫描码,一般不用设置,用0代替就行;

      第三个参数为选项标志,如果为keydown则置0即可,如果为keyup则设成"KEYEVENTF_KEYUP";

      第四个参数一般也是置0即可。

 

例子1:模拟按下'A'键

1
2
keybd_event(65,0,0,0);
keybd_event(65,0,KEYEVENTF_KEYUP,0);

例子2:模拟按下'ALT+F4'键

1
2
3
4
keybd_event(18,0,0,0);
keybd_event(115,0,0,0);
keybd_event(115,0,KEYEVENTF_KEYUP,0);
keybd_event(18,0,KEYEVENTF_KEYUP,0);

  

 键盘键与虚拟键码对照表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  字母和数字键       数字小键盘的键    功能键               其它键
 
键   键码    键    键码    键   键码     键        键码
A   65    0     96    F1   112    Backspace    8
B   66    1     97    F2   113    Tab          9
C   67    2     98    F3   114    Clear        12
D   68    3     99    F4   115    Enter        13
E   69    4    100    F5   116    Shift        16
F   70    5    101    F6   117    Control      17
G   71    6    102    F7   118    Alt          18
H   72    7    103    F8   119    Caps Lock    20
I   73    8    104    F9   120    Esc          27
J   74    9    105    F10  121    Spacebar     32
K   75    *    106    F11  122    Page Up      33
L   76    +    107    F12  123    Page Down    34
M   77    Enter  108    ---  ---    End          35
N   78    -    109    ---  ---    Home         36
O   79    .    110    ---  ---    Left Arrow      37
P   80    /    111    ---  ---    Up Arrow      38
Q   81    ---   ---    ---  ---    Right Arrow   39
R   82    ---   ---    ---  ---    Down Arrow    40
S   83    ---   ---    ---  ---    Insert       45
T   84    ---   ---    ---  ---    Delete       46
U   85    ---   ---    ---  ---    Help         47
V   86    ---   ---    ---  ---    Num Lock      144
W   87          
X   88      
Y   89      
Z   90      
0   48      
1   49      
2   50       
3   51       
4   52       
5   53       
6   54       
7   55       
8   56       
9   57

  

 

 

模拟键盘平时不是很常用, 但是当调用某些快捷键执行某项功能时, 它真的是那么的方便呀.  你不信?  看看下面的实现, 你就会大呼: 为什么不早点告诉我?  呵呵,  原来没有blog呀,  都靠这些挣分呢.

1) 显示桌面:

         很多软件有显示桌面的功能, 并且大家的方法都是遍历窗口,  然后让它们最小化, 其实 win系统给咱们了一个非常方便的WIN键(就是键盘上在CTRL键和ALT键之间的那个带win标志的按键), 利用它, 可以轻松的完成显示桌面的功能.

1
2
3
4
keybd_event(VK_LWIN, 0, 0 ,0);
keybd_event( 'M' , 0, 0 ,0);
keybd_event( 'M' , 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);

  

其他的操作也类似, 比如直接显示开始的运行,就把上面的'M'换成'R'即可。

直接 

1
2
keybd_event(VK_LWIN, 0, 0 ,0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);

直接显示“开始”对话框了。

2) 实现快速的全选

        很多的时候,比如listctrl实现全选,你可以用listctrl循环设置每一项的状态为选中,多罗索的事情呀。用快捷键试一试CTRL+A,其他的快捷键一样的用法,呵呵,你知道怎么办了吧?

1
2
3
4
keybd_event(VK_CONTROL, ( BYTE )0, 0 ,0);
keybd_event( 'A' ,( BYTE )0, 0 ,0);  //此处可以用  'A', (BYTE)65, 用'a'不起作用.
keybd_event( 'A' , ( BYTE )0, KEYEVENTF_KEYUP,0);
keybd_event(VK_CONTROL, ( BYTE )0, KEYEVENTF_KEYUP,0);

  

3) 执行某些特殊的键,比如数字键,大小写,下面是数字键的例子

    bool bState=true;   //true为按下NumLock,false反之
    BYTE keyState[256];
    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
GetKeyboardState(( LPBYTE )&keyState);
if ( (bState && !(keyState[VK_NUMLOCK] & 1)) ||
     (!bState && (keyState[VK_NUMLOCK] & 1)) )
{
     // Simulate a key press
     keybd_event( VK_NUMLOCK,
         0x45,
         KEYEVENTF_EXTENDEDKEY | 0,
         0 );
     
     // Simulate a key release
     keybd_event( VK_NUMLOCK,
         0x45,
         KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
         0);
}

  

4) 你想CTRL+ALT+DELETE三键一起按下,

1
2
3
4
5
6
7
keybd_event(VK_CONTROL, 0, 0 ,0);
keybd_event(VK_MENU,0, 0 ,0);
keybd_event(VK_DELETE,0, 0 ,0);
 
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_MENU,0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_DELETE,0, KEYEVENTF_KEYUP ,0);

  

呵呵,这样不会成功呀,因为这几个键直接是操作系统来截获执行的,而模拟键盘只能发向应用程序,所以这种方法不行的(想显示锁定对话框,用    LockWorkStation();)

5) Window2000/NT/XP已经不提倡用这个函数了,上面的方法只是为了让大家开阔一下思路,怎么替代呢,呵呵,看下面,所以上面的所有代码都可以用这个来完成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//2000下用这个代替 ,包含 "winable.h"
  INPUT input[4];
  memset (input, 0,  sizeof (input));
 
  input[0].type = input[1].type = input[2].type = input[3].type = INPUT_KEYBOARD;
 
  input[0].ki.wVk  = input[3].ki.wVk = VK_LWIN;
  input[1].ki.wVk  = input[2].ki.wVk =  'R' ;
 
  
  //接下来释放它,这一点很重要。
  input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP;
  input[0].ki. time  = input[1].ki. time  = input[2].ki. time  = input[3].ki. time  = GetTickCount();
 
  SendInput(4, input,  sizeof (INPUT));

  

感觉比那个有点罗索,呵呵。

====================

附WIN键的部分快捷键:

WIN键+D=快速的切到桌面,再次点击返回

WIN键+E=快速打开资源管理器

WIN键+R=“运行”。

WIN键+M=全部视窗最小化。

WIN键+Shift+M=取消全部视窗最小化。

WIN键+F1=Help。

WIN键+F=“寻找”。

WIN键+Ctrl+F=显示“查找电脑”。

WIN键+Tab=切换工作列的程式。

WIN键+Break=显示系统内容。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值