如何拦截Windows的消息并加以修改?
用Hook可拦截得消息,但不能更改,如SetWindowsHookEx(WH_CALLWNDPROC,HookProc,hDll,0);,拦WM_CLOSE的消息,我不想让系统处理这一条消我把 HookProc 的 lParam->message= WM_NULL 或 HookProc 中 return TRUE;都不行?各位高手有什么办法拦截Windows的消息并加以修改?分数不够再加。谢谢

解决方案 »

  1.   

    把指定窗口子类化,在子类化设置的SubclassProc中间判断消息,并直接返回。
      

  2.   

    see this,maybe help you.
    http://www.csdn.net/expert/topic/1046/1046911.xml?temp=.7596857
      

  3.   

    重载DefWindowProc,在里面进行拦截:
    LRESULT CDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    // TODO: Add your specialized code here and/or call the base class
             if( message == WM_CLOSE ) return TRUE; //不处理
             if( message == WM_OLDMSG ) //加以修改
             {
                 message = WM_NEWMSG;
             }
    return CDialog::DefWindowProc(message, wParam, lParam);
    }
      

  4.   

    你还可以在PreTranslateMessage(MSG* pMsg)进行拦截处理。
      

  5.   

    我指的是所有窗口?
    PreTranslateMessage(MSG* pMsg)
    LRESULT CDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    // TODO: Add your specialized code here and/or call the base class
             if( message == WM_CLOSE ) return TRUE; //不处理
             if( message == WM_OLDMSG ) //加以修改
             {
                 message = WM_NEWMSG;
             }
    return CDialog::DefWindowProc(message, wParam, lParam);
    }肯定没有用的。
      

  6.   

    如果是所有窗口的话,你只有通过hook API的方法,挂接GetMessage和 PeekMessage函数,通过判断函数所传递的消息进行拦截和修改了。
      

  7.   

    use WH_GETMESSAGE  can hook and change message,but not WH_CALLWNDPROC
      

  8.   

    方法1:修改窗口过程
    LRESULT CALLBACK _new_msg_handle(
    HWND hwnd,      // handle to window
    UINT uMsg,      // message identifier
    WPARAM wParam,  // first message parameter
    LPARAM lParam   // second message parameter
    )
    {
    LRESULT lReturn = 0;
    WORD hw, lw;
    NODE *pnode; pnode = (NODE *)GetWindowLong(hwnd, GWL_USERDATA);
    hw = HIWORD(wParam);
    lw = LOWORD(wParam);
    if(uMsg==WM_COMMAND)
    {
    // print_log("hwnd recv msg hw = %u, lw = %u\r\n", hw, lw);
    if(hw == BN_CLICKED)
    {
    if(lw == IDOK)
    {
    pnode->bsendrecord = TRUE;
    // print_log("hwnd recv msg BN_CLICKED -> IDOK\r\n");
    }//if(lw == IDOK)
    else if(lw == 0x65)
    {
    if(pnode->flag == RECV)
    {
    log_chat(hwnd, FALSE);
    }
    }
    }//else if (hw == BN_CLICKED)
    }//if(uMsg==WM_COMMAND) if(pnode->oldfunc)
    lReturn = ::CallWindowProc(pnode->oldfunc, hwnd, uMsg, wParam, lParam);
    return lReturn;
    }//以下代码修改窗口过程
    SetWindowLong(hWnd, GWL_USERDATA, (LONG)pnode);
    SetWindowLong(hWnd, GWL_WNDPROC,  (LONG)_new_msg_handle);
    方法2、钩Api函数,如果是你要的消息,直接修改我用上面的办法写了一个东东,监视QQ聊天过程,前段时间在这里公开了大部分代码,过几天写点东西并帖出来