- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在 try catch WebBrowser 控件的内容。 DrawToBitmap()
可以完美运行,但 WebBrowser 控件的文档不支持它。我一直在尝试寻找另一种方法来捕获 WebBrowser 控件的内容并将它们保存到本地镜像文件。
有没有人有任何解决方法或其他方法来将 WebBrowser 控件的内容保存到本地镜像文件?
最佳答案
Control.DrawToBitmap 并不总是有效,因此我求助于以下提供更一致结果的 native 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;
}
友好的控件扩展方法:
public static class ControlExtensions
{
public static Image DrawToImage(this Control control)
{
return Utilities.CaptureWindow(control.Handle);
}
}
这是我的 CC.Utilities 的代码片段项目,我专门编写它以从 WebBrowser 控件截取屏幕截图。
关于c# - WebBrowser.DrawToBitmap() 或其他方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2434156/
我正在尝试使用 visual studio 2008 C++ Windows 窗体应用程序通过绘制到位图来打印 datagridview,但是我在转换标题中提到的 2 种类型时遇到了问题。这是被调用的
我目前有这段有用的代码,是我在 StackOverflow 的其他地方找到的: form.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.He
我使用 Gecko .NET WebBrowser 控件来获取 HTML 页面。 然后我使用这段代码制作这个 HTML 页面的屏幕截图: void LoadingFinished(object sen
我使用 Gecko .NET WebBrowser 控件来获取 HTML 页面。 然后我使用这段代码制作这个 HTML 页面的屏幕截图: void LoadingFinished(object sen
简短问题: 如何将隐藏的 ActiveX 控件的副本绘制到位图中? 较长的问题: 我有一个显示图像的 ActiveX 控件。我想将它隐藏在某些东西后面(例如面板),将显示复制到位图以便能够对其进行处理
在 Winform 应用程序中,我有一个用户控件;在其上绘制矩形,圆形等形状。我正在尝试使用 DrawToBitmap() 方法拍摄相同的快照。我有一个固定大小(300 x 300)的位图,用户控件的
如果我有一个 richTextBox 并在其上运行 DrawToBitmap,它不会在 richTextBox 中绘制任何文本。 Bitmap b = new Bitmap(rtb.Width, rt
我正在使用 DrawToBitmap 将一些标签保存为图像。我想知道如何改变这些图像的分辨率,有什么办法吗?假设我有一个带有文本的标签,我想将其呈现为图像文件(不发布完整代码): this.label
我有一个 pictureBox 正在通过 dll 调用在外部绘制。 private void myPictureBox_Paint(object sender, PaintEventArgs e) {
所以我编写了一个类,其中存储了一些测试结果信息,然后是一个向用户显示该信息的控件。我想在此类上放置一个打印功能,以全页大小绘制控件并进行打印。但是它总是空白。该代码将面板视为控件,因为它可能是其他类型
我一直在我的 asp.net 页面中使用 WebBrowser.DrawtoBitmap() 在单独的 STA 线程中运行以将网页捕获为图像。但我发现我一直在为少数网站获取空白图像。我知道该方法不受“
我正在 try catch WebBrowser 控件的内容。 DrawToBitmap() 可以完美运行,但 WebBrowser 控件的文档不支持它。我一直在尝试寻找另一种方法来捕获 WebBro
我有一个显示车牌号的用户控件(它包含背景图像和一些文本框),我使用 DrawToBitmap() 方法获取此控件的位图并显示位图在我的表单上,它在 Windows 7 上运行良好,但在 Windows
我正在创建一个 Label,有时我会使用 .DrawToBitmap()。我不知道为什么,但在我运行我的程序一段时间后(并经常调用 .DrawToBitmap())我得到了异常: System.Arg
根据以下链接和我的控制台应用程序,DrawToBitmap 方法不考虑不透明度。 证明链接: http://social.msdn.microsoft.com/Forums/vstudio/en-US
这个问题在这里已经有了答案: Take screenshot from window content (without border) (1 个回答) 关闭 4 年前。 我有一个表单,其中有一个覆盖
我是一名优秀的程序员,十分优秀!