【问题标题】:C# Screenshot of Control is white控件的C#屏幕截图是白色的
【发布时间】:2011-09-28 09:10:03
【问题描述】:

我的问题与这个有关:How to get a screen capture of a .Net WinForms control programmatically?

我想在 C# 中截取 System.Windows.Forms.Control 的屏幕截图。我正在使用上面链接的问题中建议的 DrawToBitmap 方法,并且大部分时间都有效。但是也有一些问题。

问题 1
我有两个标签页,我们称它们为 A 和 B。我要截屏的控件在标签页 B 中。我想在按下标签页 A 中的按钮时截屏。这在大多数情况下都有效,除非尚未访问标签页 B:然后屏幕截图只是白色的。如果我首先访问标签页 B,然后返回标签页 A 并单击按钮截取屏幕截图,则它可以正常工作。我猜这是因为尚未完成选项卡中控件的一些加载或构建,但我不确定到底是什么(或者它可能完全是其他东西)。我一直在尝试使用 ResumeLayout、PerformLayout、Show、Update、Invalidate 强制加载或构建,但这不起作用。
编辑:设法通过使用 DrawToBitmap 解决了这个问题包含标签页控件而不是控件本身并在该标签页上执行显示。

问题 2:
当我截取某个自定义控件(UserControl 的子类)的屏幕截图时,屏幕截图中有一个小的矩形白色区域(显然不应该有一个)。矩形区域不在控件的某个特定部分,如按钮或文本框,所以我不确定是什么原因造成的。在其他自定义控件(也是 UserControl 的子类)上,它工作正常,所以这本身不是问题。
编辑: 解决了,那里有一个空控件正在绘制最重要的是。将该控件的 Visible 设置为 false 解决了它。

【问题讨论】:

  • 我在 .net 2.0 中将DrawToBitmap 与我的自定义控件一起使用,并且没有任何额外的白色矩形。你的控件有透明的部分吗?

标签: c# .net controls screenshot drawtobitmap


【解决方案1】:

你可以用这段代码来做,剩下的工作和找到正确的坐标是让读者做功课。

int screenWidth = Screen.GetBounds(new Point(0, 0)).Width;
int screenHeight = Screen.GetBounds(new Point(0, 0)).Height;
Bitmap bmpScreenShot = new Bitmap(screenWidth, screenHeight);
Graphics gfx = Graphics.FromImage((Image)bmpScreenShot);
gfx.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth, screenHeight));
bmpScreenShot.Save("test.jpg", ImageFormat.Jpeg);

【讨论】:

  • 那根本行不通。这会截取屏幕上当前显示的内容。我想要的屏幕截图是在当前不在屏幕上的选项卡中。请认真阅读我的帖子。
  • @Luis 如果选项卡 B 在那一刻处于非活动状态,则屏幕截图将无法正确制作:(
【解决方案2】:

对于问题1:如果“如果我首先访问标签页B,然后返回标签页A并单击按钮截屏则可以正常工作”然后添加模仿该动作的formloadevent:

tabControl.SelectedIndex = IndexOfTabB;
tabControl.SelectedIndex = IndexOfTabA;

这是技巧,但它会起作用。

对于问题2:你能比较你的控件大小和它的截图并给我们结果吗?如果 Control.Width 不等于位图屏幕的宽度,那么这是一个真正的问题。

【讨论】:

  • 我设法使用不同的方法解决了问题 1(请参阅我编辑的问题),但无论如何感谢您的帮助。如果您对问题 2 有任何想法,请告诉我。