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必須判斷返回值的正負!