前面已经有人问过,通过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的钩子?

解决方案 »

  1.   

    几个特殊键(方向、回车、退格)不能这样处理。Browser对象支持IOleInPlaceActiveObject接口,使用它的TranslateAccelerator方法来处理。
      

  2.   

    假设你是用的导入的控件,名字是m_Browser(用其它的也一样,总能拿到Application的)
    以下代码模拟向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);
      

  3.   

    纠正一下,CComPtr<IDispatch> pApp(m_Browser.get_Application());
    这种写法图简便,其实是不对的,实际应用中应当在最后对get_Application()的接口进行Release
      

  4.   

    CEdit重载OnKeyDown函数中添加

    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);
    }
    }
      

  5.   

    //钩子函数
    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); 
    }
      

  6.   

    其中的hEditHandle 为CEdit控件对象的HWND
      

  7.   

    superarhow(苏泊尔耗) 你给的代码是不是去触发 浏览器的 退格键?我现在需要的是让浏览器把退格键被触发的消息传导到CEdit控件。