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
그러나 이미지 크기가 엄청난입니다! 다른 기술을 사용하여 크기를 줄일 수 있는지 확인하려고했습니다. 위의 코드에서 누군가가 실수를 지적 할 수 있다면 좋을 것입니다 (많은 사람들이있을 것이라고 확신합니다).
감사합니다, 카필
안녕하세요 도움이되기를 바랍니다 나는 IWebBrowser2에 대한 당신에게 질문이 있습니다. 'setSite'에서 문서의 로딩이 언제 완료되었는지 어떻게 알 수 있습니까? 나는 mshtml WebBrowser를 사용하고'.DocumentComplete'에 새로운 이벤트를 발생 시키지만 IWebBrowser2는 그것을 가지고 있지 않습니다. – thefoyer