版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Internet Explorer编程简述(一)一直对Microsoft Internet Explorer编程非常感兴趣,曾花了不少时间琢磨,也与众多网友讨论过问题,2000年将心得写成一篇TWebBrowser编程简述,发表在自己的个人主页“阿甘的家”上,得到了不少网友的回应,也被许多网站转载。此后相当长的时间内不断回答网友的提问,收获良多。其间正是多窗口浏览器全面开花的日子,无奈手头事情太多,我的作品Multiple iExplorer也一直未能问世,至今遗憾。后来常与GoSurf的作者交流学习,替他解决了不少问题,也从他那里学到许多。如今GoSurf有了比较固定的用户群,有我一份功劳,
2、算是一种安慰吧,他也一度在GoSurf官方主页上将我列为核心技术支持,但我后来因为工作和学习的关系很少再和他联系,实在惭愧。回头再看当时的文章,错误实在不少,认识也比较浅薄,有些问题更是一直没有得到解决,所以我觉得有必要在前文的基础上,花点时间将我积累的关于Internet Explorer编程的问题比较完整地写出来,希望对自己有个交代,对大家有一些帮助。是为序。Internet Explorer编程简述(一)WebBrowser还是WebBrowser_V1你的机器上总是存在着“两”个WebBrowser,一个叫WebBrowser,另一个叫WebBrowser_V1,其CLASSID如下:
3、CLASS_WebBrowser: TGUID = 8856F961-340A-11D0-A96B-00C04FD705A2;CLASS_WebBrowser_V1: TGUID = EAB22AC3-30C1-11CF-A7EB-0000C05BAE0B;它们分别对应的接口是IWebBrowser2和IWebBrowser。问题是我们该用哪一个呢?按照微软的推荐,应该尽量使用前者,因为后者是为兼容Internet Explorer 3.x而保留的(尽管它能够响应来自Internet Explorer 3.x、4.x、5.x、6.x的事件),相应的IWebBrowser和IWebBrowser
4、App接口也应抛弃。由于Internet Explorer 3.x年代久远,导致WebBrowser_V1提供的事件少得可怜,但值得一提的是它提供的两个事件OnNewWindow和OnFrameBeforeNavigate有着与OnBeforeNavigate几乎相同的参数:OnBeforeNavigate(BSTR URL, long Flags, BSTR TargetFrameName, VARIANT* PostData, BSTR Headers, BOOL FAR* Cancel)OnNewWindow(BSTR URL, long Flags, BSTR TargetFrameN
5、ame, VARIANT* PostData, BSTR Headers, BOOL FAR* Processed)OnFrameBeforeNavigate(BSTR URL, long Flags, BSTR TargetFrameName, VARIANT* PostData, BSTR Headers, BOOL FAR* Cancel)所以使用WebBrowser_V1使得我们的浏览器在有新窗口打开时能够轻易捕捉到其URL及相关的数据,如果将Processed设置为TRUE,则可取消新窗口的弹出。同样,处理Frame也比在WebBrowser中来得容易。但WebBrowser_V1的
6、致命弱点是它不支持高级接口,如IDocHostUIHandler,即便我们实现了IDocHostUIHandler接口,也不会被WebBrowser_V1调用。所以希望在自己的浏览器中实现XP的界面主题、扩展IE的DOM(Document Object Model)等高级控制的话,就肯定不能选择WebBrowser_V1了。处理新窗口实在是很麻烦的一件事,不知道微软为什么在新版本的OnNewWindow2事件中去掉了URL这样的参数,而且OnNewWindow2事件不能完全捕捉到所有的新窗口打开。但如果安装了Windows XP SP2的话,好处又回来了。Windows XP SP2对Inte
7、rnet Explorer 6作了升级,并且提供了一个新的事件OnNewWindow3,它在OnNewWindow2事件之前发生,也包含了让我们能够加以过滤处理的新窗口的URL等参数,再加上INewWindowManager接口,就是实现Windows XP SP2中过滤广告窗口功能的基础。Internet Explorer编程简述(二)Internet Explorer 编程简述(二)在IE中编辑OLE嵌入文档除了打开Internet上的网页,Internet Explorer还能够浏览本地文件夹及文件。如果浏览的是PDF文档或Office文档,有时候你会发现当调用Navigate(xxx.
8、doc)的时候,Adobe Reader/Acrobat或Office等Document Servers会在IE中嵌入自己的一个实例以打开相应的文件,当然有时候也会在独立的Acrobat或Office窗口中打开文件。 在Adobe Reader/Acrobat的属性设置窗口中,我们可以找到“Display PDF in browser”的选项,如果勾上,则Navigate(xxx.pdf)将会以嵌入的方式在IE中浏览PDF文件,否则在独立的Adobe Reader/Acrobat窗口中浏览。但在Office的“选项”对话框中我们找不到这样的设置。问题:如何在自己的浏览器中控制Office这类O
9、le Servers的打开方式?答案:修改文件夹选项,或修改注册表。方法1、如下所示,从控制面板中打开“文件夹”选项,在“文件类型”属性页上找到相应的文件后缀名,如“DOC”,点击“高级”按钮,在弹出的“编辑文件类型”对话框中有“在同一窗口中浏览”的选项,如果勾上,则以嵌入IE的方式打开文档,否则在独立窗口中打开。方法2、直接修改注册表。在“HKEY_LOCAL_MACHINESOFTWAREClasses”键值下,保存了各种文件类型的注册信息,以Office文档为例,与文档相关键值如下。文档类型 键值Microsoft Excel 7.0 worksheet Excel.Sheet.5Mic
10、rosoft Excel 97 worksheet Excel.Sheet.8Microsoft Excel 2000 worksheet Excel.Sheet.8Microsoft Word 7.0 document Word.Document.6Microsoft Word 97 document Word.Document.8Microsoft Word 2000 document Word.Document.8Microsoft Project 98 project MSProject.Project.8Microsoft PowerPoint 2000 document Power
11、Point.Show.8如果我们要修改Word文档的打开方式,则在“HKEY_LOCAL_MACHINESOFTWAREClassesWord.Document.8”下新建一个名为“BrowserFlags”,类型为“REG_DWORD”的子键值,如果设置其值为“8”,则在独立的窗口中打开Word文档,否则在嵌入IE的Word窗口中打开文档。注:Microsoft Excel 7.0 worksheet稍有不同,应设置BrowserFlags的值为“9”方可在独立的窗口中打开文档。参考资料:MSDN:259970:In-Place Activating Document Servers in
12、Internet ExplorerMSDN:162059:How to configure Internet Explorer to open Office documents in the appropriate Office program instead of in Internet Explorer Internet Explorer编程简述(三)关于Internet Explorer的收藏夹,比较常见的两个问题就是调用“整理收藏夹”对话框和“添加到收藏夹”对话框。调用的方法有多种,但其中还是有些值得讨论的地方。关键字:添加到收藏夹,整理收藏夹,DoAddToFavDlg, DoOrg
13、anizeFavDlg1、整理收藏夹调用“整理收藏夹”对话框(如下),基本上来说都用的是同一个方法,即调用“shdocvw.dll”中的“DoOrganizeFavDlg”函数,把父窗口句柄和收藏夹路径作为参数传入即可。2、代码代码实例如下所示,值得注意的是对“shdocvw.dll”的处理,为避免重复调用,应该先检查其是否已经在内存中。void CMyHtmlView:OnFavOrganizefav()typedef UINT (CALLBACK* LPFNORGFAV)(HWND, LPTSTR);bool bResult = false;HMODULE hMod = :GetModul
14、eHandle( _T(shdocvw.dll) );if (hMod = NULL)/如果shdocvw.dll尚未载入则载入之hMod = :LoadLibrary( _T(shdocvw.dll) );if (hMod = NULL)MessageBox( _T(The dynamic link library ShDocVw.DLL cannot be found.),_T(Error), MB_OK | MB_ICONSTOP );return;LPFNORGFAV lpfnDoOrganizeFavDlg = (LPFNORGFAV):GetProcAddress( hMod, D
15、oOrganizeFavDlg );if (lpfnDoOrganizeFavDlg = NULL)MessageBox( _T(The entry point DoOrganizeFavDlg cannot be foundn)_T(in the dynamic link library ShDocVw.DLL.),_T(Error), MB_OK | MB_ICONSTOP );return;TCHAR szPath MAX_PATH ;HRESULT hr;hr = :SHGetSpecialFolderPath( m_hWnd, szPath, CSIDL_FAVORITES, TRU
16、E );if (FAILED(hr)MessageBox( _T(The path of the Favorites folder cannot be found.),_T(Error), MB_OK | MB_ICONSTOP );return;bResult = (*lpfnDoOrganizeFavDlg) ( m_hWnd, szPath ) ? true : false;:FreeLibrary( hMod );else/如果shdocvw.dll已经在调用者进程的地址空间中则直接使用。LPFNORGFAV lpfnDoOrganizeFavDlg = (LPFNORGFAV):Ge
17、tProcAddress( hMod, DoOrganizeFavDlg );if (lpfnDoOrganizeFavDlg = NULL)MessageBox( _T(The entry point DoOrganizeFavDlg cannot be foundn)_T(in the dynamic link library ShDocVw.DLL.),_T(Error), MB_OK | MB_ICONSTOP );return;TCHAR szPath MAX_PATH ;HRESULT hr;hr = :SHGetSpecialFolderPath( m_hWnd, szPath,
18、 CSIDL_FAVORITES, TRUE );if (FAILED(hr)MessageBox( _T(The path of the Favorites folder cannot be found.),_T(Error), MB_OK | MB_ICONSTOP );return;bResult = (*lpfnDoOrganizeFavDlg) ( m_hWnd, szPath ) ? true : false;return;3、讨论实际上,从“DoOrganizeFavDlg”函数的原型声明我们可以看到,由于需要一个路径,所以“整理收藏夹”对话框其实不仅可以用来整理收藏夹,还可以整
19、理磁盘上的目录。而且所谓的整理也不过是提供了一个对话框使用户用起来比较方便而已,和直接在资源管理器中整理没有实质性的差别。因此调用“整理收藏夹”对话框的方法从IE4.0开始就没有变过,除了对话框的布局有所改变。typedef UINT (CALLBACK* LPFNORGFAV)(HWND, LPTSTR);IE 4.0的“整理收藏夹”对话框IE 4.0的“整理收藏夹”对话框(原本的设计)“添加到收藏夹”就不同了,“DoAddToFavDlg”函数不再像“DoOrganizeFavDlg”函数一样对所有IE的版本都适用。参考资料:MSDN: Adding Internet Explorer F
20、avorites to Your Application Internet Explorer编程简述(四)1、概述调用“添加到收藏夹”对话框(如下)与调用“整理收藏夹”对话框有不同之处,前者所做的工作比后者要来得复杂。将链接添加到收藏夹除了将链接保存之外,还可能会有脱机访问的设置,从IE 4.0到IE 5.0,处理的方式也发生了一些变化。2、IShellUIHelper接口微软专门提供了一个接口IShellUIHelper来实现对Windows Shell API一些功能的访问,将链接添加到收藏夹也是其中之一,就是下面的AddFavorite函数。HRESULT IShellUIHelper:
21、AddFavorite(BSTR URL, VARIANT *Title);实例代码如下:void CMyHtmlView:OnAddToFavorites()IShellUIHelper* pShellUIHelper;HRESULT hr = CoCreateInstance(CLSID_ShellUIHelper, NULL, CLSCTX_INPROC_SERVER, IID_IShellUIHelper,(LPVOID*)&pShellUIHelper);if (SUCCEEDED(hr)_variant_t vtTitle(GetTitle().AllocSysString();C
22、String strURL = m_webBrowser.GetLocationURL();pShellUIHelper-AddFavorite(strURL.AllocSysString(), &vtTitle);pShellUIHelper-Release();我们注意到这里的“AddFavorite”函数并没有像“DoOrganizeFavDlg”那样需要一个父窗口句柄。这也导致与在IE中打开不同,通过IShellUIHelper接口显示出来的“添加到收藏夹”对话框是“非模态”的,有一个独立于我们应用程序的任务栏按钮,这使我们的浏览器显得非常不专业(我是个追求完美的人,这也是我的浏览器迟
23、迟不能发布的原因之一)。于是我们很自然地想到“shdocvw.dll”中除了“DoOrganizeFavDlg”外,应该还有一个类似的函数,可以传入一个父窗口句柄用以显示模态窗口,也许就像这样:typedef UINT (CALLBACK* LPFNADDFAV)(HWND, LPTSTR, LPTSTR);事实上,这样的函数确实存在于“shdocvw.dll”中,那就是“DoAddToFavDlg”。3、DoAddToFavDlg函数“DoAddToFavDlg”函数也是“shdocvw.dll”暴露出来的函数之一,其原型如下:typedef BOOL (CALLBACK* LPFNADDF
24、AV)(HWND, TCHAR*, UINT, TCHAR*, UINT,LPITEMIDLIST);第一个参数正是我们想要的父窗口句柄,第二和第四个参数分别是初始目录(一般来说就是收藏夹目录)和要添加的链接的名字(比如网页的Title),第三和第五个参数分别是第二和第四两个缓冲区的长度,而最后一个参数则是指向与第二个参数目录相关的item identifier list的指针(PIDL)。但最奇怪的是这里并没有像“AddFavorite”函数一样的链接URL,那链接是怎样添加的呢?答案是“手动创建”。第二个参数在函数调用返回后会包含用户在“添加到收藏夹”对话框中选择或创建的完整链接路径名(如
25、“X:XXXmylink.url”),我们就根据这个路径和网页的URL来创建链接,代码如下(为简化,此处省去检查shdocvw.dll是否已在内存中的代码,参见Internet Explorer 编程简述(三)“整理收藏夹”对话框):void CMyHtmlView:OnFavAddtofav()typedef BOOL (CALLBACK* LPFNADDFAV)(HWND, TCHAR*, UINT, TCHAR*, UINT,LPITEMIDLIST);HMODULE hMod = (HMODULE)LoadLibrary(shdocvw.dll);if (hMod)LPFNADDFAV
26、 lpfnDoAddToFavDlg = (LPFNADDFAV)GetProcAddress( hMod, DoAddToFavDlg);if (lpfnDoAddToFavDlg)TCHAR szPathMAX_PATH;LPITEMIDLIST pidlFavorites;if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_FAVORITES, TRUE) &(SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &pidlFavorites)TCHAR szTitleMAX_PA
27、TH;strcpy(szTitle, GetLocationName();TCHAR szURLMAX_PATH;strcpy(szURL, GetLocationURL();BOOL bOK = lpfnDoAddToFavDlg(m_hWnd, szPath,sizeof(szPath)/sizeof(szPath0), szTitle,sizeof(szTitle)/sizeof(szTitle0), pidlFavorites);CoTaskMemFree(pidlFavorites);if (bOK)CreateInternetShortcut( szURL, szPath, );
28、/创建Internet快捷方式FreeLibrary(hMod);return;实现CreateInternetShortcut函数创建Internet快捷方式,可以用读写INI文件的方法,但更好的则是利用IUniformResourceLocator接口。HRESULT CMyHtmlView:CreateInternetShortcut(LPCSTR pszURL, LPCSTR pszURLfilename,LPCSTR szDescription,LPCTSTR szIconFile,int nIndex)HRESULT hres;CoInitialize(NULL); IUnifor
29、mResourceLocator *pHook;hres = CoCreateInstance (CLSID_InternetShortcut, NULL, CLSCTX_INPROC_SERVER,IID_IUniformResourceLocator, (void *)&pHook);if (SUCCEEDED (hres)IPersistFile *ppf;IShellLink *psl;/ Query IShellLink for the IPersistFile interface for hres = pHook-QueryInterface (IID_IPersistFile,
30、(void *)&ppf);hres = pHook-QueryInterface (IID_IShellLink, (void *)&psl);if (SUCCEEDED (hres) WORD wsz MAX_PATH; / buffer for Unicode string/ Set the path to the shortcut target.pHook-SetURL(pszURL,0);hres = psl-SetIconLocation(szIconFile,nIndex);if (SUCCEEDED (hres)/ Set the description of the shor
31、tcut.hres = psl-SetDescription (szDescription);if (SUCCEEDED (hres)/ Ensure that the string consists of ANSI characters.MultiByteToWideChar (CP_ACP, 0, pszURLfilename, -1, wsz, MAX_PATH);/ Save the shortcut via the IPersistFile:Save member function.hres = ppf-Save (wsz, TRUE);/ Release the pointer t
32、o IPersistFile.ppf-Release ();psl-Release ();/ Release the pointer to IShellLink.pHook-Release ();return hres; 好,上面的方法虽然麻烦一点,但总算解决了“模态窗口”的问题,使得我们的程序不至于让用户鄙视。但是问题又来了,我们发现“允许脱机使用”是Disabled的,那“自定义”也就无从谈起了,尽管90%的人都没有使用过IE提供的脱机浏览。难道我们的希望要破灭吗?我们一方面想像调用“AddFavorite”函数一样的不必手动创建链接,一方面又要模态显示窗口,就像IE那样,还能自定义脱机浏
33、览。3、脚本方式许多网页上都会有一个按钮或链接“添加本页到收藏夹”,实际上通过下面的脚本显示模态的“添加到收藏夹”对话框将网页加入到收藏夹。window.external.AddFavorite(location.href, document.title);这里的external对象是WebBrowser内置的COM自动化对象,以实现对文档对象模型(DOM)的扩展(我们也可以通过IDocHostUIHandler实现自己的扩展).查阅MSDN可以得知external对象的的方法与IShellUIHelper接口提供的方法是一样的。我们有理由相信,IShellUIHelper提供了对WebBro
34、wser内置的external对象的访问,如果在适当的地方创建IShellUIHelper接口的实例,也许调用“AddFavorite”函数显示出来的就是模态对话框了。问题是我们还没有找到这样的地方。从上面的脚本,我们很自然地又想到另一个方法。如果能够让网页来执行上面的脚本,岂不是问题就解决了?说做就做,如下:void CMyHtmlView:OnFavAddtofav()CString strUrl = GetLocationURL();CString strTitle = GetLocationName();CString strjs = javascript:window.externa
35、l.AddFavorite( + strUrl + , + + strTitle + );ExecScript(strjs);void CMIEView:ExecScript(CString strjs)CComQIPtr pHTMLDoc = (IHTMLDocument2*)GetHtmlDocument();if ( pHTMLDoc != NULL )CComQIPtr pHTMLWnd;pHTMLDoc-get_parentWindow( &pHTMLWnd );if ( pHTMLWnd != NULL )CComBSTR bstrjs = strjs.AllocSysString
36、();CComBSTR bstrlan = SysAllocString(Ljavascript);VARIANT varRet;pHTMLWnd-execScript(bstrjs, bstrlan, &varRet);先从CHtmlView获得文档的父窗口window对象的指针,再调用其方法execScript来执行脚本(事实上可以执行任意的脚本)。试验发现,这个方法非常有效,不仅窗口是模态的,而且不需要手动创建链接,更重要的是“允许脱机使用”和“自定义”按钮也可以用了。4、问题仍旧没有解决执行脚本的方式看起来有效,可一旦我们的程序实现了IDocHostUIHandler接口对WebBro
37、wser进行高级控制,就会发现一旦执行的脚本包含有对“external”对象的调用,就会出现“找不到对象”的脚本错误。原因是当MSHTML解析引擎(并非WebBrowser)检查到宿主实现了IDocHostUIHandler接口,就会调用其GetExternal方法以获得一个用以扩展DOM的自动化接口的引用。HRESULT IDocHostUIHandler:GetExternal(IDispatch *ppDispatch)但有时候我们并没有想要扩展DOM,同时我们还希望WebBrowser使用它自己的DOM扩展。糟糕的是GetExternal方法的文档中说这种情况下必须把ppDispatc
38、h设置为NULL,换句话说,WebBrowser连它内置的external对象也不用了,那我们的window.external.AddFavorite就变得无处为家了。我曾多方尝试将WebBrowser内置的external对象找出来,虽然都没有成功,但是解决问题的方法却被我找到了。5、完美的方案WebBrowser内置的external对象我们虽然找不到,但它肯定存在,我们只要想办法让WebBrowser自己完成对其调用即可。实现非常简单,找到WebBrowser中包含的“Internet Explorer_Server”窗口的句柄,发一个消息就完成了。下面的代码中假设m_hWndIE就是“
39、Internet Explorer_Server”窗口的句柄。#define ID_IE_ID_ADDFAV 2261:SendMessage( m_hWndIE, WM_COMMAND, MAKEWPARAM(LOWORD(ID_IE_ID_ADDFAV), 0x0), 0 );试一试成果,是不是和在Internet Explorer中选择“添加到收藏夹”的效果一模一样。至于为什么这样做,后续文章再说。Internet Explorer编程简述(五)1、概述除了“整理收藏夹”和“添加到收藏夹”对话框外,还有其它一些对话框是我们希望直接通过WebBrowser调用的,比如“导入/导出”对话框,
40、用一般的方法很难调用。IShellUIHelper尽管提供了ImportExportFavorites方法,但结果只是显示一个选择文件的对话框,且只能导入/导出收藏夹而不能对Cookies操作。2、契机MSDN中有一篇叫“WebBrowser Customization”的文章,其中介绍了通过IDocHostUIHandler.ShowContextMenu方法自定义WebBrowser上下文菜单的方法。其原理是从“shdoclc.dll”的资源中创建菜单,作一些修改之后用TrackPopupMenu函数(注意在标志中包含TPM_RETURNCMD)将菜单弹出,然后把返回的Command ID
41、发送给“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之
42、类应用程序资源探索器打开“shdoclc.dll”便可以在菜单资源下找到上下文菜单的设计,如下图:我们要做的,就是将这些ID发送到“Internet Explorer_Server”窗口进行处理。问题是WebBrowser其实是一个OLE容器,我们使用的CHtmlView又是更外层的封装,他们的m_hWnd成员变量并不是IE窗口的句柄,如何找到我们需要的句柄呢?请看下面的图:根据图中显示的从属关系,顺藤摸瓜,最内层的窗口“Internet Explorer_Server”的句柄就是我们需要的东西。为了简化问题,我这里使用了来自MSDN Magazine资深专栏撰稿人Paul Dilascia的
43、CFindWnd类,非常好用。/ MSDN Magazine - August 2003/ If this code works, it was written by Paul DiLascia./ If not, I dont know who wrote it./ Compiles with Visual Studio .NET on Windows XP. Tab size=3./ -/ This class encapsulates the process of finding a window with a given class name/ as a descendant of a
44、 given window. To use it, instantiate like so:/ CFindWnd fw(hwndParent,classname);/ fw.m_hWnd will be the HWND of the desired window, if found./class CFindWnd private:/ This private function is used with EnumChildWindows to find the child/ with a given class name. Returns FALSE if found (to stop enu
45、merating)./static BOOL CALLBACK FindChildClassHwnd(HWND hwndParent, LPARAM lParam) CFindWnd *pfw = (CFindWnd*)lParam;HWND hwnd = FindWindowEx(hwndParent, NULL, pfw-m_classname, NULL);if (hwnd) pfw-m_hWnd = hwnd; / found: save itreturn FALSE; / stop enumeratingEnumChildWindows(hwndParent, FindChildCl
46、assHwnd, lParam); / recursereturn TRUE; / keep lookingpublic:LPCSTR m_classname; / class name to look forHWND m_hWnd; / HWND if found/ ctor does the work-just instantiate and goCFindWnd(HWND hwndParent, LPCSTR classname): m_hWnd(NULL), m_classname(classname)FindChildClassHwnd(hwndParent, (LPARAM)thi
47、s);再写一个函数InvokeIEServerCommand,调用就很方便了,Internet Explorer 编程简述(四)“添加到收藏夹”对话框中最后给出的方法就是从这里来的。void CMyHtmlView:InvokeIEServerCommand(int nID)CFindWnd FindIEWnd( m_wndBrowser.m_hWnd, Internet Explorer_Server);:SendMessage( FindIEWnd.m_hWnd, WM_COMMAND, MAKEWPARAM(LOWORD(nID), 0x0), 0 );void CMyHtmlView:
48、OnFavAddtofav()InvokeIEServerCommand(ID_IE_CONTEXTMENU_ADDFAV);/调用“添加到收藏夹”对话框 4、Command IDs对所有的Command ID逐一尝试后我们发现:1)不是所有的Command ID都可以用上面的方法调用;2)不是所有的Command ID都是由“Internet Explorer_Server”窗口处理;3)有一些Command ID是由上一级窗口“Shell DocObject View”处理。所以我们还需要写一个函数。void CMyHtmlView:InvokeShellDocObjCommand(int
49、 nID)CFindWnd FindIEWnd( m_wndBrowser.m_hWnd, Shell DocObject View);:SendMessage( FindIEWnd.m_hWnd, WM_COMMAND, MAKEWPARAM(LOWORD(nID), 0x0), 0 );调用文章开头提到的“导入/导出”对话框可以这样来做:void CDemoView:OnImportExport()InvokeShellDocObjCommand(ID_IE_FILE_IMPORTEXPORT);/调用“导入/导出”对话框由Internet Explorer_Server窗口处理的Comm
50、and ID:#define ID_IE_CONTEXTMENU_ADDFAV 2261#define ID_IE_CONTEXTMENU_VIEWSOURCE 2139#define ID_IE_CONTEXTMENU_REFRESH 6042由Shell DocObject View窗口处理的Command ID:#define ID_IE_FILE_SAVEAS 258#define ID_IE_FILE_PAGESETUP 259#define ID_IE_FILE_PRINT 260#define ID_IE_FILE_NEWWINDOW 275#define ID_IE_FILE_
51、PRINTPREVIEW 277#define ID_IE_FILE_NEWMAIL 279#define ID_IE_FILE_SENDDESKTOPSHORTCUT 284#define ID_IE_HELP_ABOUTIE 336#define ID_IE_HELP_HELPINDEX 337#define ID_IE_HELP_WEBTUTORIAL 338#define ID_IE_HELP_FREESTUFF 341#define ID_IE_HELP_PRODUCTUPDATE 342#define ID_IE_HELP_FAQ 343#define ID_IE_HELP_ONL
52、INESUPPORT 344#define ID_IE_HELP_FEEDBACK 345#define ID_IE_HELP_BESTPAGE 346#define ID_IE_HELP_SEARCHWEB 347#define ID_IE_HELP_MSHOME 348#define ID_IE_HELP_VISITINTERNET 349#define ID_IE_HELP_STARTPAGE 350#define ID_IE_FILE_IMPORTEXPORT 374#define ID_IE_FILE_ADDTRUST 376#define ID_IE_FILE_ADDLOCAL 377#define ID_IE_FILE_NEWPUBLISHINFO 387#define ID_IE_FILE_NEWCORRESPONDENT 390#define ID_IE_FILE_NEWCALL 395#define ID_IE_HELP_NETSCAPEUSER 351#define ID_IE_HELP_ENHANCEDSECURITY 3755、Refresh熟悉TEmbeddedWB的读者可能注意到了ID_IE_CONTEXTMENU_REFRESH(6042)这个ID,在TEmbeddedWB中给出了一个当网页刷新时触发的OnRefresh事件,其中的关键
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《新员工培训课程》课件
- 湖北汽车工业学院科技学院《工业机器人》2021-2022学年第一学期期末试卷
- 紫癜风护理常规
- 《UPS电源简介》课件
- 皮肤科雾化治疗
- 混凝土打灰劳务合同(2篇)
- 粉尘防爆安全知识培训
- 《科技成果鉴定指南》课件
- 急诊外科腰痛治疗方案
- 《大感人事》课件
- 中国航天发展历史
- 临床常用血液成分与输血适应症
- 《燃烧性能测试》课件-第二节 氧指数测试
- DB32/T 4446-2023 公共机构能源托管规程
- 初中英语名词单复数专项训练题目
- 面神经微血管减压术护理
- 2.贵州省地方标准项目申报书
- “读思达”教学法在整本书阅读教学中的实践
- 盐酸右美托咪定鼻喷雾剂-临床用药解读
- HSK 2标准教程(完整版)
- 新HSK1-6词汇大纲文档
评论
0/150
提交评论