WH_CALLWNDPROC截获到某个消息后,不发送给某个窗口,即直接过滤掉,
应该怎么写?

解决方案 »

  1.   

    我前天想学勾子,可碰到了模板问题,没学成,
    我昨天打算学勾子,可又碰到了ACitivX ,没学成,
    我唯一能做的就是帮你顶贴子
      

  2.   


    返回 0 ,消息会继续传递下去。必须返回 1return 1;
      

  3.   

    在钩子函数中LRESULT CALLBACK HoocPro(int nCode,WPARAM wParam,LPARAM lParam)
    {
      return 1;
    }
      

  4.   

    return 1,就不用CALLNEXTHOOK了.
      

  5.   


    我的代码如下:主要功能就是屏蔽外界发来的关闭消息。我return 1之后,窗口还是会被关闭。
    LRESULT CALLBACK MessageProc(int code,WPARAM wParam,LPARAM lParam)
    { PCWPSTRUCT pMsg = (PCWPSTRUCT)lParam;
    if (HC_ACTION == code)
    {
    if (pMsg->hwnd == g_hDlgWnd)
    {
    TRACE(_T("%u\r\n"),pMsg->message);
    switch(pMsg->message)
    {
    case WM_CLOSE:
    //case WM_DESTROY:
    if (InSendMessage())
    {
    AfxMessageBox(L"Invalid Close");
    return 1;
    }
    break;
    }
    }

    } return CallNextHookEx(g_hMsgHook,code,wParam,lParam);
    }BOOL HookCloseMessage()
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    g_hMsgHook = SetWindowsHookEx(WH_CALLWNDPROC,MessageProc,AfxGetInstanceHandle(),0); return g_hMsgHook == NULL ? FALSE : TRUE;
    }
      

  6.   

    MSDN原文:
    The CallWndProc hook procedure can examine the message, but it cannot modify it. After the hook procedure returns control to the system, the message is passed to the window procedure. 换句话说WM_CALLWNDPROC能监视消息,但是不能更改它,改成WH_GETMESSAGE钩子吧
      

  7.   


    我一开始就是试的WH_GETMESSAGE,但是问题是这个钩子截获不到WM_CLOSE消息
      

  8.   


    I tried
    但是WH_CBT没办法活得消息的详细信息,也就没办法判断消息是本身进程内发出的,还是其他发出的,所以也就没法达到我的目的了
      

  9.   

    首相 WH_CALLWNDPROC 截获的消息只用那些通过SendMessage的消息才可以监视到,像WM_LBUTTONDOWN是截获不到。
    楼主我给你个最完整的解答,要给我加分哦。 
      WH_CALLWNDPROC类型的钩子专门用来截获通过SendMessage()函数发送到窗口的消息,不管是系统内部调用的SendMessage()函数还是用户进程中调用的SendMessage()函数。SendMessage()把消息直接交给窗口过程WndProc()来处理,WndProc()处理完消息后SendMessage()函数才返回(return   resultValue;).如果设置了WH_CALLWNDPROC类型的钩子,则当SendMessage()把消息交给WndProc时,在WndProc尚未执行前,系统调用CallWndProc钩子函数,钩子函数执行后才执行窗口过程WndProc。 
      上面所说的“发送消息”与“寄送消息”相对应,发送消息是SendMessage(),寄送消息是PoseMessage(),PostMessage把消息发送到程序的消息队列,而不是直接交给窗口过程WndProc。寄送的消息由窗口过程WndProc自动到消息队列中去取,用GetMessage()函数。 
      一般来说,键盘消息与鼠标消息都是通过PostMessge函数寄送到程序消息队列中的,所以楼主不明白的地主就在这里了。