2010-03-26 5 views
0

IE 브라우저에로드 된 웹 페이지의 스냅 샷을 만들기 위해 C#에서 IE BHO를 작성하려고합니다.BHO (C#)를 통해 IE 웹 페이지의 스냅 샷을 찍는 방법

내가 전화를 걸 : 나는 스냅 샷을 할 때 지금

[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(); 
    } 

:

public class ShowToolbarBHO : BandObjectLib.IObjectWithSite 
{ 

    IWebBrowser2 webBrowser = null; 

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

또한, 나는 P/다음 COM 메소드를 호출 : 여기에 내가 할 노력하고있어입니다 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에서 웹 페이지의 이미지를 찍는 데 사용된다는 사실을 웹에서 발견했습니다.

앞에서 원주민에서 PrintWindow()는 다음 CodeProject의의 페이지에 언급 된 방법을 사용하여 이미지를 캡처하고 있었다 - http://www.codeproject.com/KB/graphics/IECapture.aspx

그러나 이미지 크기가 엄청난입니다! 다른 기술을 사용하여 크기를 줄일 수 있는지 확인하려고했습니다. 위의 코드에서 누군가가 실수를 지적 할 수 있다면 좋을 것입니다 (많은 사람들이있을 것이라고 확신합니다).

감사합니다, 카필

+0

안녕하세요 도움이되기를 바랍니다 나는 IWebBrowser2에 대한 당신에게 질문이 있습니다. 'setSite'에서 문서의 로딩이 언제 완료되었는지 어떻게 알 수 있습니까? 나는 mshtml WebBrowser를 사용하고'.DocumentComplete'에 새로운 이벤트를 발생 시키지만 IWebBrowser2는 그것을 가지고 있지 않습니다. – thefoyer

답변

2

당신은 (IHTMLDocument3 인터페이스를 통해 가능) 문서 요소에 대한 IHTMLElementRender 인터페이스를 쿼리 및 비트 맵 페이지를 렌더링하는 DrawToDC 방법을 사용하려고 할 수 있습니다.

0

1 Microsoft의 설명서에 따르면 IHTMLElementRender :: DrawToDC는 더 이상 사용되지 않습니다. 그리고 내가 볼 수있는 한 플래시와 같은 물체와 캔버스는 그려지지 않습니다.

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); 

내가 너무 C#을 가진 BHO를 만드는 오전, 그것은

관련 문제