栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

WebBrowser.DrawToBitmap()还是其他方法?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

WebBrowser.DrawToBitmap()还是其他方法?

Control.DrawToBitmap并不总是能正常工作,所以我诉诸于以下提供更一致结果的本机API调用:

实用程序类。调用Utilities.CaptureWindow(Control.Handle)捕获特定的控件:

public static class Utilities{    public static Image CaptureScreen()    {        return CaptureWindow(User32.GetDesktopWindow());    }    public static Image CaptureWindow(IntPtr handle)    {        IntPtr hdcSrc = User32.GetWindowDC(handle);        RECT windowRect = new RECT();        User32.GetWindowRect(handle, ref windowRect);        int width = windowRect.right - windowRect.left;        int height = windowRect.bottom - windowRect.top;        IntPtr hdcDest = Gdi32.CreateCompatibleDC(hdcSrc);        IntPtr hBitmap = Gdi32.CreateCompatibleBitmap(hdcSrc, width, height);        IntPtr hOld = Gdi32.SelectObject(hdcDest, hBitmap);        Gdi32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, ApiConstants.SRCCOPY);        Gdi32.SelectObject(hdcDest, hOld);        Gdi32.DeleteDC(hdcDest);        User32.ReleaseDC(handle, hdcSrc);        Image image = Image.FromHbitmap(hBitmap);        Gdi32.DeleteObject(hBitmap);        return image;    }}

Gdi32类:

public class Gdi32{    [Dllimport("gdi32.dll")]    public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hObjectSource, int nXSrc, int nYSrc, int dwRop);    [Dllimport("gdi32.dll")]    public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth, int nHeight);    [Dllimport("gdi32.dll")]    public static extern IntPtr CreateCompatibleDC(IntPtr hDC);    [Dllimport("gdi32.dll")]    public static extern bool DeleteDC(IntPtr hDC);    [Dllimport("gdi32.dll")]    public static extern bool DeleteObject(IntPtr hObject);    [Dllimport("gdi32.dll")]    public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);}

User32类:

public static class User32{    [Dllimport("user32.dll")]    public static extern IntPtr GetDesktopWindow();    [Dllimport("user32.dll")]    public static extern IntPtr GetWindowDC(IntPtr hWnd);    [Dllimport("user32.dll")]    public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect);    [Dllimport("user32.dll")]    public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);}

使用的常量:

    public const int SRCCOPY = 13369376;

使用的结构:

[StructLayout(LayoutKind.Sequential)]public struct RECT{    public int left;    public int top;    public int right;    public int bottom;}

友好的Control扩展方法:

public static class ControlExtensions{    public static Image DrawToImage(this Control control)    {        return Utilities.CaptureWindow(control.Handle);    }}

这是我CC.Utilities项目的代码段,我专门编写了该代码段,以从WebBrowser控件中截取屏幕截图。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/387996.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号