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

{
MessageBox("left","test",MB_OK);
}
上網(wǎng)查了資料都是在PreTranslateMessage對消息進行判斷,雖然最好的方法是在這里實現(xiàn),但我比較喜歡嘗試,想在這里實現(xiàn).
網(wǎng)上都說在PreTranslateMessage實現(xiàn),我就在我的工程中去看看PreTranslateMessage函數(shù),當我查了MSDN后終于明白了,我的消息
全由默認的函數(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);
}
這里還有一個問題,關(guān)于GetKeyState的,查MSDN后知道它的返回值有三種狀態(tài)的,有按下和彈起以及類似于大小寫轉(zhuǎn)鍵的觸發(fā)態(tài).
但在這里我們不用到觸發(fā)態(tài),按下返回負值,彈起返回正值,如果上面我們沒有對GetKeyState的返回值判斷正負:
當你第一次按左鍵時,也會彈出一個對話框,原因是GetKeyState返回非零值;
若你第一次按Ctrl+left時也會彈出對話框,但第二次不用按Ctrl只按左鍵也會彈出對話框,因為你那時已經(jīng)觸發(fā)了Ctrl鍵,再按一次
Ctrl+left;下次按left就不會彈出對話框了,那時Ctrl失效了!(這里是失效還是彈起分不清代,調(diào)試看它的返回值,應(yīng)該是彈出,因為
按下Ctrl的值時它的值都在-127和-128兩值變化,即最高位(the high-order bit)是1,最低位(the low-order bit)恒為1)
但感覺上還是失效,不然也不用第二次來恢復(fù)Ctrl的使用!!!!!!!
所以上面的GetKeyState必須判斷返回值的正負!