(win32)键盘消息

从消息队列中读取MSG结构中的hwnd参数指出了接受消息的窗口句柄。main的消息循环中调用DispatchMessage函数传送消息给窗口过程。

接收的这个键盘消息的窗口称为有输入焦点的窗口。有输入焦点的窗口肯定是当前活动窗口或以当前活动窗口为父窗口的窗口。

键盘消息先储存在系统消息队列,再把它们发送到程序消息队列。但是仅当程序处理完一个消息后,系统消息队列才会把下一个消息放入程序消息队列。

按键组合
比如Q键可以和Ctrl、Shift、Gaps Lock键的组合。
对于字符的按键组合,windows在发送按键消息的同时还发送字符消息。
不产生字符的按键消息,比如Shift、Tab之类的,只发送按键消息。

非系统键击 WM_KEYDOWN WM_KEYUP
系统键击 WM_SYSKEYDOWN WM_SYSKEYUP
当一直按下一个键不放,windows将发送给窗口过程一连串的WM_KEYDOWN(或WM_SYSKEYDOWN).当此键被释放时,windows发送给窗口过程一个WM_KEYUP(或WM_SYSKEYUP).
通过调用GetMessageTime函数,能得到键按下或释放的时间。

Alt键和其他键组合通常产生的是WM_SYSKEYDOWN和WM_SYSKEYUP消息。
如果在窗口过程中的代码有设置这些系统键击,处理完设置的代码后,仍然会发送这些键击给DefWindowProc函数,以便不影响Windows对它的处理。
只有当程序传递消息给DefWindowProc函数时,windows才会处理这些消息。如果在窗口过程中增加下面几行:

case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
case WM_SYSCHAR:
    return 0;

主窗口有输入焦点时,就可以有效地阻止所以Alt键的操作。

虚拟键代码储存在WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN和WM_SYSKEYUP消息的wParam参数中。虚拟键代码确定哪个键被按下或被释放。

VK_LBUTTON  1   鼠标左键
VK_RBUTTON  2   鼠标右键
VK_CANCEL   3   Cancel
VK_MBUTTON  4   鼠标中键
VK_XBUTTON1 5   
VK_XBUTTON2 6   
VK_BACK     8   Backspace
VK_TAB      9   Tab
VK_CLEAR    12  Clear
VK_RETURN   13  Enter
VK_SHIFT    16  Shift
VK_CONTROL  17  Ctrl
VK_MENU     18  Alt
VK_PAUSE    19  Pause
VK_CAPITAL  20  Caps Lock
VK_KANA     21  
VK_HANGUL   21  
VK_JUNJA    23  
VK_FINAL    24  
VK_HANJA      25    
VK_KANJI      25*   
VK_ESCAPE     27    Esc
VK_CONVERT    28    
VK_NONCONVERT 29    
VK_ACCEPT     30    
VK_MODECHANGE 31    
VK_SPACE      32    Space
VK_PRIOR      33    Page Up
VK_NEXT       34    Page Down
VK_END        35    End
VK_HOME       36    Home
VK_LEFT       37    Left Arrow
VK_UP         38    Up Arrow
VK_RIGHT      39    Right Arrow
VK_DOWN       40    Down Arrow
VK_SELECT     41    Select
VK_PRINT      42    Print
VK_EXECUTE    43    Execute
VK_SNAPSHOT   44    Snapshot
VK_INSERT     45    Insert
VK_DELETE     46    Delete
VK_HELP       47    Help
              48    0
              49    1
50  2
51  3
52  4
53  5
54  6
55  7
56  8
57  9
65  A
66  B
67  C
68  D
69  E
70  F
71  G
72  H
73  I
74  J
75  K
76  L
77  M
78  N
79  O
80  P
81  Q
82  R
83  S
84  T
85  U
86  V
87  W
            88  X
            89  Y
            90  Z
VK_LWIN     91  
VK_RWIN     92  
VK_APPS     93  
VK_SLEEP    95  
VK_NUMPAD0  96  小键盘 0
VK_NUMPAD1  97  小键盘 1
VK_NUMPAD2  98  小键盘 2
VK_NUMPAD3  99  小键盘 3
VK_NUMPAD4  100 小键盘 4
VK_NUMPAD5  101 小键盘 5
VK_NUMPAD6  102 小键盘 6
VK_NUMPAD7  103 小键盘 7
VK_NUMPAD8  104 小键盘 8
VK_NUMPAD9  105 小键盘 9
VK_MULTIPLY 106 小键盘 *
VK_ADD      107 小键盘 +
VK_SEPARATOR  108   小键盘 Enter
VK_SUBTRACT   109   小键盘 -
VK_DECIMAL    110   小键盘 .
VK_DIVIDE     111   小键盘 /
VK_F1   112 F1
VK_F2   113 F2
VK_F3   114 F3
VK_F4   115 F4
VK_F5   116 F5
VK_F6   117 F6
VK_F7   118 F7
VK_F8   119 F8
VK_F9   120 F9
VK_F10  121 F10
VK_F11  122 F11
VK_F12  123 F12
VK_F13  124 
VK_F14  125 
VK_F15  126 
VK_F16  127 
VK_F17  128 
VK_F18  129 
VK_F19  130 
VK_F20  131 
VK_F21  132 
VK_F22  133 
VK_F23  134 
VK_F24  135 
VK_NUMLOCK  144 Num Lock
VK_SCROLL   145 Scroll
VK_LSHIFT   160 
VK_RSHIFT   161 
VK_LCONTROL 162 
VK_RCONTROL 163 
VK_LMENU    164 
VK_RMENU    165 
VK_BROWSER_BACK     166 
VK_BROWSER_FORWARD  167 
VK_BROWSER_REFRESH  168 
VK_BROWSER_STOP     169 
VK_BROWSER_SEARCH   170 
VK_BROWSER_FAVORITES    171 
VK_BROWSER_HOME         172 
VK_VOLUME_MUTE          173 VolumeMute
VK_VOLUME_DOWN          174 VolumeDown
VK_VOLUME_UP            175 VolumeUp
VK_MEDIA_NEXT_TRACK 176 
VK_MEDIA_PREV_TRACK 177 
VK_MEDIA_STOP       178 
VK_MEDIA_PLAY_PAUSE 179 
VK_LAUNCH_MAIL      180 
VK_LAUNCH_MEDIA_SELECT  181 
VK_LAUNCH_APP1          182 
VK_LAUNCH_APP2          183 
VK_OEM_1        186 ; :
VK_OEM_PLUS     187 = +
VK_OEM_COMMA    188 
VK_OEM_MINUS    189 - _
VK_OEM_PERIOD   190 
VK_OEM_2    191 / ?
VK_OEM_3    192 ` ~
VK_OEM_4    219 [ {
VK_OEM_5    220 \ |
VK_OEM_6    221 ] }
VK_OEM_7    222 ' "
VK_OEM_8    223 
VK_OEM_102  226 
VK_PACKET   231 
VK_PROCESSKEY   229 
VK_ATTN         246 
VK_CRSEL    247 
VK_EXSEL    248 
VK_EREOF    249 
VK_PLAY     250 
VK_ZOOM     251 
VK_NONAME   252 
VK_PA1      253 
VK_OEM_CLEAR    254 
switch (message)
{
case WM_KEYDOWN:
     switch (wParam)
     {case 虚拟键代码:调用函数;
           break ;
     }
     return 0;

你可能感兴趣的:(win32学习笔记)