前面已经有人问过,通过hook拦截系统消息的方法获得退格,删除键的消息
http://community.csdn.net/Expert/topic/4981/4981009.xml?temp=.7123987我试了一下,能拦截到消息,但是拦截到消息后,该怎么让CEdit进行处理就不懂了。
我现在的做法是将消息转发给CEdit控件,但是发现还是删除不了文字。if (lpMsg->message == WM_KEYUP && lpMsg->wParam == VK_BACK)
{
if (pMenuBar != NULL)
{
if (pMenuBar->m_edit.IsDialogMessage(lpMsg) == TRUE)
{
//AfxMessageBox("back"); // 这里有响应
//pMenuBar->m_edit.SendMessage(lpMsg->message, lpMsg->wParam, lpMsg->lParam);
SendMessage(pMenuBar->m_edit.m_hWnd, lpMsg->message, lpMsg->wParam, lpMsg->lParam);
}
}
}
还有一个问题,就是我应该在什么时候释放这个hook的钩子?
http://community.csdn.net/Expert/topic/4981/4981009.xml?temp=.7123987我试了一下,能拦截到消息,但是拦截到消息后,该怎么让CEdit进行处理就不懂了。
我现在的做法是将消息转发给CEdit控件,但是发现还是删除不了文字。if (lpMsg->message == WM_KEYUP && lpMsg->wParam == VK_BACK)
{
if (pMenuBar != NULL)
{
if (pMenuBar->m_edit.IsDialogMessage(lpMsg) == TRUE)
{
//AfxMessageBox("back"); // 这里有响应
//pMenuBar->m_edit.SendMessage(lpMsg->message, lpMsg->wParam, lpMsg->lParam);
SendMessage(pMenuBar->m_edit.m_hWnd, lpMsg->message, lpMsg->wParam, lpMsg->lParam);
}
}
}
还有一个问题,就是我应该在什么时候释放这个hook的钩子?
以下代码模拟向browser送退格键:
m_Browser.SetFocus(); /* 这一句可以不需要,我是在BtnClick事件里写的,焦点不在Browser上,所以强行设置了一下 */
CComPtr<IDispatch> pApp(m_Browser.get_Application());
CComQIPtr<IOleInPlaceActiveObject> pObj(pApp);
MSG msg;
msg.hwnd = m_hWnd;
msg.message = WM_KEYDOWN;
msg.wParam = VK_BACK;
msg.lParam = 0;
msg.time = GetTickCount();
msg.pt.x = msg.pt.y = 0;
pObj->TranslateAccelerator(&msg);
这种写法图简便,其实是不对的,实际应用中应当在最后对get_Application()的接口进行Release
if(nChar == VK_BACK)
{
int nStart,nEnd;
GetSel(nStart,nEnd);
if(nStart != nEnd)
{
CString sContext;
GetWindowText(sContext);
ReplaceSel("",TRUE);
}
else
{
SetSel(nStart-1,nEnd);
ReplaceSel("",TRUE);
}
}
LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0) // do not process message
return CallNextHookEx(hhook, nCode,
wParam, lParam);
PMSG pMsg = (PMSG) lParam;
if(pMsg->hwnd == hEditHandle)
{
if(pMsg->message == WM_KEYDOWN )
{
if(pMsg->wParam == VK_BACK
|| (pMsg->wParam > VK_NEXT && pMsg->wParam < VK_DOWN))
{
msg = *pMsg;
LRESULT lr = ::SendMessage(msg.hwnd,msg.message,msg.wParam,msg.lParam);
}
}
}
return CallNextHookEx(hhook, nCode,
wParam, lParam);
}