关键字:CGID_ShellDocView
1、概述
在本系列五《调用IE隐藏的命令》中我们曾经从MSDN的一篇文章给出的ShowContextMenu范例入手,深入shdoclc.dll找到了藏于其中的浏览器上下文菜单资源,并以SendMessage发送WM_COMMAND消息到"Internet Explorer_Server"窗口以及其父窗口"Shell DocObject View"的方法完美实现了对“添加到收藏夹”对话框,“导入/导出向导”对话框等的调用,《自定义浏览器上下文菜单》和《完美的“编码”菜单》也运用了同样的技术。
这次,我们还是从ShowContextMenu范例入手,再次挖掘IE隐藏的命令——CGID_ShellDocView的命令。
2、原理
《完美的“编码”菜单》一文所用的技术,其关键在于从浏览器的文档接口查询得到IOleCommandTarget,进而调用CGID_ShellDocView命令组的命令CmdID_GetMimeSubMenu(27)实现将IE内置的编码菜单“拿来”使用。好了,既然CGID_ShellDocView是一个Command Group,那么CmdID_GetMimeSubMenu当然不会是惟一的一个,那为什么不尝试一下将其它可用的命令找出来呢。
3、找命令
先为我们的任务定一个目标:找到那些传入简单Variant参数就能得到可观察的效果或输出参数的命令ID。像CmdID_GetMimeSubMenu(27)这类输出参数需要转换为一个HMENU才有意义的命令,如果没有MSDN的文档,我们只怕打破脑袋也想不出其中的含义,所以这类命令不在目标范围之内。
下面的函数简单地实现了对CGID_ShellDocView命令组命令的调用。
HRESULT ExecShellDocViewCommand(LPDISPATCH lpDocDisp, UINT nCmdID)
...
{
HRESULT hr = S_FALSE;
IOleCommandTarget *pct;
if ( lpDocDisp && SUCCEEDED(lpDocDisp->QueryInterface(IID_IOleCommandTarget, (void **)&pct)))
...{
CComVariant vtIn;
vtIn.vt = VT_EMPTY;
CComVariant vtOut;
hr = pct->Exec(&CGID_ShellDocView, nCmdID, OLECMDEXECOPT_DONTPROMPTUSER, &vtIn, &vtOut);
pct->Release();
}
return hr;
}
4、命令列表
#define SHDVID_SHOWMIMECSETMENU 1
#define SHDVID_SHOWFONTSIZEMENU 50
nCmdID当然就是上面两个值,分别表示显示编码菜单和文字大小菜单。
HRESULT ShowShellDocViewMenu(LPDISPATCH lpDocDisp, POINT pt, UINT nCmdID)
...
{
HRESULT hr = S_FALSE;
IOleCommandTarget *pct;
if ( lpDocDisp && SUCCEEDED(lpDocDisp->QueryInterface(IID_IOleCommandTarget, (void **)&pct)))
...{
try
...{
CComVariant vtIn;
vtIn.vt = VT_I4;
vtIn.lVal = MAKELONG(pt.x, pt.y);
CComVariant vtOut;
hr = pct->Exec(&CGID_ShellDocView, nCmdID, OLECMDEXECOPT_DONTPROMPTUSER, &vtIn, &vtOut);
}
catch (...) ...{
}
pct->Release();
}
return hr;
}

HRESULT ShowMimeSetMenu(LPDISPATCH lpDocDisp, POINT pt)
...
{
return ShowShellDocViewMenu(lpDocDisp, pt, SHDVID_SHOWMIMECSETMENU);
}

HRESULT ShowFontSizeMenu(LPDISPATCH lpDocDisp, POINT pt)
...
{
return ShowShellDocViewMenu(lpDocDisp, pt, SHDVID_SHOWFONTSIZEMENU);
}
void CMainFrame::OnDropDown( NMHDR* pNotifyStruct, LRESULT*
pResult )
...
{
NMTOOLBAR* pNMToolBar = ( NMTOOLBAR* )pNotifyStruct;
CMenu menu;
CMenu* pPopup = 0;
CRect rc;
::SendMessage(pNMToolBar->hdr.hwndFrom, TB_GETRECT, pNMToolBar->iItem, (LPARAM)&rc);
rc.top = rc.bottom;
::ClientToScreen( pNMToolBar->hdr.hwndFrom, &rc.TopLeft() );
Cpoint pt(rc.left, rc.top);
LPDISPATCH lpDispatch = GetHtmlDocument();//获得文档指针
switch ( pNMToolBar->iItem )
...{
case ID_VIEW_ENCODE://“编码”按钮
ShowMimeSetMenu(lpDispatch, pt);
break;
case ID_VIEW_FONTSIZE://“文字大小”按钮
ShowFontSizeMenu(lpDispatch, pt);
break;
}
*pResult = TBDDRET_DEFAULT;
}
#define SHDVID_GETLOCATIONURL 20
#define SHDVID_GETCODEPAGE 23
Code Value(Codepage) Alphabet
=============================================================
DIN_66003
20106
IA5(German)
NS_4551
-
1
20108
IA5(Norwegian)
SEN_850200_B
20107
IA5(Swedish)
_autodetect
50932
Japanese(AutoSelect)
_autodetect_kr
50949
Korean(AutoSelect)
big5
950
ChineseTraditional(Big5)
csISO2022JP
50221
Japanese(JIS
-
Allow1byteKana)
euc
-
kr
51949
Korean(EUC)
gb2312
936
ChineseSimplified(GB2312)
hz
-
gb
-
2312
52936
ChineseSimplified(HZ)
ibm852
852
CentralEuropean(DOS)
ibm866
866
CyrillicAlphabet(DOS)
irv
20105
IA5(IRV)
iso
-
2022
-
jp
50220
Japanese(JIS)
iso
-
2022
-
jp
50222
Japanese(JIS
-
Allow1byteKana)
iso
-
2022
-
kr
50225
Korean(ISO)
iso
-
8859
-
1
1252
WesternAlphabet
iso
-
8859
-
1
28591
WesternAlphabet(ISO)
iso
-
8859
-
2
28592
CentralEuropeanAlphabet(ISO)
iso
-
8859
-
3
28593
Latin3Alphabet(ISO)
iso
-
8859
-
4
28594
BalticAlphabet(ISO)
iso
-
8859
-
5
28595
CyrillicAlphabet(ISO)
iso
-
8859
-
6
28596
ArabicAlphabet(ISO)
iso
-
8859
-
7
28597
GreekAlphabet(ISO)
iso
-
8859
-
8
28598
HebrewAlphabet(ISO)
koi8
-
r
20866
CyrillicAlphabet(KOI8
-
R)
ks_c_5601
949
Korean
shift
-
jis
932
Japanese(Shift
-
JIS)
unicode
1200
UniversalAlphabet
unicodeFEFF
1201
UniversalAlphabet(Big
-
Endian)
utf
-
7
65000
UniversalAlphabet(UTF
-
7
)
utf
-
8
65001
UniversalAlphabet(UTF
-
8
)
windows
-
1250
1250
CentralEuropeanAlphabet(Windows)
windows
-
1251
1251
CyrillicAlphabet(Windows)
windows
-
1252
1252
WesternAlphabet(Windows)
windows
-
1253
1253
GreekAlphabet(Windows)
windows
-
1254
1254
TurkishAlphabet
windows
-
1255
1255
HebrewAlphabet(Windows)
windows
-
1256
1256
ArabicAlphabet(Windows)
windows
-
1257
1257
BalticAlphabet(Windows)
windows
-
1258
1258
VietnameseAlphabet(Windows)
windows
-
874
874
Thai(Windows)
x
-
euc
51932
Japanese(EUC)
x
-
user
-
defined
50000
UserDefined
#define SHDVID_SSLSTATUS 33
4.5 安全区域设置对话框
#define SHDVID_ZONESTATUS 35
#define SHDVID_MANAGEADDONS 78
#define SHDVID_INFOBAND_DOWNLOADFILE 81
#define SHDVID_INFOBAND_PROTECTEDMODE 108
#define SHDVID_ZOOM 113
本文详细介绍了如何通过IE隐藏的CGID_ShellDocView命令组来调用IE内置的编码菜单、文字大小菜单、获取当前网页的LocationURL、文档当前的代码页等操作。并通过实例展示了如何将这些命令整合到自定义的上下文菜单中,实现如显示编码菜单、文字大小菜单、获取网页URL和代码页等功能。同时,还介绍了如何利用这些命令实现诸如显示站点证书对话框、安全区域设置对话框、管理加载项对话框等功能。
1万+

被折叠的 条评论
为什么被折叠?



