PreTranslateMessage和GetKeyState的一点理解:
MSDN上的:如果消息完全由PreTranslateMessage就返回非零值,并不再进一步处理.如果消息将以正常的方式处理,就返回零值.
当我新建一个基于对话框的工程,并加了OnkeyDown函数,再加如下代码想要实现Ctrl+left组合键,但没有任何反应.
if(nChar==VK_LEFT && ::GetKeyState(VK_CONTROL)<0)
{
MessageBox("left","test",MB_OK);
}
上网查了资料都是在PreTranslateMessage对消息进行判断,虽然最好的方法是在这里实现,但我比较喜欢尝试,想在这里实现.
网上都说在PreTranslateMessage实现,我就在我的工程中去看看PreTranslateMessage函数,当我查了MSDN后终于明白了,我的消息
全由默认的函数处理了,到OnkeyDown函数中就处理不了了,我把PreTranslateMessage函数改成下面的样子就可以了!
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
return 0;//CDialog::PreTranslateMessage(pMsg);
}
这里还有一个问题,关于GetKeyState的,查MSDN后知道它的返回值有三种状态的,有按下和弹起以及类似于大小写转键的触发态.
但在这里我们不用到触发态,按下返回负值,弹起返回正值,如果上面我们没有对GetKeyState的返回值判断正负:
当你第一次按左键时,也会弹出一个对话框,原因是GetKeyState返回非零值;
若你第一次按Ctrl+left时也会弹出对话框,但第二次不用按Ctrl只按左键也会弹出对话框,因为你那时已经触发了Ctrl键,再按一次
Ctrl+left;下次按left就不会弹出对话框了,那时Ctrl失效了!(这里是失效还是弹起分不清代,调试看它的返回值,应该是弹出,因为
按下Ctrl的值时它的值都在-127和-128两值变化,即最高位(the high-order bit)是1,最低位(the low-order bit)恒为1)
但感觉上还是失效,不然也不用第二次来恢复Ctrl的使用!!!!!!!
所以上面的GetKeyState必须判断返回值的正负!