非模态对话框下的键盘响应

在非模态对话框中,并不能响应PreTranslateMessage事件,这让回车确认,或者按键响应其他消息极其纠结。

现在提供一种方法:钩子回调函数,可以解决这个问题:

1、声明hook变量:

HHOOK g_hSearchHook = NULL;

CDlgSearch *g_DlgSearch = NULL;


2、在OnInitDialog()中添加一行:

g_hSearchHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, NULL, GetCurrentThreadId());


3、在OnDestroy()中添加一行:

UnhookWindowsHookEx( g_hSearchHook );


4、实现函数GetMsgProc:

LRESULT FAR PASCAL GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    LPMSG lpMsg = (LPMSG)lParam; 
    if( nCode >= 0 && PM_REMOVE == wParam) 
    {
        if( (lpMsg-> message == WM_KEYDOWN)  && lpMsg->wParam == VK_RETURN ) 
        {

           if (::GetDlgCtrlID(lpMsg->hwnd) == IDC_EDIT_CODE 

               || ::GetDlgCtrlID(lpMsg->hwnd) == IDC_EDIT_TEXT_KEYWORD)

                //文本框ID:IDC_EDIT_CODE ,IDC_EDIT_TEXT_KEYWORD

             {

                   //按钮ID: IDC_BUTTON_SEARCH

                   PostMessage(g_DlgSearch->GetSafeHwnd(),
                                          WM_COMMAND,
                                          MAKEWPARAM(IDC_BUTTON_SEARCH, BN_CLICKED),
                                          (LPARAM)(GetDlgItem(g_DlgSearch->GetSafeHwnd(),IDC_BUTTON_SEARCH))); 
             }
        } 
     } 
     return CallNextHookEx(g_hSearchHook, nCode, wParam, lParam); 


搞定!!!

你可能感兴趣的:(C/C++)