PreTranslateMessage和GetKeyState的一點(diǎn)理解:
MSDN上的:如果消息完全由PreTranslateMessage就返回非零值,并不再進(jìn)一步處理.如果消息將以正常的方式處理,就返回零值.
當(dāng)我新建一個(gè)基于對話框的工程,并加了OnkeyDown函數(shù),再加如下代碼想要實(shí)現(xiàn)Ctrl+left組合鍵,但沒有任何反應(yīng).
if(nChar==VK_LEFT && ::GetKeyState(VK_CONTROL)<0)

{
MessageBox("left","test",MB_OK);
}
上網(wǎng)查了資料都是在PreTranslateMessage對消息進(jìn)行判斷,雖然最好的方法是在這里實(shí)現(xiàn),但我比較喜歡嘗試,想在這里實(shí)現(xiàn).
網(wǎng)上都說在PreTranslateMessage實(shí)現(xiàn),我就在我的工程中去看看PreTranslateMessage函數(shù),當(dāng)我查了MSDN后終于明白了,我的消息
全由默認(rèn)的函數(shù)處理了,到OnkeyDown函數(shù)中就處理不了了,我把PreTranslateMessage函數(shù)改成下面的樣子就可以了!
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)


{
// TODO: Add your specialized code here and/or call the base class
return 0;//CDialog::PreTranslateMessage(pMsg);
}
這里還有一個(gè)問題,關(guān)于GetKeyState的,查MSDN后知道它的返回值有三種狀態(tài)的,有按下和彈起以及類似于大小寫轉(zhuǎn)鍵的觸發(fā)態(tài).
但在這里我們不用到觸發(fā)態(tài),按下返回負(fù)值,彈起返回正值,如果上面我們沒有對GetKeyState的返回值判斷正負(fù):
當(dāng)你第一次按左鍵時(shí),也會(huì)彈出一個(gè)對話框,原因是GetKeyState返回非零值;
若你第一次按Ctrl+left時(shí)也會(huì)彈出對話框,但第二次不用按Ctrl只按左鍵也會(huì)彈出對話框,因?yàn)槟隳菚r(shí)已經(jīng)觸發(fā)了Ctrl鍵,再按一次
Ctrl+left;下次按left就不會(huì)彈出對話框了,那時(shí)Ctrl失效了!(這里是失效還是彈起分不清代,調(diào)試看它的返回值,應(yīng)該是彈出,因?yàn)?br>按下Ctrl的值時(shí)它的值都在-127和-128兩值變化,即最高位(the high-order bit)是1,最低位(the low-order bit)恒為1)
但感覺上還是失效,不然也不用第二次來恢復(fù)Ctrl的使用!!!!!!!
所以上面的GetKeyState必須判斷返回值的正負(fù)!