首先先看一下效果图:

本实现是基于WPF,VS版本2008 SP1。

先说一下在Winform中的实现方法:很简单通过设置窗体的opacity来实现,或者还可以设置TransparentKey来实现某种颜色透明。但是在WPF中则如何实现呢?

通过设置窗体的opacity,那么得到结果就是webbrowser整体消失了。因为这里面涉及到WPF中“空域”的问题,相关的文章如下:

http://blogs.msdn.com/changov/archive/2009/01/19/webbrowser-control-on-transparent-wpf-window.aspx

由此看来通过直接设置透明度的方法是不行了,那么回到原来的问题,“将浏览器窗体背景成透明”,其实这里的透明只是一个视觉上的感觉,就是浏览器中网页的背景和整个窗体的背景想融合就可以。看到这里,各位看官可能已经想到了,将浏览器中页面的背景绘制成被浏览器控件所覆盖出的背景就可以了。确实,我的实现也是依照这种思路走的。

这里主要用到了两个技术:

l Mshtml操作网页中元素,通过给body标签添加行为来实现背景的绘制。

Code
[ComVisible(true), Guid("0015EC28-C85F-49a8-9B1A-DC91E6345274"),
    ClassInterface(ClassInterfaceType.AutoDispatch)]
    public class MyGadgetBodyBehavior : IElementBehavior, IHTMLPainter
    {
        public delegate void SizeChangedEventHandler(SizeChangedEventArgs e);
        public event SizeChangedEventHandler onSizeChangedEvent;
        private AppScreenSnapHelper snapHelper;

下面是绘制部分的代码

Code
 public void Draw(RECT rcBounds, RECT rcUpdates, int lDrawFlags, IntPtr hdc, IntPtr pvDrawObject)
        {
            Graphics g = Graphics.FromHdc(hdc);
            Bitmap buffer = new Bitmap(width, height);
            Graphics gBuffer = Graphics.FromImage(buffer);

            AppScreenSnapHelper.Image image = snapHelper.GetScreenSnap();
            gBuffer.DrawImage(image.Bitmap, 0, 0);
            image.Dispose();

            string imageSrc = ((IHTMLElement2)body).currentStyle.backgroundImage;
            if (!string.IsNullOrEmpty(imageSrc))
            {
                Match match = Regex.Match(imageSrc, @"url\(""file:///(?<path>.*)""\)");
                if (match.Success)
                {
                    imageSrc = match.Groups["path"].Value;
                    using (Bitmap bitmap = new Bitmap(imageSrc))
                    {
                        object obj = ((IHTMLElement2)body).currentStyle.marginLeft;
                        gBuffer.DrawImage(bitmap, new Rectangle(0, 0, width, height));
                    }
                }
            }
            g.DrawImage(buffer, rcUpdates.left, rcUpdates.top,
                      new Rectangle(rcUpdates.left - rcBounds.left,
                      rcUpdates.top - rcBounds.top, rcUpdates.right - rcUpdates.left,
                      rcUpdates.bottom - rcUpdates.top), GraphicsUnit.Pixel);
            buffer.Dispose();
            gBuffer.Dispose();
            g.Dispose();
            
        }

l RenderTargetBitmap类用来给应用程序截图:

Code
internal Image GetScreenSnap(bool isForceRefresh)
        {
            if (CheckPositionAndSize() && !isForceRefresh)
            {
                return screenImage;
            }

            control.Visibility = Visibility.Hidden;
            RenderTargetBitmap bitmap = new RenderTargetBitmap((int)parentWindow.Width,
               (int)parentWindow.Width, 96, 96, PixelFormats.Pbgra32);
            bitmap.Render(parentWindow);
            BitmapSource bitmapSource = bitmap.CloneCurrentValue();
            Bitmap newBitmap = ConvertSourceImageToBitmap(bitmapSource);
            newBitmap = ClipBitmap(newBitmap, new System.Drawing.Rectangle((int)oldPoint.X, (int)oldPoint.Y,
                ((int)control.Width == 0 ? 1 : (int)control.Width), ((int)control.Height) == 0 ? 1 : (int)control.Height));

            control.Visibility = Visibility.Visible;
            screenImage = new Image(newBitmap, imagePtr);
            return screenImage;
        }

在截图的时候这里使用了一个技巧就是,先将控件隐藏,然后截图,最后恢复控件的显示。

最后说一下本实现的一些缺陷:

  1. 如果将应用程序的背景设置为透明,则浏览器的背景将呈现白色,因为本实现使用的是应用程序的背景来进行截图,如果应用程序背景被透明,则截图得到的也是一张透明的图片,绘制到页面上后并不能达到透明的效果。如果想在这种情况下实现透明,可以考虑对桌面背景进行截图。
  2. 如果网页过大出现滚动条,那么网页中未呈现的部分并不能透明,因为截图只能作用于已经显示的部分。所以本实现用于显示本地控制好大小的html页面有比较好的效果。

具体项目下载如下:

/Files/chinese-zmm/TransportWebBrowserDemo.rar

转载于:https://www.cnblogs.com/chinese-zmm/archive/2009/04/26/1444065.html

浏览器扩展系列————透明浏览器窗口的实现相关推荐

  1. 浏览器扩展开发系列教程(一)

    以谷歌内核的浏览器扩展,包括 edge chrome ,还有我们常用的国产浏览器都能使用 浏览器扩展是一种软件,以增强Chrome内核浏览器的功能.浏览器扩展使用HTML.JavaScript.CSS ...

  2. 为什么浏览器扩展会如此危险?

    浏览器,大家每天都在用,用它上网查资料.办公.看视频等.可以说,浏览器是在线内容消费的中心平台,如在办公中,都是通关浏览器去访问组织数据和应用程序,用来通信.数据共享.操作等. 好用的浏览器扩展 日常 ...

  3. Chrome浏览器:分享几个好玩的浏览器扩展

    浏览器扩展推荐 Chrome浏览器:BD最美浏览器新标签页扩展 1.Stylish 推荐指数:★★★★ Chrome浏览器:BD最美浏览器新标签页扩展 利用用户样式管理器Stylish来重新编辑网站的 ...

  4. 对比两款支持扩展的安卓浏览器:kiwi浏览器和狐猴浏览器

    如果你对支持扩展的手机浏览器感兴趣的话,应该早已对kiwi浏览器耳熟能详.而国内也有不少优秀的支持扩展的手机浏览器非常值得一试,最近我正在使用的狐猴浏览器就是一个不错的产品. 可能你正在寻找一个适合自 ...

  5. 浏览器扩展:比你想象得更危险

    我们每个人都可能或多或少地安装过各种浏览器扩展程序:广告拦截器.在线翻译器.拼写检查器.反指纹追踪程序或其他东西.然而,很少有人停下来思考:它安全吗?不幸的是,这些看似无害的迷你应用程序可能比你想象得 ...

  6. 最新!如何安装Google浏览器扩展

    最新!如何安装Google浏览器扩展 安装Google浏览器扩展是非常简单的,首先点击浏览器右上方的按钮 - 选择更多工具 - 最后点击扩展程序. 点击扩展程序后就会进入扩展程序管理界面,也可以直接在 ...

  7. Chrome浏览器扩展开发系列之一:初识Google Chrome扩展

    1.       Google Chrome扩展简介 Google Chrome扩展是一种软件,以增强Chrome浏览器的功能. Google Chrome扩展使用HTML.JavaScript.CS ...

  8. Chrome浏览器扩展开发系列之五:Page Action类型的Chrome浏览器扩展

    Page Action类型的Google Chrome浏览器扩展程序,通常也会有一个图标,但这个图标位于Chrome浏览器的地址栏内右端.而且这个图标并非始终出现,而是当某指定的页面打开时才会出现.也 ...

  9. JavaScript基础系列之五 浏览器

    JavaScript基础系列之五 浏览器 浏览器 由于JavaScript的出现就是为了能在浏览器中运行,所以,浏览器自然是JavaScript开发者必须要关注的. 目前主流的浏览器分这么几种: IE ...

最新文章

  1. 取得cpu核心序号_cpu的性能指标有哪些?
  2. 寻找最大的K个数(上)
  3. 【LetCode 算法修炼】Add Two Numbers
  4. Python字典排序sorted无效,用匿名函数lambda解决
  5. CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-8CDH5安装和集群配置
  6. Oracle分析函数六——数据分布函数及报表函数
  7. C++socket编程(三):3.7 服务端回应send客户端数据
  8. 使用JWT保护你的Spring Boot应用 - Spring Security实战
  9. VS Code 调试ROS节点
  10. python 单例模式,一个类只能生成唯一的一个实例,重写__new__方法详解
  11. 我就是认真:Linux SWAP 深度解读(必须收藏)
  12. mnist数据集matlab导入,MNIST数据集转为matlab可读的mat格式
  13. Go语言发展状况和前景
  14. 主仆模式(Master-Slave)
  15. 2022跨年烟花代码(三)HTML5点击页面烟花绽放特效
  16. excel应用之合并单元格保留内容和替换软回车
  17. windows2003通过iis配置ftp服务器
  18. Windows cmd命令(五)find和findstr指令
  19. oracle 查看指标 tps(Transactions Per Second)
  20. Web Service 自动生成代码报错

热门文章

  1. java 循环关键字_Java循环结构_常量_关键字
  2. android 资源匹配,Android资源匹配过程(二)
  3. 东财计算机应用基础在线作业答案,《计算机应用基础》东财在线20秋第一套作业答案...
  4. ios html双击下移,H5页面在ios上双击div,导致屏幕上移的js解决办法
  5. shader 编程入门(一)
  6. 解决django配合nginx部署后admin样式丢失
  7. 201807 相关性度量的几种方法-卡方检验、相关系数、信息增益...
  8. Flask的Context(上下文)
  9. SpringMVC框架介绍
  10. ORACLE中的包和包体