最近使用ATL建立了一個複合控件,想在其上面相應Delete的鍵盤消息,但發現直接響應WM_KEYDOWN消息竟然沒反應,事情是這樣的:
1.起初我直接添加消息WM_KEYDOWN的響應函數,鍵盤按下,此函數不響應。
2.無奈我又使用preTranslateMessage函數來攔截鍵盤消息,但隻有少部分按鍵(如功能鍵、空格鍵)可以響應。
3.随之我覺得使用鈎子一定可以,但效果還是沒有出來,鈎子沒有響應Delete按鍵的消息....
苦思冥想,,,不知道Wnd中發生了什麼事情,使得ActiveX中WM_KEYDOWN沒法響應。
4.後來我用了一個最土的方法,土炮....
我認為如果focus在按鈕或編輯框上,視窗一定會響應WM_KEYDOWN消息,抱着試一試的方法,在控件上添加了一個按鈕,并在初始化視窗的時候對其MoveToWindow(0,0,0,0)讓它看不見,并使用SetFocus對其進行focus,要確定你想要相應鍵盤消息的時候該按鈕處于focus狀态,簡單的你可以在OnPaint函數最後對其SetFocus,然後用鈎子捕獲鍵盤消息,呵呵,問題解決了。
5.在在在後來我發現可以使用SetWindowLong來改變視窗過程,我想這下可以響應鍵盤消息了吧,沒想到奇迹還是沒有出現。
如果哪位大師看到此文,并了解為什麼ActiveX不能直接響應WM_KEYDOWN消息的請指教,謝謝!