本人在用VB开发BHO,接口做了。部分功能也实现了。但是出现一个问题,
这个功能是:判断地址栏的地址是不是有效的。要是没效就跳到指定网站。
我的实现方法:ping网址,ping的通的就是有效网站。不通就跳到指定网站。
出现的问题:单一个插件的时候就没有问题。但是有别的插件时。
我软件的速度就没有别的插件快。所以就实现不了现在我是想到还没有实现的办法:在这里问大家。做好后本人将源码供出!
现在想到的办法是:利用hook判定在ie里输入的回车,只要能判定这个,就可以比别的快!或者那位有更高的办法。浏览者请帮忙顶贴!忽略了ping过程!Private WithEvents cPing As cPingImplements olelib.IObjectWithSite
Private WithEvents m_objIE As InternetExplorerPrivate Sub IObjectWithSite_GetSite(riid As UUID, ppvSite As IUnknown)
Dim objUnk As olelib.IUnknown '获得m_objIE IUnkown接口
Set objUnk = m_objIE '返回所需要的接口
objUnk.QueryInterface riid, ppvSite
End Sub
Private Sub IObjectWithSite_SetSite(ByVal pUnkSite As IUnknown) '获得IE接口
Set m_objIE = pUnkSite
End SubPrivate Sub m_objIE_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
  Dim tmp As String
  Dim GoUrl As String
  Dim IEpath As String
  Dim str As String
  
  Set cPing = New cPing
  
    IEpath = URL
    
    If URL = "about:blank" Then Exit Sub    IEpath = Mid(IEpath, 8, Len(IEpath))
        
        If InStr(IEpath, "/") <> 0 Then
            IEpath = Mid(IEpath, 1, InStr(IEpath, "/") - 1)
        End If
    
    Debug.Print IEpath    str = cPing.funcGetIPFromHostName(IEpath)
    If str = "" Then
       
          Debug.Print "主机名不能被解释"
          m_objIE.Stop
          tmp = IEpath
          GoUrl = "http://www.baidu.com/s?tn=270431700_pg&wd=" + tmp
          m_objIE.Navigate2 GoUrl
          Exit Sub
    Else
       Debug.Print str
    End If
    
      Set cPing = Nothing
End Sub本人网站[恶魔界也有很多好源码]

解决方案 »

  1.   

    出现的问题:单一个插件的时候就没有问题。但是有别的插件时。 人家用的好像也是hook地址栏的回车,就直接跳到了
      

  2.   

    出现的问题:单一个插件的时候就没有问题。但是有别的插件时。 人家的好像也是hook
      

  3.   

    你到底想做什么东西?具体达到什么效果?目的是什么?
    是那种监视浏览器将访问的地址是否有效的程序吗?如果目标地址无效就自动转向的BHO插件?你所说的“别的插件”是什么插件?具体的是什么?因为很多程序只能做到相对的,不会有绝对的事。你所说的“ping的通的就是有效网站”会不会太偏激?
    据我所知,能不能Ping通一个地址并不能判断那个地址的网站是否有效。
    就我弄过的几台服务器我都拦截了ICMP,所以Ping是Ping不通的,但网页是正常的。
    如果是判断网页,最好直接使用HTTP协议要个头来看看就能判断了。
      

  4.   

    就如何hook在IE地址栏的回车,
    能给个例子么。。万分感谢····
    本人网站[恶魔界也有很多好源码]
      

  5.   

    既然是BHO,能得到IE对象是肯定的,通过IE对象取得窗口句柄hWnd也是完全可以的。
    通过窗口句柄枚举出所有的子窗口句柄可以用API函数GetWindow来实现,然后通过
    GetClassName和GetWindowText取得子窗口的类名或标题来判断是不是你要处理的对
    象,当确定某个子窗口句柄后就可以开始HOOK了。
    HOOK相关的函数有
    GetWindowLong
    SetWindowLong
    CallWindowProc
    关键字:
    GWL_WNDPROC
    GWL_USERDATAWM_KEYDOWN
    WM_KEYUP
      

  6.   

    要判断一个网址是否有效,PING确实没用....如果某个站禁止PING咋办?应该直接发送一个GET请求,然后判断返回内容如果是超时或404之类返回值,那就是无法访问的.其中超时是需要时间....去等...