首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过BHO拍摄IE网页快照(C#)

如何通过BHO拍摄IE网页快照(C#)
EN

Stack Overflow用户
提问于 2010-03-26 16:57:45
回答 2查看 2.1K关注 0票数 0

我正在尝试在C#中建立一个IE BHO,用于拍摄IE浏览器中加载的网页的快照。这是我想要做的:

代码语言:javascript
复制
public class ShowToolbarBHO : BandObjectLib.IObjectWithSite
{

    IWebBrowser2 webBrowser = null;

    public void SetSite (Object site)
    {
        .......
        if (site != null)
        {
            ......
            webBrowser = (IWebBrowser2)site;
            ......
        }
    }
}

此外,i p/调用以下COM方法:

代码语言:javascript
复制
    [Guid("0000010D-0000-0000-C000-000000000046")]
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
    [ComImportAttribute()]
    public interface IViewObject
    {
        void Draw([MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, [In] IntPtr ptd, IntPtr hdcTargetDev, IntPtr hdcDraw, [MarshalAs(UnmanagedType.LPStruct)] ref COMRECT lprcBounds, [In] IntPtr lprcWBounds, IntPtr pfnContinue, int dwContinue);
        int GetColorSet([MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, [In] IntPtr ptd, IntPtr hicTargetDev, [Out] IntPtr ppColorSet);
        int Freeze([MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, out IntPtr pdwFreeze);
        int Unfreeze([MarshalAs(UnmanagedType.U4)] int dwFreeze);
        int SetAdvise([MarshalAs(UnmanagedType.U4)] int aspects, [MarshalAs(UnmanagedType.U4)] int advf, [MarshalAs(UnmanagedType.Interface)] IAdviseSink pAdvSink);
        void GetAdvise([MarshalAs(UnmanagedType.LPArray)] out int[] paspects, [MarshalAs(UnmanagedType.LPArray)] out int[] advf, [MarshalAs(UnmanagedType.LPArray)] out IAdviseSink[] pAdvSink);
    }

    [StructLayoutAttribute(LayoutKind.Sequential)]
    public class COMRECT
    {
        public int left;
        public int top;
        public int right;
        public int bottom;

        public COMRECT()
        {
        }

        public COMRECT(int left, int top, int right, int bottom)
        {
            this.left = left;
            this.top = top;
            this.right = right;
            this.bottom = bottom;
        }
    }

    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
    [ComVisibleAttribute(true)]
    [GuidAttribute("0000010F-0000-0000-C000-000000000046")]
    [ComImportAttribute()]
    public interface IAdviseSink
    {
        void OnDataChange([In]IntPtr pFormatetc, [In]IntPtr pStgmed);
        void OnViewChange([MarshalAs(UnmanagedType.U4)] int dwAspect, [MarshalAs(UnmanagedType.I4)] int lindex);
        void OnRename([MarshalAs(UnmanagedType.Interface)] object pmk);
        void OnSave();
        void OnClose();
    }

现在,当我拍摄快照时:

调用CaptureWebScreenImage((IHTMLDocument2) webBrowser.document);

公共静态镜像CaptureWebScreenImage(IHTMLDocument2 myDoc) {

代码语言:javascript
复制
        int heightsize = (int)getDocumentAttribute(myDoc, "scrollHeight");
        int widthsize = (int)getDocumentAttribute(myDoc, "scrollWidth");

        Bitmap finalImage = new Bitmap(widthsize, heightsize);
        Graphics gFinal = Graphics.FromImage(finalImage);
        COMRECT rect = new COMRECT();
        rect.left = 0;
        rect.top = 0;
        rect.right = widthsize;
        rect.bottom = heightsize;

        IntPtr hDC = gFinal.GetHdc();
        IViewObject vO = myDoc as IViewObject;

        vO.Draw(1, -1, (IntPtr)0, (IntPtr)0, (IntPtr)0, (IntPtr)hDC, ref rect, (IntPtr)0, (IntPtr)0, 0);
        gFinal.ReleaseHdc();

        gFinal.Dispose();

        return finalImage;

}

我看不到网页的图像。相反,我得到的是一个黑色背景的图像。我不确定这是否是正确的方法,但我在网上发现IViewObject::Draw方法用于在IE中拍摄网页的图像。

我之前使用以下代码项目的页面http://www.codeproject.com/KB/graphics/IECapture.aspx中提到的Native PrintWindow()方法进行图像捕获

但是图像的大小是巨大的!我试着看看我是否可以通过使用其他技术来减小尺寸。如果有人能指出我上面代码中的错误(我相信会有很多),那就太好了。

谢谢,卡皮尔

EN

回答 2

Stack Overflow用户

发布于 2010-05-06 08:11:56

您可以尝试在IHTMLElementRender接口中查询document元素(可通过IHTMLDocument3获得),并使用DrawToDC方法将页面呈现为位图。

票数 2
EN

Stack Overflow用户

发布于 2013-02-01 23:04:29

据我所知,它不会像flash那样绘制物体和画布。

最好调用IViewObject::Draw()或::OleDraw()。

2我不知道用C#怎么做,但我知道怎么用win32程序做。在win32程序中,需要调用IOleInplaceObject::SetObjectRect来设置IWebBrowser的位置和大小。或者SetClientSite(),我相信它们中的一个会变魔术。

CComQIPtr oleObject =浏览器;

代码语言:javascript
复制
CComQIPtr<IOleInPlaceObject> inPlaceObject(mOleObject); 
inPlaceObject->SetObjectRects(&rcClient, &rcClient); 
oleObject ->SetClientSite(clientSite);

希望能有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2522024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档