VB实现webbroser的自动完成功能(即文本框的自动提示功能,纯VB实现)

目的:webbrowser控件打开的网页,在输入用户名的地方,历史曾经输入过的,则会自动下拉出历史记录。且热键可以用!

实现方式:用VB实现IDocHostUIHandler接口,在IDocHostUIHandler_GetHostInfo里面写pInfo.dwFlags=DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE

 

清除历史记录 命令   操作系统支持:Windows    所属类别:系统处理

清除指定类型的历史记录。成功返回真;失败返回假。

语法:  逻辑型  清除历史记录 ([历史记录类型])

 

可选的;整数型。历史记录类型,可以为以下常量值之一:0、#接口常量.浏览器历史地址记录;1、#接口常量.表单自动完成历史记录;2、#接口常量.自动密码历史记录;3、#接口常量.收藏夹;4、#接口常量.自动拨号历史记录;5、#接口常量.运行中的自动匹配历史记录;6、#接口常量.打开文档历史记录;7、#接口常量.网络连接历史记录;8、#接口常量.远程登录历史记录;9、#接口常量.浏览网址历史记录。

 

算是完美实现了。记录一下!

 

 

通常在VB6中使用接口的时候一般用类型库来完成。对于浏览器编程,主要使用olelib.tlb和olelib2.tlb两个文件。使用前,必须在项目中引用这两个文件。至于这两个文件去哪里下载,网络上去搜索吧,很容易找到。因为这里似乎不可以上传附件,要不然我直接复制上来好了,呵呵。

    现在就如何实现“自动完成表单”来简述如何实现接口。

    首先在声明区写上

Implements olelib.IDocHostUIHandler 'Document文档中的界面接口,处理与用户交互方面的问题

之后在代码编辑窗口的左上的下拉列表中即可看到 IDocHostUIHandler,选择这项之后,即可看到右上的下拉列表出现了该接口的全部方法。需要说明的是,在VB6中使用这些接口,除非你看到的接口方法写成了Function,否则在Sub中是无法做到真正的类似C语言中的Return的。也就是说,如果不做特殊处理,是没法准确返回一个什么值的。一般情况下,用类似Err.Raise E_NOTIMPL这样的来表示返回E_NOTIMPL。但是这和真正的返回还是有差别的。这一点,如果可能,将在以后的文章中介绍。但若接口方法中什么都不写,则表示返回S_OK!

至于该接口的各个方法的作用,在MSDN中有详细的介绍。限于篇幅和水平,就不做详细介绍了。代码大致如下:

Private Sub IDocHostUIHandler_EnableModeless(ByVal fEnable As olelib.BOOL)
    Err.Raise E_NOTIMPL
End Sub

Private Function IDocHostUIHandler_FilterDataObject(ByVal pDO As olelib.IDataObject) As olelib.IDataObject
    Err.Raise E_NOTIMPL
End Function

Private Function IDocHostUIHandler_GetDropTarget(ByVal pDropTarget As olelib.IDropTarget) As olelib.IDropTarget

End Function

Private Function IDocHostUIHandler_GetExternal() As Object
Set IDocHostUIHandler_GetExternal = Me
End Function

Private Sub IDocHostUIHandler_GetHostInfo(pInfo As olelib.DOCHOSTUIINFO)
'这里是设置自动完成的关键了.DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE就是自动完成
pInfo.dwFlags = DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE Or DOCHOSTUIFLAG_NO3DBORDER
pInfo.dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT
End Sub

Private Sub IDocHostUIHandler_GetOptionKeyPath(pOLESTRchKey As Long, ByVal dw As Long)
    Err.Raise E_NOTIMPL
End Sub

Private Sub IDocHostUIHandler_HideUI()
    Err.Raise E_NOTIMPL
End Sub

Private Sub IDocHostUIHandler_OnDocWindowActivate(ByVal fActivate As olelib.BOOL)
    Err.Raise E_NOTIMPL
End Sub

Private Sub IDocHostUIHandler_OnFrameWindowActivate(ByVal fActivate As olelib.BOOL)
    Err.Raise E_NOTIMPL
End Sub

Private Sub IDocHostUIHandler_ResizeBorder(prcBorder As olelib.RECT, ByVal pUIWindow As olelib.IOleInPlaceUIWindow, ByVal fRameWindow As olelib.BOOL)
    Err.Raise E_NOTIMPL
End Sub

Private Sub IDocHostUIHandler_ShowContextMenu(ByVal dwContext As olelib.ContextMenuTarget, pPOINT As olelib.POINT, ByVal pCommandTarget As olelib.IOleCommandTarget, ByVal HTMLTagElement As Object)
Err.Raise E_NOTIMPL
End Sub

Private Sub IDocHostUIHandler_ShowUI(ByVal dwID As Long, ByVal pActiveObject As olelib.IOleInPlaceActiveObject, ByVal pCommandTarget As olelib.IOleCommandTarget, ByVal pFrame As olelib.IOleInPlaceFrame, ByVal pDoc As olelib.IOleInPlaceUIWindow)
    Err.Raise E_NOTIMPL
End Sub

Private Sub IDocHostUIHandler_TranslateAccelerator(lpmsg As olelib.MSG, pguidCmdGroup As olelib.UUID, ByVal nCmdID As Long)
'这里还原了键盘消息,需要判断之后转发键盘消息。
   
End Sub

Private Function IDocHostUIHandler_TranslateUrl(ByVal dwTranslate As Long, ByVal pchURLIn As Long) As Long
    Err.Raise E_NOTIMPL
End Function

Private Sub IDocHostUIHandler_UpdateUI()
    Err.Raise E_NOTIMPL
End Sub

但到目前为止,这些代码并没机会执行。因为这个接口并没有与WebBrowser实现“连接”。

在Form_Load等地方,需要让WebBrowser实现“连接”。

Dim tMSG As olelib.MSG
Dim tRect As olelib.RECT

Dim objOleObject As IOleObject

Set objOleObject = WebBrowser1.Object

objOleObject.SetClientSite Me
objOleObject.DoVerb OLEIVERB_INPLACEACTIVATE, tMSG, Me, 0, Me.hwnd, tRect

这样,自动完成就基本可以工作了。然而革命的道路从来就不是平坦的,比如,你会发现,在WebBrowser打开的网页中,所有快捷键均失效了……。

这可怎么办呢?请听下回分解。

 

 

 

posted @ 2008-12-28 12:19  锐洋智能  阅读(1349)  评论(2编辑  收藏  举报