BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg){
但是WTL的CEdit其實不支持這類方式,WTL如果想在 PreTranslateMessage 里攔截消息,必須繼承 CMessageFilter 后還要把這個控件注冊到消息循環里才行,也就是必須寫子類 或從父窗口攔截這個CEdit的消息.
CMessageLoop* pLoop = _Module.GetMessageLoop();
ATLASSERT(pLoop != NULL);
pLoop->AddMessageFilter(this);
static WNDPROC OldWndProc = NULL;
static UiPreviewListDialog* gDialog = NULL;
static LRESULT CALLBACK NewEditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) // 該對話框新的窗口回調函數,過濾WM_KEYDOWN消息。
{
switch(message)
{
case WM_GETDLGCODE:
{
return (DLGC_WANTALLKEYS | CallWindowProc(OldWndProc, hWnd, message, wParam, lParam)); // 注意這里,否則沒有辦法捕獲Tab/方向鍵
}
case WM_KEYDOWN:
{
if(wParam == VK_RETURN)
{
std::cout << "Enter: " << std::endl;
BOOL handle;
gDialog->OnSearch(message,wParam,hWnd,handle);
}
}
break;
default:
break;
}
return CallWindowProc(OldWndProc, hWnd, message, wParam, lParam);
}
gDialog = this;
OldWndProc = (WNDPROC)edit_.SetWindowLong(GWL_WNDPROC, (LONG)NewEditProc);
參考:
CEdit中對回車鍵的響應
SetWindowLong function
CallWindowProc