?? 在組件中非模式propertysheet中出現(xiàn)tab鍵失效的解決辦法.txt
字號:
作者:茶館主人
日期:2001-6-3 20:57:30
在組件中非模式PropertySheet中出現(xiàn)Tab鍵失效的解決辦法
北京商即通數(shù)碼科技有限公司 張宏
有不少朋友在使用組件中使用非模式對話框或非模式屬性表中出現(xiàn)Tab鍵、光標鍵及其他熱鍵失效,TAB鍵不能夠讓光標在控件間移動光標,而在模式對話框中則正常。這種情況是不穩(wěn)定的,有時候出現(xiàn),有時候并不出現(xiàn),真讓人不解。
分析這個問題,原因是ActiveX控件本身沒有消息泵,而是由COM組件的客戶端(主程序)擁有,因此,鍵盤輸入消息被主程序攔截并未正常分發(fā)至COM組件的非模式對話框或者非模式PropertySheet。
解決的辦法是在自己派生的PropertySheet或者對話框類中安裝一個Windows的WH_GETMESSAGE消息鉤子,并且打開和處理鍵盤事件。
代碼如下:
1.定義一個公共變量
HHOOK hHook;
2.寫一個公共回調(diào)函數(shù)GetMsgProc處理鍵盤事件:
// 用消息鉤子解決非模式屬性表中的Tab鍵及其他熱鍵失效問題
// 鉤子處理器
LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// Switch the module state for the correct handle to be used.
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
// If this is a keystrokes message, translate it in controls'
// PreTranslateMessage().
LPMSG lpMsg = (LPMSG) lParam;
if( (nCode >= 0) &&
PM_REMOVE == wParam &&
(lpMsg->message >= WM_KEYFIRST && lpMsg->message <= WM_KEYLAST) &&
AfxGetApp()->PreTranslateMessage((LPMSG)lParam) )
{
// The value returned from this hookproc is ignored, and it cannot
// be used to tell Windows the message has been handled. To avoid
// further processing, convert the message to WM_NULL before
// returning.
lpMsg->message = WM_NULL;
lpMsg->lParam = 0L;
lpMsg->wParam = 0;
}
// Passes the hook information to the next hook procedure in
// the current hook chain.
return ::CallNextHookEx(hHook, nCode, wParam, lParam);
}
3. 在OnInitDialog函數(shù)中安裝鉤子
//安裝對鍵盤事件的鉤子
hHook = ::SetWindowsHookEx(
WH_GETMESSAGE,
GetMsgProc,
AfxGetInstanceHandle(),
GetCurrentThreadId());
ASSERT (hHook);
4. 在關(guān)閉對話框時OnClose取消鉤子
//取消鉤子
VERIFY (::UnhookWindowsHookEx (hHook));
現(xiàn)在,編譯程序,問題解決,Tab鍵能夠正常響應了。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -