怎么样修改和删除 IE WebBrowser Control的右键菜单
来源:互联网 发布:手机淘宝怎么用券 编辑:程序博客网 时间:2024/04/30 07:16
Here is an easy solution for hiding/Replacing the right click menu on a Web Browser window.
I had to implement a news group reader and writer. The news reader/writer used the IWebBrowser2
control as the message display/edit window. If you do a right click on it, there is an option View Source and other menu items. If I had an option, I want to act like I implemented everything from scratch. But the Right Click menu put a hole in my plan and revealed that I reused IE control. Besides anyway we didn’t want our users to mess around with HTML source code etc or expose some of them to brain damage from seeing real weird stuff while all they asked for was some news group item. Web browser captures the right click and shows the default IE right click menu. So how do I remove it?
I trap the PreTranslateMessage
function of the application class (CWinApp
derived class). In case of a right click, I will see if it is a webbrowser control which generated the message, and if so I display our menu. Here is our example.
BOOL CWebBrowserTestApp::PreTranslateMessage(MSG* pMsg){ // We have a right click if ( (WM_RBUTTONDOWN == pMsg->message) || (WM_RBUTTONDBLCLK == pMsg->message)) { // Now verify it is from our web browser CWebBrowserTestDlg* pWBDlg = (CWebBrowserTestDlg*)AfxGetMainWnd(); if(pWBDlg->isThisOurBrowser(pMsg->hwnd)) { // If so show our menu! pWBDlg->showOurMenu(); // mark as handled return TRUE; } } return CWinApp::PreTranslateMessage(pMsg);}
Now that I have trapped the right click, I will have to ask the window that owns the webbrowser control to see if the window, which got the right click, is a webbrowser window. It is a little twitchy here, I will have to specifically go case by case, meaning I will have to check, if not this webbrowser, the other usage instance of webbrowser and other(meaning if a dialog box had three controls which where webbrowsers, I might have a CWnd m_WndBrowser1
, CWnd m_WndBrowser2
and CWnd m_WndBrowser3
). In attached example I have a dialog with one webbrowser control in it. I have a member variable for the webbrowser window as follows.
CWnd m_WndBrowser
My function will have to do a little bit more than just matching the window handles. Why so? A nested frame inside IE is again an instance of IE. HTMLs having nested frames will return a different window handle for different frames inside the same parent IE Window. So what will be my logic? I will have to traverse via GetParent
from a frame to the parent IE window, whose window handle I already know or till I don’t have a parent of type IE. How do we know if its an IE Window? The Window class name will be "Internet Explorer_Server". That’s what the next function does, see if our window is an Internet Explorer, if so we know, the outer shell window will be the parent of doc-view which will be the parent of the IE class window.
// This fn checks if this is a IE type window and returns // the outer hosting Shell window handle for it, if it is one! else NULL HWND CWebBrowserTestDlg::getParentWebBrowserWnd(HWND hMyWnd){ HWND hRetWBWnd = NULL; static TCHAR tszIEClass[] = "Internet Explorer_Server"; TCHAR tszClass[sizeof(tszIEClass)+1]; // Compare if our window is of type IE class ::GetClassName( hMyWnd,tszClass,sizeof(tszClass)); if(0 == _tcscmp(tszClass, tszIEClass)) { // Then get the Shell which hosts the IE doc view window hRetWBWnd = ::GetParent(::GetParent(hMyWnd)); } return hRetWBWnd;}// Checks if message window is our WebBrowser control and if so returns TRUEBOOL CWebBrowserTestDlg::isThisOurBrowser(HWND hMyWnd){ HWND hWndOurWebBrowser = (HWND)m_WndBrowser.GetSafeHwnd(); // Get the Parent webbrowser window if any HWND hParentWBWnd = getParentWebBrowserWnd(hMyWnd); // Now, we can have nested frames .. // meaning a frame inside a frame is yet another webbrowser // So our m_WndBrowser guy can be way up there .. // so we have to iterate up to him through parent frames // till we have a match or no more WB type parent while( (NULL != hParentWBWnd) && (hParentWBWnd != hWndOurWebBrowser)) { // Get the Parent of the Webbrowser window I have, recursively hParentWBWnd = getParentWebBrowserWnd(::GetParent(hParentWBWnd)); } return (NULL != hParentWBWnd);}
Now the next function is a normal fn to show a popup menu from resource and I am not going to explain it. People who need an explanation should please read the help.
// This is a trivial fn which gets a submenu from a resource// and displays it at the current cursor positionvoid CWebBrowserTestDlg::showOurMenu(){ POINT CurPoint; GetCursorPos(&CurPoint); CMenu ReplaceMenu; //Make your custom menu here ReplaceMenu.LoadMenu(IDR_RIGHTCLICK); // Do we have a menu loaded if(::IsMenu(ReplaceMenu.m_hMenu)) { // this is my popup menu CMenu* pMyPopup = ReplaceMenu.GetSubMenu(0); if(NULL != pMyPopup) { // Show it pMyPopup->TrackPopupMenu (TPM_LEFTALIGN | TPM_RIGHTBUTTON, CurPoint.x, CurPoint.y, this ); // deleting me and my parent when I am done pMyPopup->DestroyMenu(); ReplaceMenu.DestroyMenu(); } }}
- 怎么样修改和删除 IE WebBrowser Control的右键菜单
- 支持IE和FireFox的右键菜单
- 管理你的ie右键菜单 / 删除intel主板,显卡右键菜单,提高速度
- 通过修改注册表添加IE右键菜单
- 通过修改注册表添加IE右键菜单
- 树的右键菜单包括添加、修改、删除的地址
- 删除ATI显卡右键菜单catalyst(tm)control center
- 使用脚本语言和IE右键菜单
- 使用脚本语言和IE右键菜单
- 右键菜单“新建”的修改
- 修改右键多余的菜单
- 给IE的右键菜单增加功能
- 可定制的IE鼠标右键菜单
- VB:屏蔽IE的右键菜单
- 恢复Onenote ie右键菜单的方法
- 去除WebBrowser的 3D边框、滚动条、右键菜单...
- IE右键菜单
- 自定义ie右键菜单
- 马云于赢在中国的一些讲话
- JAVA面试32问
- IBM社会招聘题
- IBM的招聘策略
- 收到QQ尾巴 Worm.QQ.TopFox.bo 送来的“我的近照11.zip”
- 怎么样修改和删除 IE WebBrowser Control的右键菜单
- PHPUnit袖珍指南 第十二章 测试的其他用途
- java,jsp连接mysql
- 小品: 关于"C++引用"
- 遗传算法之:编码方法
- sql server存储过程、存储函数的加密、解密
- 将表数据生成SQL脚本的存储过程
- 汕头公司生产实习一天游
- 使用Velocity开发web程序