Hook DHTML Commands
浏览器在执行很多命令之前都会允许容器来替换默认的处理。在执行一些默认的命令之前,系统会查询用户对IDocHostUIHandler的实现对象的IOleCommandTarget接口,调用默认(NULL)或者CGID_DocHostCommandHandler命令组的命令。如果容器的对应命令处理返回S_OK。那么默认的处理就不会被调用。
下面列出一些可以在容器中自定义的操作:(这些常量的定义位于docobj.h中)
- OLECMDID_PRINT,默认命令组
- OLECMDID_SHOWSCRIPTERROR, CGID_DocHostCommandHandler命令组
- OLECMDID_FOCUSVIEWCONTROLSQUERY, CGID_DocHostCommandHandler命令组
- OLECMDID_SHOWPAGEACTIONMENU, CGID_DocHostCommandHandler命令组
MFC提供了一些比较容易扩展的类和宏,这样可以很容易地在扩展容器来实现新的接口。这里使用CCmdTarget类提供的GetInterfaceHook虚函数来进行扩展。
浏览器控件访问容器的方式是查询容器的IDocHostUIHandler接口,而对于浏览器辅助对象(Browser Helper Object/ BHO),不能修改容器来增加一个新的接口。这时候可以通过HTML文档的ICustomDoc接口来设置自己的IDocHostUIHandler接口。
在捕获容器的命令的过程中发现一些其他命令也被发送到容器(按时间顺序):
行为 | 命令组 | 命令 |
加载 | NULL | OLECMDID_SETDOWNLOADSTATE |
000214D0-0000-0000-C000-000000000046 | OLECMDID_PASTESPECIAL/ OLECMDID_HIDETOOLBARS / OLECMDID_PREREFRESH/ OLECMDID_ONUNLOAD | |
NULL | OLECMDID_SETPROGRESSMAX/ OLECMDID_SETPROGRESSPOS/ OLECMDID_SETDOWNLOADSTATE | |
打印 | CGID_DocHostCommandHandler | OLECMDID_PRINT |
刷新 | CGID_DocHostCommandHandler | 0x1799 |
NULL | OLECMDID_PREREFRESH/ OLECMDID_SETPROGRESSMAX/ OLECMDID_SETPROGRESSPOS/ OLECMDID_SETDOWNLOADSTATE | |
000214D0-0000-0000-C000-000000000046
| OLECMDID_ONUNLOAD/ OLECMDID_PREREFRESH |
不是所有常用操作都会转发到容器。OLECMDID_PRINTPREVIEW、OLECMDID_SAVEAS、OLECMDID_REFRESH看起来就没有被转发。
参考文档:
- MSDN文章 MFC技术文档TN038 MFC/OLE IUnknown Implementation (http://msdn.microsoft.com/library/en-us/vclib/html/_mfcnotes_tn038.asp)
- 微软知识库文章 Q261003 How to handle script errors as a WebBrowser control host (http://support.microsoft.com/kb/261003)
- 微软知识库文章 Q317024 Script error notification is not sent to Exec method of WebBrowser Host(http://support.microsoft.com/kb/317024)
- MSDN文章 WebBrowser Customization (http://msdn.microsoft.com/workshop/browser/hosting/wbcustomization.asp)
- 微软知识库文章 Q267240 How to print custom headers and footers for a WebBrowser control in Internet Explorer (http://support.microsoft.com/kb/267240)
Visual Studio 2005 June CTP的资源编辑器似乎有点问题,改过资源就保存不到原文件了,只能保存到另一个文件,关闭Visual Stuio之后替换(关闭solution都不行)。
No comments:
Post a Comment