You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Form.DrawToBitmap获取不含边框的窗体图像?

我来给你几个靠谱的方案,不用切换窗体边框样式就能拿到不含边框的窗体位图:

方案1:调整DrawToBitmap的绘制区域,只捕获客户区

直接利用窗体的ClientRectangle(客户区,不含边框的区域)来指定绘制范围,全程不需要修改窗体样式:

// 创建与客户区尺寸匹配的位图
Bitmap clientBitmap = new Bitmap(this.ClientSize.Width, this.ClientSize.Height);

// 定义要绘制的窗体区域:就是客户区(相对于窗体自身的坐标)
Rectangle sourceClientArea = this.ClientRectangle;

// 调用DrawToBitmap,把窗体的客户区绘制到位图的整个区域
this.DrawToBitmap(clientBitmap, new Rectangle(0, 0, sourceClientArea.Width, sourceClientArea.Height));

// 后续可以保存或使用clientBitmap
clientBitmap.Save("client_area.png");
clientBitmap.Dispose();

这个方法的优势是基于窗体自身的绘制逻辑,即使窗体被其他窗口遮挡,也能正确获取窗体本身的内容(而不是屏幕上的显示内容)。

方案2:使用Graphics.CopyFromScreen直接捕获屏幕上的客户区

如果你需要的是屏幕上实际显示的客户区内容(比如包含用户当前的操作状态),可以用这个方法,直接从屏幕拷贝像素:

// 获取客户区左上角在屏幕上的绝对坐标
Point clientScreenLocation = this.PointToScreen(Point.Empty);

// 创建与客户区尺寸匹配的位图
Bitmap screenCapture = new Bitmap(this.ClientSize.Width, this.ClientSize.Height);

using (Graphics g = Graphics.FromImage(screenCapture))
{
    // 从屏幕的客户区位置,拷贝内容到位图
    g.CopyFromScreen(clientScreenLocation, Point.Empty, this.ClientSize);
}

// 使用或保存位图
screenCapture.Save("screen_client.png");
screenCapture.Dispose();

注意:如果你的窗体被其他窗口遮挡,这个方法会捕获到遮挡后的内容,这一点和方案1不同,你可以根据实际需求选择。

为什么这两个方法可行?
  • 方案1利用ClientRectangle直接定位窗体内部的无边框区域,DrawToBitmap会只绘制你指定的这个区域,自然不会包含边框。
  • 方案2跳过了窗体的边框部分,直接捕获屏幕上客户区的像素,完全不需要触碰窗体的边框样式。

内容的提问来源于stack exchange,提问作者Jtoomer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:35:57