虚拟键码与键盘消息
● 在Windows
中, 所有键盘的按键都被定义为一组通用的“虚拟键码”,也就是说在windows
系统下所有按键都会被视为虚拟键(包括鼠标键在内),
而每一个虚拟键都有其对应的一个虚拟键码。
● Windows
系统是一个消息驱动的环境,一旦我们在键盘上进行输入操作, 那么系统便会接收其对应的键盘消息。
当某一个按键被按下时, 伴随着这个操作所产生的是以 虚拟键码类型传送的WM_KEYDOWN
与 WM_KEYUP
消息。 当程序接收到这些消息时。便可由虚拟键码的信息来得知是哪个按键被按下。
此外,WM_CHAR
则是当按下的按键为定义于 ASCII
中的可打印字符时, 便发出此字符信息。
键盘消息处理
● 在Windows
中键盘消息同样是在消息处理函数中间来处理的。
WM_KEYDOWN
与 WM_KEYUP
消息 这两种消息必须是成对发生的。 但我们往往在程序中对WM_KEYDOWN
消息进行处理,而无视 WM_KEYUP
消息。
● 窗口过程函数有两个参数与消息输出有关, 它们就是——wParam
和 lParam
.
LRESULT CALLBACK WndProc
(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
当键盘消息触发时,wParam
的值 为按下按键的虚拟键码, 在windows
中所定义虚拟键码是以“VK_”开头的。
那lParam
则是储存按键的相关状态信息, 因此, 如果我们的程序要对键盘输入操作进行处理, 就可以用一个switch
语句来判断wParam
中的内容并进行处理。
Windows 鼠标消息处理
● 处理鼠标消息的方法同样是在消息处理函数中加入要处理的鼠标消息类型,
当鼠标消息发生时,输入的参数wParam 与 lParam 就储存了鼠标状态的相关信息。
lParam
参数
●lParam
参数的值可分为高位字节与低位字节两个部分,其中高位部分储存的是鼠标光标所在的X
坐标值,低位字节部分存储的则是鼠标光标所在的Y
坐标值。
可以使用下面两个宏来取得鼠标的坐标值:
WORD LOWORD
(
DWORD dwValue //返回鼠标光标所在的X坐标值
)
WORD HIWORD
(
DWORD dwValue //返回鼠标光标所在的Y坐标值
)
注意: 这两个函数所返回的鼠标光标位置的坐标是相对于内部窗口左上点坐标的。
wParam 参数
● wParam
参数的值记录着鼠标按键及键盘Ctrl
键 与 Shift
的状态信息。
如果某个鼠标消息发生时,要测试鼠标左键是否也被按下, 就把`wParam` 拿着和 某种消息(逻辑与)一下。
● 我们就是这样利用 wParam
参数和测试标志来测试鼠标键是否被按下的。
当按键被按下时, 条件式 “WParam
& MK_LBUTTON
” 所传回的结果就会为 true。 当然, 若消息函数接收到 “WM_LBUTTONDOWN
” 消息时, 同样也可以知道鼠标键被按下而不必再去额外做这样的测试
滚轮消息
鼠标滚轮转动消息 WM_MOUSEWHEEL
, 当鼠标滚轮转动消息发生时, lParam
参数中的值同样是记录光标所在的位置的, 而wParam
参数则分为 高位字节和低位字节两部分,
低位字节部分跟前面一样储存鼠标键与 Shift、 Ctrl
键的状态信息的,而高位字节部分的值会是 120 或 -120 120 表示鼠标滚轮向前转动, -120 表示鼠标滚轮向后转动。
这里的wParam
高位组值与低位组值所在的函数同样是 HIWORD()
与 LOWORD()
HIWORD(wParam); // 高位组值, 值为 120或 -120
LOWORD(wParam); // 低位组值, 鼠标键以及 Shift 和 Ctrl 键的状态信息