浏览器扩展系列————在WPF中定制WebBrowser快捷菜单

简介: 原文:浏览器扩展系列————在WPF中定制WebBrowser快捷菜单关于如何定制菜单可以参考codeproject上的这篇文章:http://www.codeproject.com/KB/books/0764549146_8.aspx?fid=13574&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26#xx0xx 本文主要讲述如何在这篇文章中的ShowContextMenu方法中弹出自己的ContextMenu。
原文: 浏览器扩展系列————在WPF中定制WebBrowser快捷菜单

关于如何定制菜单可以参考codeproject上的这篇文章:http://www.codeproject.com/KB/books/0764549146_8.aspx?fid=13574&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26#xx0xx

本文主要讲述如何在这篇文章中的ShowContextMenu方法中弹出自己的ContextMenu。

先来看看在WinForm中是如何实现的:

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
public void ShowContextMenu(

            MsHtmlCustomization.ContextMenuTarget dwContext,

            
ref MsHtmlCustomization.POINT pPoint,

            MsHtmlCustomization.IOleCommandTarget pCommandTarget,

            
object HTMLTagElement)

{

  Point p 
= new Point(pPoint.x, pPoint.y);

  p 
= PointToClient(p);

  myCustomContextMenu.Show(
this, p);  //myCustomContextMenu是一个System.Windows.Forms.ContextMenu对象。

  
const int Ok = 0;

  
throw new COMException("", Ok); // return HRESULT = S_OK, so MsHtml

 

                                  
// doesn’t display its own menu

 

 

先来看看网上一般的实现方法:

myHostBrowser.ContextMenu.PlacementTarget = this;//this即自己的Windows对象,它实现了IDocHostUIHandler接口。

myHostBrowser.ContextMenu.IsOpen = true;

通过此方法可以实现自己控制弹出菜单,比如在某个控件上左击弹出快捷菜单的功能。但是针对这里的WebBrowser控件来说情况就有些不同了,应为WebBrowser是对系统的Internet explorer对象进行了封装,使其处理所有的事件,所以介于WinFormWPFContextMenu对象实现的不同,比如WinForm实现ContextMenu对象的Show方法时,它把菜单的显示委托给了底层的Usr32函数:

[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]

public static extern bool TrackPopupMenuEx(HandleRef hmenu, int fuFlags, int x, int y, HandleRef hwnd, NativeMethods.TPMPARAMS tpm);

WPF实现的ContextMenu则采用了新的方法,所以在网上可以看到不少讲解利用ContextMenu实现嵌入许多控件的方法,以丰富其功能的文章。

所以造成的结果就是在ShowContextMenu中弹出WPFContextMenu时,第一次可以弹出正确的菜单,但第二次在WebBrowser中右击时菜单会消失,但ShowContextMenu将不会被触发。而在第三次右击时菜单才会弹出。

那我想到的就是将WinForm中的ContextMenu嵌入到WPF中使用,这是只要解决一个问题即可,就是在Show是传入一个Control对象即可,

参考MSDN文章:How to: Enable Visual Styles in a Hybrid Application

img_1c53668bcee393edac0d7b3b3daff1ae.gifimg_405b18b4b6584ae338e0f6ecaf736533.gifCode
 

System.Windows.Forms.TextBox tc;

        
private void Window_Loaded(object sender, RoutedEventArgs e)

        {

            System.Windows.Forms.Application.EnableVisualStyles();

 

            
// Create a WindowsFormsHost element to host

            
// the Windows Forms control.

            System.Windows.Forms.Integration.WindowsFormsHost host 
=

                
new System.Windows.Forms.Integration.WindowsFormsHost();

 

            
// Create a Windows Forms tab control.

            tc 
= new System.Windows.Forms.TextBox();//此TextBox只是为了显示ContextMenu而构造的一个任意对象。

            
// Assign the Windows Forms tab control as the hosted control.

            host.Child 
= tc;

 

            
// Assign the host element to the parent Grid element.

            
this.grid2.Children.Add(host);

 

而在ShowContextMenu中则写上:

System.Windows.Forms.ContextMenu menu = new System.Windows.Forms.ContextMenu();

menu.MenuItems.Add(new System.Windows.Forms.MenuItem("Test"));

System.Drawing.Point p = new System.Drawing.Point(ppt.x, ppt.y);

p = tc.PointToClient(p);

menu.Show(tc, p);

即可显示自己的定制的ContextMenu

目录
相关文章
谷歌浏览器常用的扩展
谷歌浏览器常用的扩展
83 0
|
Web App开发 人工智能 安全
LemurBrowser狐猴浏览器:支持插件扩展的移动端浏览器
狐猴浏览器是浏览器新标签页插件Wetab提供的支持在移动端安装插件,内置免费AI工具助手的新一代移动端浏览器,像Infinity/Wetab 一样简洁优雅好用的Tab浏览器。
323 0
LemurBrowser狐猴浏览器:支持插件扩展的移动端浏览器
|
2月前
|
Web App开发 搜索推荐 安全
|
5月前
|
C# 微服务 Windows
模块化革命:揭秘WPF与微服务架构的完美融合——从单一职责原则到事件聚合器模式,构建高度解耦与可扩展的应用程序
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中借鉴微服务架构思想,实现模块化设计。通过将WPF应用分解为独立的功能模块,并利用事件聚合器实现模块间解耦通信,可以有效提升开发效率和系统可维护性。文中还提供了具体示例代码,展示了如何使用事件聚合器进行模块间通信,以及如何利用依赖注入进一步提高模块解耦程度。此方法不仅有助于简化复杂度,还能使应用更加灵活易扩展。
120 0
|
5月前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
136 0
|
5月前
|
存储 开发框架 前端开发
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(9) -- 实现系统动态菜单的配置和权限分配
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(9) -- 实现系统动态菜单的配置和权限分配
|
存储 JavaScript 前端开发
|
8月前
|
Web App开发 JSON 前端开发
6款开发必备的Chrome谷歌浏览器扩展(部分火狐、edge浏览器商店也可以用)
6款开发必备的Chrome谷歌浏览器扩展(部分火狐、edge浏览器商店也可以用)
243 0
|
JavaScript 前端开发 C#
WPF技术之WebBrowser控件
WPF WebBrowser控件用于在WPF应用程序中嵌入浏览器功能。
303 0
|
Web App开发 搜索推荐
Infinity颜值与实用兼备的新标签页,高效书签管理必选的浏览器扩展
Infinity是一款基于 Chrome、Edge、Fierfox 等浏览器的扩展插件,它以其简洁、优雅、美观和可定制化而备受推崇,并被官方多次精选推荐。如今,它已经成为许多人必备的浏览器扩展之一。
126 0