在最近的項目中,需要實現刷卡功能,其原理就是響應WM_KEYDOWN和WM_CHAR等鍵盤消息,需要重寫BOOL PreTranslateMessage(MSG* pMsg)函數來處理鍵盤消息;軟件啟動后,此時的鼠標焦點應該是不在在窗口上的,所以無論如何刷卡,都不能響應這兩個消息;查閱了很多資料,推測出可能是窗口上存在的控件截取了這兩個消息;這讓我很是無奈,試了很多方法,也無法響應此函數;於是我靈機一動,那么我在軟件啟動的時候把鼠標焦點設置在某個控件上,那么會不會響應該鍵盤消息呢?於是抱着試試的心態,不過,結果有點失望啊,不過我仍然不死心,我想是不是我的焦點並沒有設置成功的原因,上網了解了一下,原來是邏輯搞錯了,因為當窗口顯示的時候,在窗口彈出前通過SetFocus設置的焦點都會作廢,換句話說,我們需要在窗口完全顯示后,再去把焦點設置到指定控件上,
解決方案:
我是在窗口的void OnShowWindow(BOOL bShow, UINT nStatus)中為指定控件設置SetFocus(),另外我們還需要把對話框中的BOOL OnInitDialog()中最后那句return設置為"FALSE"