C# 捕获表单和表单上元素的屏幕截图

C# 捕获表单和表单上元素的屏幕截图,c#,bitmap,screenshot,C#,Bitmap,Screenshot,我正在尝试捕获主窗口的屏幕截图和主窗口上的内容。主窗口有时会位于其他元素后面,需要在没有其他重叠元素的情况下获取屏幕截图。此代码当前返回空白主窗口窗体的位图,没有任何内容。表单有一系列不同的动态UI元素。如何拍摄主窗口及其内容的当前屏幕截图/捕获?主窗口内容的代码可能很长,所以我希望这足够了 Rectangle bounds = new Rectangle(); bounds.Width = Program.MainWindow.Width; bounds.Height = Program.Ma

我正在尝试捕获主窗口的屏幕截图和主窗口上的内容。主窗口有时会位于其他元素后面,需要在没有其他重叠元素的情况下获取屏幕截图。此代码当前返回空白主窗口窗体的位图,没有任何内容。表单有一系列不同的动态UI元素。如何拍摄主窗口及其内容的当前屏幕截图/捕获?主窗口内容的代码可能很长,所以我希望这足够了

Rectangle bounds = new Rectangle();
bounds.Width = Program.MainWindow.Width;
bounds.Height = Program.MainWindow.Height;

screenShot = new Bitmap(Program.MainWindow.Width,
                       Program.MainWindow.Height,
                       PixelFormat.Format32bppRgb);
Program.MainWindow.DrawToBitmap(screenShot, bounds);

您应该能够通过使用
Graphics
类的
CopyFromScreen
方法获得它

        Rectangle bounds = Program.MainWindow.Bounds;
        Bitmap b = new Bitmap(bounds.Width, bounds.Height, PixelFormat.Format32bppArgb);
        using (Graphics g = Graphics.FromImage(b))
        {
            g.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy);
        }
        b.Save("YOUR FILE NAME HERE");

您是否尝试过
CopyFromScreen()
graphics类的成员?是的,但我从中获得了一个黑色位图OK,刚刚让CopyFromScreen()工作,但我希望它仅捕获主窗口窗体,而不是截图时将在过程中打开的其他两个窗体。有什么想法吗?请看下面我的答案。它应该使用主窗体的位置,假设这是
Program.MainWindow
指示的位置。如果解决方案解决了您的问题,请接受答案。@Yuval为什么删除您的帖子,我正在发布答案!这捕获了边界的屏幕截图,但我想要一个主窗口的屏幕截图,在某些情况下,它将在背景中。如果它在背景中,你将无法拍摄它。它必须在前台,否则就没有东西可以复制。您可以通过使用表单的图形对象来绕过它,但即使这样也不能保证有效。这一半解决了这个问题。最后,我遍历了主窗口顶部打开的表单元素,并将其不透明度设置为0,然后执行CopyFromScreen并将其不透明度重新设置为1。我知道这不是一个很好的方法,我相信有一个更好的方法,但现在这是可行的。谢谢你的帮助。