日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > HTML >内容正文

HTML

浏览器扩展系列————透明浏览器窗口的实现

發(fā)布時(shí)間:2025/4/16 HTML 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浏览器扩展系列————透明浏览器窗口的实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先先看一下效果圖:

??? 本實(shí)現(xiàn)是基于WPF,VS版本2008 SP1。

??? 先說(shuō)一下在Winform中的實(shí)現(xiàn)方法:很簡(jiǎn)單通過(guò)設(shè)置窗體的opacity來(lái)實(shí)現(xiàn),或者還可以設(shè)置TransparentKey來(lái)實(shí)現(xiàn)某種顏色透明。但是在WPF中則如何實(shí)現(xiàn)呢?

通過(guò)設(shè)置窗體的opacity,那么得到結(jié)果就是webbrowser整體消失了。因?yàn)檫@里面涉及到WPF中“空域”的問(wèn)題,相關(guān)的文章如下:

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

??? 由此看來(lái)通過(guò)直接設(shè)置透明度的方法是不行了,那么回到原來(lái)的問(wèn)題,“將瀏覽器窗體背景成透明”,其實(shí)這里的透明只是一個(gè)視覺(jué)上的感覺(jué),就是瀏覽器中網(wǎng)頁(yè)的背景和整個(gè)窗體的背景想融合就可以。看到這里,各位看官可能已經(jīng)想到了,將瀏覽器中頁(yè)面的背景繪制成被瀏覽器控件所覆蓋出的背景就可以了。確實(shí),我的實(shí)現(xiàn)也是依照這種思路走的。

??? 這里主要用到了兩個(gè)技術(shù):

l?Mshtml操作網(wǎng)頁(yè)中元素,通過(guò)給body標(biāo)簽添加行為來(lái)實(shí)現(xiàn)背景的繪制。

?

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類用來(lái)給應(yīng)用程序截圖:

?

?

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;
????????}

在截圖的時(shí)候這里使用了一個(gè)技巧就是,先將控件隱藏,然后截圖,最后恢復(fù)控件的顯示。?

最后說(shuō)一下本實(shí)現(xiàn)的一些缺陷:

  • ?如果將應(yīng)用程序的背景設(shè)置為透明,則瀏覽器的背景將呈現(xiàn)白色,因?yàn)楸緦?shí)現(xiàn)使用的是應(yīng)用程序的背景來(lái)進(jìn)行截圖,如果應(yīng)用程序背景被透明,則截圖得到的也是一張透明的圖片,繪制到頁(yè)面上后并不能達(dá)到透明的效果。如果想在這種情況下實(shí)現(xiàn)透明,可以考慮對(duì)桌面背景進(jìn)行截圖。
  • 如果網(wǎng)頁(yè)過(guò)大出現(xiàn)滾動(dòng)條,那么網(wǎng)頁(yè)中未呈現(xiàn)的部分并不能透明,因?yàn)榻貓D只能作用于已經(jīng)顯示的部分。所以本實(shí)現(xiàn)用于顯示本地控制好大小的html頁(yè)面有比較好的效果。
  • 具體項(xiàng)目下載如下:

    /Files/chinese-zmm/TransportWebBrowserDemo.rar?

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/chinese-zmm/archive/2009/04/26/1444065.html

    總結(jié)

    以上是生活随笔為你收集整理的浏览器扩展系列————透明浏览器窗口的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。