1、概述
除了“整理收藏夹”和“添加到收藏夹”对话框外,还有其它一些对话框是我们希望直接通过WebBrowser调用的,比如“导入/导出”对话框,用一般的方法很难调用。IShellUIHelper尽管提供了ImportExportFavorites方法,但结果只是显示一个选择文件的对话框,且只能导入/导出收藏夹而不能对Cookies操作。
2、契机
MSDN中有一篇叫“WebBrowser Customization”的文章,其中介绍了通过IDocHostUIHandler.ShowContextMenu方法自定义WebBrowser上下文菜单的方法。
其原理是从“shdoclc.dll”的资源中创建菜单,作一些修改之后用TrackPopupMenu函数(注意在标志中包含TPM_RETURNCMD)将菜单弹出,然后把返回的Command ID发送给“Internet Explorer_Server”窗口进行处理。
| ...... // 显示菜单 int iSelection = ::TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, ppt->x, ppt->y, 0, hwnd, (RECT*)NULL); // 发送Command ID到外壳窗口 LRESULT lr = ::SendMessage(hwnd, WM_COMMAND, iSelection, NULL); ...... |
好,如果找到所有上下文菜单的Command ID,不就可以随时调用了?确实是这样的。
3、实现 用eXeScope之类应用程序资源探索器打开“shdoclc.dll”便可以在菜单资源下找到上下文菜单的设计,如下图:
我们要做的,就是将这些ID发送到“Internet Explorer_Server”窗口进行处理。问题是WebBrowser其实是一个OLE容器,我们使用的CHtmlView又是更外层的封装,他们的m_hWnd成员变量并不是IE窗口的句柄,如何找到我们需要的句柄呢?请看下面的图:
|