2010-03-26 2 views
0

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

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

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

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

+0

Здравствуйте, я тоже создаю BHO с C# и у меня есть к вам вопрос о IWebBrowser2. В 'setSite', как вы знаете, когда документ завершил загрузку? Я использую mshtml WebBrowser и запускаю новое событие в '.DocumentComplete', но у IWebBrowser2 этого нет. – thefoyer

ответ

2

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

0

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

Лучше cal IViewObject :: Draw() или :: OleDraw().

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

CComQIPtr oleObject = браузер;

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

Надеется, что это помогает

 Смежные вопросы

  • Нет связанных вопросов^_^