在非模态对话框中,并不能响应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);
}
搞定!!!