系统消息 -- 键鼠消息

来源:互联网 发布:mac运行iphone应用 编辑:程序博客网 时间:2024/06/11 09:10

转自:点击打开链接


鼠标消息

在窗口显示区域鼠标消息

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

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

 


原创粉丝点击