CopyFromScreen具有不同的行为

时间:2018-08-30 01:32:46

标签: c# .net winforms

我创建了一个按钮来捕获RichTextBox的屏幕截图。

所以我从本页上得到了答案:how-to-save-the-content-of-richtextbox-as-jpg-file

并提到

  

只要没有其他窗口与您的实时出价重叠,此方法就应该可以正常工作。

但并非总是如此

这是我的代码:

class ScreenCapture
{
    public static void Capture(RichTextBox rtb, string filename)
    {
        rtb.Update();  // Ensure RTB fully painted
        Bitmap bmp = new Bitmap(rtb.Width, rtb.Height);
        using (Graphics gr = Graphics.FromImage(bmp))
        {
            gr.CopyFromScreen(rtb.PointToScreen(Point.Empty), Point.Empty, rtb.Size);
        }
        bmp.Save(filename, ImageFormat.Jpeg);
        bmp.Dispose();
    }
}

在我的表单中:

partial class Form1
{
    private void Btn_Screenshot_Click(object sender, EventArgs e)
    {
        var result = saveScreenshotDialog.ShowDialog();
        var fileName = saveScreenshotDialog.FileName;
        if (result == DialogResult.OK)
        {
            ScreenCapture.Capture(this.rtb_Result, fileName);
        }
    }
}

如上面的代码,我使用saveFileDialog来让用户决定将JPG文件保存在何处

在某些机器上,CopyFromScreen会捕获saveFileDialog窗口的img,而有些则不会。在Windows 10上,CopyFromScreen可以完美运行,但是在同事的机器上,输出JPG文件始终包含saveFileDialog窗口的img。这意味着saveFileDialog窗口阻止了RTB,导致CopyFromScreen捕获了saveFileDialog窗口而不是RTB

这是问题:

是什么导致了不同的行为?(是否捕获saveFileDialog窗口的img)

为什么会这样,因为CopyFromScreen窗口关闭后触发了saveFileDialogCopyFromScreen没有理由捕获saveFileDialog窗口的img

1 个答案:

答案 0 :(得分:0)

听起来您有计时问题。在保存对话框完全关闭之前,您正在(可能)捕获屏幕。我认为最简单的解决方案如下:

  1. 捕获图像。
  2. 显示保存对话框。
  3. 保存图像。

表示为代码:

csv.DictReader