Как сделать снимок веб-страницы IE через BHO (C #) - PullRequest
0 голосов
/ 26 марта 2010

Я пытаюсь создать IE BHO в C # для создания снимка веб-страницы, загруженной в браузер IE. Вот что я пытаюсь сделать:

public class ShowToolbarBHO : BandObjectLib.IObjectWithSite
{

    IWebBrowser2 webBrowser = null;

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

Также я запускаю следующие COM-методы:

    [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) {

        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.

Ранее я делал захват изображения, используя метод Native PrintWindow (), как упомянуто на следующей странице codeproject - http://www.codeproject.com/KB/graphics/IECapture.aspx

Но размер изображения огромен! Я пытался понять, смогу ли я уменьшить размер, используя другие методы. Было бы здорово, если бы кто-то мог указать на ошибки (я уверен, что их будет много) в моем коде выше.

Спасибо, Капил

Ответы [ 2 ]

2 голосов
/ 06 мая 2010

Вы можете попробовать запросить IHTMLElementRender интерфейс для элемента документа (который доступен через IHTMLDocument3 интерфейс) и использовать метод DrawToDC для отображения страницы в растровом изображении .

0 голосов
/ 01 февраля 2013

1 IHTMLElementRender :: DrawToDC устарела, согласно документации Microsoft. И он не рисует объект и холст, как вспышка, насколько я вижу.

Лучше вызывать IViewObject :: Draw () или :: OleDraw ().

2 Я не знаю, как это сделать в C #, но я знаю, как это сделать в программе win32. В программе win32 вам нужно вызвать IOleInplaceObject :: SetObjectRect, чтобы установить позицию и размер IWebBrowser. Или SetClientSite (), я уверен, что один из них делает волшебство.

CComQIPtr oleObject = browser;

CComQIPtr<IOleInPlaceObject> inPlaceObject(mOleObject); 
inPlaceObject->SetObjectRects(&rcClient, &rcClient); 
oleObject ->SetClientSite(clientSite);

Надеюсь, это поможет

...