哪位大神能帮帮忙解释一下vc里面用wparam来监控键盘按键状态的问题,
wparam & MK_CONTROL 与 wparam ==MK_CONTROL,有什么区别?
什么时候用&,什么时候用==?
MK_CONTROL 与 VK_CONTROL 有什么区别?
为什么有的时候可以用wparam==VK_CONTROL作为判断条件,有的时候只能用
wparam&MK_CONTROL?
用&是为了取ML_CONTROL的那一个位。仅判断那个位是1,也就是说 只要按下了CONTROL键,可能是单按了CONTROL,也可能是CTRL+ALT、CTRL+SHIFT等等。VK是虚拟键值;ML是用来相应WM_KEYDOWN等消息的
单按control键:wparam==VK_CONTROL
含有control键的组合键:wparam==VK_CONTROL不成立,但wparam&MK_CONTROL成立
一个是按了单个按键,一个是一起按了多个键。这样就好理解。
用&是为了取ML_CONTROL的那一个位。仅判断那个位是1,也就是说 只要按下了CONTROL键,可能是单按了CONTROL,也可能是CTRL+ALT、CTRL+SHIFT等等。VK是虚拟键值;ML是用来相应WM_KEYDOWN等消息的
VK_LBUTTON 虚拟键码
Windows接收到键盘消息时(包括鼠标)
会发送一个数值给焦点窗口, 用来表示按下了哪一个键, 如果等于VK_LBUTTON, 就是指鼠标左键
MK_BUTTON 不清楚,
头文件注释是 - * Key State Masks for Mouse Messages
应该同VK_LBUTTON是一样的, 不过特指鼠标按键
二者的值是一样的 都是定义为 0x01, 从这点来看只是名字不同
用在键盘消息中,判断是否为 Ctrl 键的消息。
由于 WM_KEYDOWN/WM_KEYUP 一次只有一个键的消息,所以直接相等判断
if (wParam == VK_CONTROL)
用在鼠标消息中,判断鼠标点击时 Ctrl 的按下状态。
这时 wParam 是位标志,就需要按位判断。
比如你要响应 Ctrol+鼠标左键点击,那么再 WM_LBUTTONDOWN 消息中:
由于左键按下才会触发消息,所以不用判断 MK_LBUTTON 了,只要判断 MK_CONTROL 就行。
单是再此之前可能 Shift 是按下的、也可能右键是按下的,收到的 wParam 可能从 MK_LBUTTON | MK_CONTROL 到 MK_LBUTTON | MK_CONTROL | MK_SHIFT | MK_CONTROL 各种组合都有,相等判断不如位判断。
if (wParam & MK_CONTROL)
if ((wParam & MK_CONTROL) == MK_CONTROL)
要容易理解就用下面那一句。