其他程序的一定都是经过windows的消息队列才被分发到某个
该接收这个消息的程序吗?如果存在某些消息是程序自身产生,我
用其他的程序在系统里作hook就没法拿到了,那如何作?
恳请高手赐教!

解决方案 »

  1.   

    前面没说清楚,抱歉.
    如果消息都是经过windows消息队列才被分发到某个
    该接收这个消息的程序里吗?
      

  2.   

    如果程序产生的是自定义消息或系统消息,当然能hook到
      

  3.   

    你说的没错,我没说清楚,抱歉
    鼠标移动产生mouse move消息,程序拿到消息后,检测此鼠标坐标在某控件
    里,某控件需要显示tooltip,显示tooltip的TTN_NEEDTEXT消息总不可能通过
    hook拿到吧? 都是个人猜想,错了别笑话!
      

  4.   

    是啊 没错
    做一个全局的钩子 必须再DLL中才能捕捉到系统的所有消息
      

  5.   

    这个可以根本不用钩子:直接处理就成
    //like
    BOOL CMyFormView::OnToolTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult );
    {
        TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
        UINT nID =pNMHDR->idFrom;
        if (pTTT->uFlags & TTF_IDISHWND)
        {
            // idFrom is actually the HWND of the tool
            nID = ::GetDlgCtrlID((HWND)nID);
            if(nID)
            {
                pTTT->lpszText = MAKEINTRESOURCE(nID);
                pTTT->hinst = AfxGetResourceHandle();
                return(TRUE);
            }
        }
        return(FALSE);
    }
      

  6.   

    TTN_NEEDTEXT根本就不是消息!!!
    你看一下MSDN吧。这个信息是由WM_NOTIFY产生的。
    不要以为所有的东西都是消息!!
      

  7.   

    楼上说得有道理。许多控件发给父窗口的通知消息并不是你看到的那种形式。比如按钮单击,你用MFC映射的时候看到的是BN_CLICK。其实按钮并没有发送一个BN_CLICK消息到父窗口,而是发送的一个WM_COMMAND。BN_CLICK不过是一个保存在wparam中的一个CommandID而已。
      

  8.   

    楼上的说的有道理,厉害,呵呵,佩服
    那我的问题如何能做到呢?
    我捕捉所以的WM_NOTIFY?然后分析某些WM_NOTIFY是我需要的,
    那里有足够引起TTN_NEEDTEXT的信息吗?还是只有简单
    信息,由处理此消息的程序来添加足够的信息来处理呢?问题我说的都累,哈哈.上面回答问题的同志们谢谢,你们一定都有
    分了
      

  9.   

    Hook是被镶嵌在GetMessage或PeekMessage API函数里的,当某个程序调用着两个API函数时,windows就会寻找已注册的Hook并调用。如果一个程序的消息不是通过这两个API函数获得的,而是别的途径,Hook就不再起作用了。应该说,所有的Windows消息都是通过消息队列分发的。但有的程序会直接调用某个窗口的处理过程,而不是报消息放到消息队列里,这样就不能hook了。
      

  10.   

    获得WM_NOTIFY消息以后,分析它的lparam指向的一个NMHDR结构。NMHDR的hwndFrom和idFrom分别指示了发送这个消息的控件的ID和窗口句柄。code成员应该就是TTN_NEEDTEXT了。
      

  11.   

    to merlin_jn(墨林) :
    你说“有的程序会直接调用某个窗口的处理过程”,这是对的。如果在线程内部用SendMessage发送消息,的确会这样。但这并不代表用钩子钩不到这个消息啊。你可以看看WH_CALLWNDPROC钩子,MSDN对这个钩子的钩子函数是这样解释的:The system calls this function whenever the thread calls the SendMessage。就是说这样发送的消息也是可能被钩到的。
      

  12.   

    to webber84(糕鱼昏):
    你说的很清楚了,我这就去试验一把,那我用下面那个类型的钩子?
    1.WH_CALLWNDPROC
    2.WH_CALLWNDPROCRET
    3.WH_CBT
    4.WH_GETMESSAGE
    5.WH_MSGFILTER
    6.WH_SYSMSGFILTER
    还有些一看就没法用的没写出来,6个钩子类型搞得我晕头晕脑的.呵呵
      

  13.   

    不用hook,能不能把其他应用程序的关闭按钮或最小化最大化按钮屏蔽掉??