获得webbrowser的编码菜单

来源:互联网 发布:深圳软件外包 编辑:程序博客网 时间:2024/05/19 22:28

获得webbrowser的编码菜单

msdn有篇文章教如何自定义webbrowser的右键菜单,名曰"WebBrowser Customization"
(http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/hosting/wbcustomization.asp)

看这段,IDocHostUIHandler::ShowContextMenu

有这么一句,这个是关键,可以获得的编码菜单的句柄
// Get the language submenu
hr = spCT->Exec(&CGID_ShellDocView, SHDVID_GETMIMECSETMENU, 0, NULL, &var);

var是什么? 是这个,CComVariant var
估计大概就是相当于vb的Variant,

然后它是这样获得菜单句柄的,
mii.hSubMenu = (HMENU) var.byref;

猜测vb中这样使用就行,var.byref,可惜不行,

于是猜想返回的是一个自定义类型,大概菜单就在某个地址上,经过测试,就在 varptr(var)+8上

下面是主要的vb代码,其中用到的库需要下载这个
http://www.mvps.org/emorcillo/download/vb6/tl_ole.zip
(引用页, http://www.mvps.org/emorcillo/en/code/vb6/wbframe.shtml)

Dim  t2
Dim tOle As IOleCommandTarget
Dim tGuid As olelib.UUID, tCtID As olelib.UUID, tOWId As olelib.UUID

Dim tUn As olelib.IUnknown

Dim iWin As IOleWindow

CLSIDFromString "{b722bccb-4e68-101b-a2bc-00aa00404770}", tCtID
CLSIDFromString "{00000114-0000-0000-C000-000000000046}", tOWId

Set tUn = WebBrowser1.object
tUn.QueryInterface tCtID, tOle

tUn.QueryInterface tOWId, iWin

CLSIDFromString CGIDSTR_ShellDocView, tGuid

tOle.Exec tGuid, 27, 0, Null, t2


Dim tlng&
'获取菜单句柄
CopyMemory tlng, ByVal VarPtr(t2) + 8, 4

Debug.Print tlng, IsMenu(tlng)
Dim tId&, tHwnd&


tHwnd = iWin.GetWindow
Dim tPop As New cPopMenu
tPop.Create tlng

tId = tPop.Popup2(iWin.GetWindow)
If tId <> 0 Then
    tHwnd = FindWindowEx(iWin.GetWindow, 0, "Shell DocObject View", "")
    tHwnd = FindWindowEx(tHwnd, 0, "Internet Explorer_Server", "")
    Debug.Print tHwnd
    PostMessage tHwnd, WM_COMMAND, tId, ByVal 0
End If


很乱,懒得修改了,其中cPopMenu是我写的一个菜单类,.Popup2的作用相当于TrackPopupMenu
最后PostMessage是让webbrowser响应改变(改变编码)

lingll 
lingll2001@21cn.com
lingll.yeah.net
2005-8-25

原创粉丝点击