如何捕获窗口截图?我的C#窗口截图代码生成空白图片
窗口截图生成空图片的问题排查与解决
我看到你遇到了窗口截图生成空图的问题,而且已经确认窗口句柄和GetWindowRect功能正常,那咱们直接揪出代码里的关键错误:
你的CopyFromScreen调用参数写错了!看这一行:
gfxScreenshot.CopyFromScreen(window.Left, window.Right, 0, 0, size, CopyPixelOperation.SourceCopy);
CopyFromScreen的第二个参数是源区域的左上角Y坐标,但你传成了window.Right(窗口的右边界X坐标),这就导致截图的起始Y位置远远超出了窗口的实际范围,自然截不到任何内容,最终生成空图片。
修正后的代码
把第二个参数改成window.Top就可以正常截图了,优化后的ScreenShotWindow方法如下:
public static void ScreenShotWindow(IntPtr whandle) { // 获取窗口矩形区域 Rect window = new Rect(); GetWindowRect(whandle, ref window); // 计算窗口尺寸 int width = window.Right - window.Left; int height = window.Bottom - window.Top; Size size = new Size(width, height); // 简化尺寸初始化写法 // 创建对应尺寸的位图 var bmpScreenshot = new Bitmap(width, height, PixelFormat.Format32bppArgb); // 从位图创建绘图对象 var gfxScreenshot = Graphics.FromImage(bmpScreenshot); // 修正:第二个参数改为窗口的Top坐标 gfxScreenshot.CopyFromScreen(window.Left, window.Top, 0, 0, size, CopyPixelOperation.SourceCopy); // 保存截图到指定路径 bmpScreenshot.Save("Screenshot.png", ImageFormat.Png); }
额外注意事项
- 确保目标窗口没有被最小化,最小化状态下的窗口无法通过这种方式捕获截图
- 如果程序运行在高DPI(如125%/150%缩放)系统上,建议在项目中启用DPI感知,避免截图出现偏移或模糊问题,可以通过添加应用程序清单来配置
内容的提问来源于stack exchange,提问作者kuhi




