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打开的网页中,所有快捷键均失效了……。
这可怎么办呢?请听下回分解。