hook搜狗浏览器时,回调函数没有被调用,而同种方法hookIE就行的通?
我用了几种钩子类型(头2种, DEBUG,鼠标,鼠标LL)都试过了,都没有成功。请高手能告诉我为啥没成功的原因。
如果能提供怎么hook搜狗浏览器的方法就更感激不尽了。

解决方案 »

  1.   

    做了个例子通过。但我觉得搜狗浏览器有点怪。
    其他程序你只要hook其中一个线程窗口,其他窗口也会被hook,但搜狗不是这样。
    已hook搜狗的主窗口后,只能接收搜索栏和工具栏的消息。不能接收里面的主视图消息。
    需要再明确的获得主视图的窗口句柄,再hook就可以了。
    http://cid-3ba16e78a53d2d3d.office.live.com/self.aspx/VC/Hook-sogo-explorer.zip
      

  2.   

    多谢,分享,学到不少东西。不过,这个是搜狗的框架,搜狗的主视图另有进程,我就是主视图怎么都HOOK,都调用不到回调函数。
    主页面窗口层如下:
    SE_AxControl
    \Shell Embedding
    \Shell DocObject View
    \Internet Explorer_Server
    好像是一个标签一个进程。
    用SPY++明明能监视到,为啥用HOOK就到不了回调函数呢?是不是他也用钩子了,在链表最前面把我的截断了?
    求高手鉴定一下。
      

  3.   

    我给的例子里面用
    SetMouseHook(FindWindow(“搜狗窗口类名”,NULL) )
    hook框架你可以这样修改。
    找主窗口 HWND MainWnd= FindWindow(“搜狗窗口类名”,NULL)
    接着再找主窗口下的子窗口具有“Internet Explorer_Server”列名的那个就是主视图了。
    再调用  SetMouseHook( 主视图窗口句柄 ) 就可以了下面的函数也许有用。阿弥陀佛!/****************************************************************************
    寻找指定类名的子窗口句柄 方法一
    ****************************************************************************/
    static
    HWND FindWithClassName(HWND ParentWnd,const TCHAR* FindClassName)
    {
    HWND hChild = ::GetWindow(ParentWnd, GW_CHILD); TCHAR ClassName[100];
    for(; hChild!=NULL ; hChild=::GetWindow(hChild,GW_HWNDNEXT))
    {
    ::GetClassName(hChild,ClassName,sizeof(ClassName)/sizeof(TCHAR)); if (_tcscmp(ClassName,FindClassName)==0)
    return hChild;

    HWND FindWnd=FindWithClassName(hChild,FindClassName);
    if (FindWnd)
    return FindWnd;
    }
    return NULL;
    }/****************************************************************************
    获取主窗口下某个子窗口的窗口句柄
    参数1:最顶层父窗口
    参数2:控件ID,可使用spy++(VS2008版本) 查看
    ****************************************************************************/
    static
    HWND FindControlWnd(HWND ParentWnd,DWORD ControlID)
    {
    HWND hChild = ::GetWindow(ParentWnd, GW_CHILD); for(; hChild!=NULL ; hChild=::GetWindow(hChild,GW_HWNDNEXT))
    {
    //判断是否为需要的控件  
    if ( GetDlgCtrlID(hChild) == ControlID  )
    return hChild;   HWND FindWnd=FindControlWnd(hChild,ControlID);
    if (FindWnd)
    return FindWnd;
    }
    return NULL;
    }
      

  4.   

    谢谢你的代码,学习了怎么枚举窗口。
    我现在的问题好像不是hook不到搜狗的页面,而是hook成功后,并没有调用我得回调函数。困惑中。