• 系统消息 键鼠消息


    鼠标消息

    在窗口显示区域鼠标消息

    WM_MOUSEMOVE 当鼠标在窗口的显示区域移动时
    WM_LBUTTONDOWN 按下鼠标左键
    WM_LBUTTONUP 释放鼠标左键
    WM_LBUTTONDBLCLK 双击鼠标左键
    WM_MBUTTONDOWN 按下鼠标中键
    WM_MBUTTONUP 释放鼠标中键
    WM_MBUTTONDBLCLK 双击鼠标中键
    WM_RBUTTONDOWN 按下鼠标右键
    WM_RBUTTONUP 释放鼠标右键
    WM_RBUTTONDBLCLK 双击鼠标右键
    wParam为鼠标按键以及Shift和Ctrl键的状态
    lParam为鼠标的显示区域x坐标y坐标(高字节为x,低字节为y)
    WM_NCHITTEST 鼠标命中测试
    Windows根据它来产生与鼠标位置相关的所有其它鼠标消息
    wParam unused
    lParam 屏幕坐标x,y
    WM_MOUSEWHEEL 鼠标滚轮转动
    wParam的低字组包含一系列的旗标,用于表示鼠标按键、Shift与Ctrl键的状态。
    wParam的高字组保存一个「delta」值,该值目前可以是120或-120,向前转动或向后转动。值120或-120表示文件将分别向上或向下卷动三行。
    lParam为鼠标的屏幕坐标
    显示区域鼠标消息和显示区域鼠标消息wParam 的位屏蔽有
    MK_LBUTTON按下左键
    MK_MBUTTON按下中键
    MK_RBUTTON按下右键
    MK_SHIFT按下Shift键
    MK_CONTROL按下Ctrl键

    在窗口非显示区域鼠标消息

    WM_NCMOUSEMOVE 当鼠标在窗口的显示区域移动时
    WM_NCLBUTTONDOWN 按下鼠标左键
    WM_NCLBUTTONUP 释放鼠标左键
    WM_NCLBUTTONDBLCLK 双击鼠标左键
    WM_NCMBUTTONDOWN 按下鼠标中键
    WM_NCMBUTTONUP 释放鼠标中键
    WM_NCMBUTTONDBLCLK 双击鼠标中键
    WM_NCRBUTTONDOWN 按下鼠标右键
    WM_NCRBUTTONUP 释放鼠标右键
    WM_NCRBUTTONDBLCLK 双击鼠标右键
    wParam命中的区域 
    lParam为鼠标的显示区域x坐标+y坐标

    键盘消息 

    虚拟码

    虚拟键码 对应键
    VK_LBUTTON 1 Left mouse button
    VK_RBUTTON 2 Right mouse button
    VK_CANCEL 3 Control-break processing
    VK_MBUTTON 4 Middle mouse button (three-button mouse)
    VK_XBUTTON1 5 Windows 2000/XP: X1 mouse button
    VK_XBUTTON2 6 Windows 2000/XP: X2 mouse button
    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 IME Hanguel mode (maintained for compatibility; use VK_HANGUL)
    VK_HANGUL 21 IME Hangul mode
    VK_JUNJA 23 IME Junja mode
    VK_FINAL 24 IME final mode
    VK_HANJA 25 IME Hanja mode
    VK_KANJI 25* IME Kanji mode
    VK_ESCAPE 27 Esc
    VK_CONVERT 28 IME convert
    VK_NONCONVERT 29 IME nonconvert
    VK_ACCEPT 30 IME accept
    VK_MODECHANGE 31 IME mode change request
    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 leftWindows key
    VK_RWIN 92 rightWindows key
    VK_APPS 93 Applications key
    VK_SLEEP 95 Computer Sleep key
    VK_NUMPAD0 96 Numeric keypad 0
    VK_NUMPAD1 97 Numeric keypad 1
    VK_NUMPAD2 98 Numeric keypad 2
    VK_NUMPAD3 99 Numeric keypad 3
    VK_NUMPAD4 100 Numeric keypad 4
    VK_NUMPAD5 101 Numeric keypad 5
    VK_NUMPAD6 102 Numeric keypad 6
    VK_NUMPAD7 103 Numeric keypad 7
    VK_NUMPAD8 104 Numeric keypad 8
    VK_NUMPAD9 105 Numeric keypad 9
    VK_MULTIPLY 106 Numeric keypad *
    VK_ADD 107 Numeric keypad +
    VK_SEPARATOR 108 Numeric keypad Enter
    VK_SUBTRACT 109 Numeric keypad -
    VK_DECIMAL 110 Numeric keypad .
    VK_DIVIDE 111 Numeric keypad /
    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 F13
    VK_F14 125 F14
    VK_F15 126 F15
    VK_F16 127 F16
    VK_F17 128 F17
    VK_F18 129 F18
    VK_F19 130 F19
    VK_F20 131 F20
    VK_F21 132 F21
    VK_F22 133 F22
    VK_F23 134 F23
    VK_F24 135 F24
    VK_NUMLOCK 144 Num Lock
    VK_SCROLL 145 Scroll
    VK_LSHIFT 160 left shift key
    VK_RSHIFT 161 right shift key
    VK_LCONTROL 162 left ctrl key
    VK_RCONTROL 163 right ctrl key
    VK_LMENU 164 left alt key
    VK_RMENU 165 right alt key
    VK_BROWSER_BACK 166 Windows 2000/XP: Browser Back key
    VK_BROWSER_FORWARD 167 Windows 2000/XP: Browser Forward key
    VK_BROWSER_REFRESH 168 Windows 2000/XP: Browser Refresh key
    VK_BROWSER_STOP 169 Windows 2000/XP: Browser Stop key
    VK_BROWSER_SEARCH 170 Windows 2000/XP: Browser Search key
    VK_BROWSER_FAVORITES 171 Windows 2000/XP: Browser Favorites key
    VK_BROWSER_HOME 172 Windows 2000/XP: Browser Start and Home key
    VK_VOLUME_MUTE 173 Windows 2000/XP: Volume Mute key
    VK_VOLUME_DOWN 174 Windows 2000/XP: Volume Down key
    VK_VOLUME_UP 175 Windows 2000/XP: Volume Up key
    VK_MEDIA_NEXT_TRACK 176 Windows 2000/XP: Next Track key
    VK_MEDIA_PREV_TRACK 177 Windows 2000/XP: Previous Track key
    VK_MEDIA_STOP 178 Windows 2000/XP: Stop Media key
    VK_MEDIA_PLAY_PAUSE 179 Windows 2000/XP: Play/Pause Media key
    VK_LAUNCH_MAIL 180 Windows 2000/XP: Start Mail key
    VK_LAUNCH_MEDIA_SELECT 181 Windows 2000/XP: Select Media key
    VK_LAUNCH_APP1 182 Windows 2000/XP: Start Application 1 key
    VK_LAUNCH_APP2 183 Windows 2000/XP: Start Application 2 key
    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 Used for miscellaneous characters; it can vary by keyboard.
    VK_OEM_102 226 Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard
    VK_PACKET 231 Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes. The 
    VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. 
    For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and
     WM_KEYUP
    VK_PROCESSKEY 229 Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key
    VK_ATTN 246 Attn key
    VK_CRSEL 247 CrSel key
    VK_EXSEL 248 ExSel key
    VK_EREOF 249 Erase EOF key
    VK_PLAY 250 Play key
    VK_ZOOM 251 Zoom key
    VK_NONAME 252 Reserved
    VK_PA1 253 PA1 key
    VK_OEM_CLEAR 254 Clear key

    关于键盘消息的一些相关概念 

    扫描码和虚拟码

    • 扫描码对应着键盘上的不同键,每一个键被按下或释放时,都会产生一个唯一的扫描码作为本身的标识
    • 扫描码依赖于具体的硬件设备,即当相同的键被按下或释放时,在不同的机器上可能产生不同的扫描码
    • 在程序中通常使用由Windows系统定义的与具体设备无关的虚拟码.在击键产生扫描码的同时,键盘驱动程序KEYBOARD.DRV截取键的扫描码,然后将其翻译成对应的虚拟码,再将扫描码和虚拟码一齐编码形成键盘消息
    • ASCII值对应着字符,而虚拟键代码是对应着键.例如字符A和a的ASCII值不同,但由于位于同一个键上,因此虚拟键代码相同
    • 最后发送到消息队列的键盘消息中,既包含了扫描码又包含了虚拟码

    输入焦点

    • 同一时刻,Windows中可能有多个不同程序在运行.这时,键盘由多个窗口共享,但只有一个窗口能够接收到键盘消息,这个能够接收键盘消息的窗口被称为拥有输入焦点的窗口
    • 拥有输入焦点的窗口应该是当前的活动窗口,或者是活动窗口的子窗口,其标题和边框会以高亮度显示,以区别于其他窗口.拥有输入焦点的也可以是图标而不是窗口,此时,Windows也将消息发送给图标,只是消息的格式略有不同
    • 窗口过程可以通过发送WM_SETFOCUS和 WM_KILLFOCUS消息使窗体获得或失去输入焦点.程序也可以通过捕获WM_SETFOCUS和WM_KILLFOCUS消息来判断窗体何时获得或失去输入焦点.其中WM_SETFOCUS消息表示窗口正获得输入焦点,WM_ KILLFOCUS消息表示窗口正失去输入焦点

      注意:每当用户按下或释放某一个键时,会产生一个中断,该中断激活键盘驱动程序KEYBOARD.DRV来对键盘中断进行处理.KEYBOARD.DRV程序会根据用户的不同操作进行编码,然后调用Windows用户模块USER.EXE生成键盘消息,并将该消息发送到消息队列中等候处理  

    系统键消息 系统键消息指由Aft键和其他键组合而产生的按键消息.当系统键被按下时产生WM_ SYSKEYDOWN消息,当系统键被释放时产生WM_SYSKEYUP消息
    Aft键与其他键形成的组合键通常用于对程序菜单和系统菜单进行选择,或用于在不同的程序之间进行切换.因此,系统键消息应该交由Windows进行处理,用户所编制的程序一般不处理系统键消息,而是将这些消息交由DefWindowProc函数进行处理.如果用户想对系统键消息进行处理,应该在处理完这些消息后,再将其发送给DefWindowProc函数,使得Windows系统能够正常工作
    非系统键消息 l那些不使用Alt键组合的按键消息

    Windows用8种不同的消息来传递不同的键盘事件

    按键消息

    消息 类型 含义
    WM_SYSKEYDOWN 系统 按下系统按键/组合按键
    WM_SYSKEYUP 系统 松开系统按键/组合按键
    WM_KEYDOWN 非系统 按下按键
    WM_KEYUP 非系统 松开按键

    字符消息

    消息 类型 含义
    WM_SYSCHAR 系统 系统字符
    WM_SYSDEADCHAR 系统 系统死字符
    WM_CHAR 非系统 字符
    WM_DEADCHAR 非系统 死字符

    注意

    • 其中死字符是由某些特殊键盘上的按键所造成的,Windows一般忽略死字符所产生的消息
    • 某些击键消息可以被转换成字符消息,例如字母键,数字键等.而有些键只能产生按键消息而没有字符消息,例如 Shift键、Insert键等
    • WM_SYSKEYDOWN与WM_SYSKEYUP产生的是WM_SYSCHAR或WM_SYSDEADCHAR
    • WM_KEYDOWN与WM_KEYUP产生的是WM_CHAR或WM_DEADCHAR
    • 消息循环中的 TranslateMessage函数可以实现从击键消息向字符消息的转化.当GetMessage函数捕获一个WM_SYSKEYDOWN消息或WM_KEYDOWN消息后,TranslateMessage函数判断产生该消息的键是否能够被转换成字符消息,如果能,就将该消息转换成字符消息,再通过DispatchMessape函数将转换后的字符消息发送到消息队列中去

    键盘消息MSG结构体变量

    wParam域用于保存按键的虚拟键代码或字符的ASCII码.对于非字符消息,wParam域保存按键的虚拟健代码;对于字符消息,wParam域不保存字符的ASCII码
    lParam域则用于保存击键时产生的附加信息,实际上一个32位的lParam变量被分为六部分,记录了以下相关信息:重复次数、OEM扫描码、扩展键标志、关联键标志、前一击键状态和转换状态
    位数 含义
    重复记数位(0-15) 击键重复次数累加
    OEM扫描码(16-23) OEM扫描码
    扩展键标志位(24) 扩展键标志在有Alt键(或Ctrl)按下时为1,否则为0
    保留位(25-28) 未定义
    关联码(29) 右按键时,假如同时压下ALT键,那么内容代码为1。对WM_SYSKEYUP与WM_SYSKEYDOWN而言,此位总视为1;而对WM_SYSKEYUP与WM_KEYDOW消息而言,此位为0。除了两个之外:
    • 如果活动窗口最小化了,则它没有输入焦点.这时候所有的按键都会产生WM_SYSKEYUP和WM_SYSKEYDOWN消息.如果Alt键未被按下,则内容代码字段被设定为0.Windows使用WM_SYSKEYUP和WM_SYSKEYDOWN消息,从而使最小化了的活动窗口不处理这些按键
    • 对于一些外国语文(非英文)键盘,有些字符是通过Shift、Ctrl或者Alt键与其它键相组合而产生的.这时内容代码为1,但是此消息并非系统按键消息
    键的先前状态(30) 如果在此之前键是释放的,则键的先前状态为0,否则为1。对WM_KEYUP或者WM_SYSKEYUP消息,它总是设定为1;但是对WM_KEYDOWN或者WM_SYSKEYDOWN消息,此位可以为0,也可以为1。如果为1,则表示该键是自动重复功能所产生的第二个或者后续消息 
    转换状态(31) 如果键正被按下,则转换状态为0;如果键正被释放,则转换状态为1。对WM_KEYDOWN或者WM_SYSKEYDOWN消息,此字段为0;对WM_KEYUP或者WM_SYSKEYUP消息,此字段为1 
     

    按键消息的顺序

    WM_KEYDOWN/WM_SYSKEYDOWN

    WM_CHAR/WM_SYSCHAR

    WM_KEYUP/WM_SYSKEYUP

    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    例如,按下并释放1键.按下1键所产生的消息和wParam的取值 消息 wParam变量取值 WM_KEYDOWN 虚拟码1 WM_CHAR ASCII码“1” WM_KEYUP 虚拟码1
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    例如,按下Shift键后再按下1键并释放,则依次产生如表所示的消息.按下Shift键后按健所产生的消息和wParam的取值 消息 wParam变量取值 WM_KEYDOWN 虚拟码 VK_SHIFT WM_KEYDOWN 虚拟码 VK_1 WM_CHAR ASCII码 “1” WM_KEYUP 虚拟码 VK_1 WM_KEYUP 虚拟码 VK_SHIFT
    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

     

  • 相关阅读:
    【3006】统计数字
    【5001】n皇后问题
    【7001】n阶法雷序列
    【9402】倒序数
    【9705】&&【a801】细胞
    【9802】闭合曲线面积
    【a803】营救
    【9112】求2的n次方的精确值
    V8引擎实现标准ECMA-262(三)
    仔细看看Javascript中的逻辑与(&&)和逻辑或(||)
  • 原文地址:https://www.cnblogs.com/kzang/p/2709813.html
Copyright © 2020-2023  润新知