1

我的问题与此有关:如何以编程方式获取 .Net WinForms 控件的屏幕截图?

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

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

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

4

2 回答 2

0

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

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

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

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

于 2011-09-28T09:29:11.027 回答
0

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

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);
于 2011-09-28T09:15:49.847 回答