Internet Explorer 编程简述(十三)调用IE隐藏的命令(续)

  
关键字: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、命令列表
 
总算功夫没有完全白费,经过多轮测试(费时费力不一定讨好的工作)之后找到了如下命令:
 
4.1 编码菜单和文字大小菜单
 
#define SHDVID_SHOWMIMECSETMENU    1
#define SHDVID_SHOWFONTSIZEMENU    50
 
想不到吧,传入命令ID = 1,编码菜单居然弹出来了!但有些问题,由于vtIn.vt = VT_EMPTY,所以菜单弹出点在屏幕左上角(0, 0),不过我们倒发挥发挥“猜”的功夫,怎么传入一个POINT呢?先试试把一个POINT的指针强制转换一下传进去,不行;再试试Win32程序设计的风格,两个坐标一个放高位,一个放低位拼成一个长整数,再以VT_I4传入,这次成功了。所以我们写出下面的函数:
 
nCmdID当然就是上面两个值,分别表示显示编码菜单和文字大小菜单。
 
HRESULT ShowShellDocViewMenu(LPDISPATCH lpDocDisp, POINT pt, UINT nCmdID)
{
    HRESULT hr 
=
 S_FALSE;
    IOleCommandTarget 
*
pct;
    
if ( lpDocDisp && SUCCEEDED(lpDocDisp->QueryInterface(IID_IOleCommandTarget, (void
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值