Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CopyFromScreen具有不同的行为_C#_.net_Winforms - Fatal编程技术网

C# CopyFromScreen具有不同的行为

C# CopyFromScreen具有不同的行为,c#,.net,winforms,C#,.net,Winforms,我创建了一个按钮来捕获RichTextBox的屏幕截图 所以我从这一页上得到了答案: 它提到 只要没有其他窗口与RTB重叠,这应该可以很好地工作 但这种情况并不总是发生 这是我的密码: class ScreenCapture { public static void Capture(RichTextBox rtb, string filename) { rtb.Update(); // Ensure RTB fully painted Bitma

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

所以我从这一页上得到了答案:

它提到

只要没有其他窗口与RTB重叠,这应该可以很好地工作

但这种情况并不总是发生

这是我的密码:

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,而有些机器则没有。在我的Windows10上,CopyFromScreen工作得很好,但在我同事的机器上,输出的JPG文件总是包含saveFileDialog窗口的img。这意味着saveFileDialog窗口会阻止RTB,从而导致CopyFromScreen捕获saveFileDialog窗口而不是RTB

问题是:

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

为什么会发生这种情况,因为
CopyFromScreen
是在
saveFileDialog
窗口关闭后触发的。
没有理由让
CopyFromScreen
捕获
saveFileDialog
window

的img,这听起来像是时间问题。您(可能)在“保存”对话框完全关闭之前捕获屏幕。我认为最简单的解决办法可能是:

  • 捕捉图像
  • 显示“保存”对话框
  • 保存图像
  • 以代码表示:

    private void Btn_Screenshot_Click(object sender, EventArgs e)
    {
        using (var bmp = ScreenCapture.Capture(this.rtb_Result))
        {
            var result = saveScreenshotDialog.ShowDialog();
            var fileName = saveScreenshotDialog.FileName;
            if (result == DialogResult.OK)
            {
                ScreenCapture.Save(bmp, fileName);
            }
        }
    }
    
    public static Bitmap Capture(RichTextBox rtb)
    {
        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);
        }
        return bmp;
    }
    
    public static void Save(Bitmap bmp, string filename)
    {
        bmp.Save(filename, ImageFormat.Jpeg);
    }
    

    在不起作用的机器上,你得到了什么结果?@John在我的windows 10上,CopyFromScreen工作得很好,但在我同事的机器上,输出JPG文件总是包含saveFileDialog窗口的img。这意味着saveFileDialog窗口会阻止RTB,导致CopyFromScreen捕获saveFileDialog窗口而不是RTBI只是测试您的代码,并且工作正常。谢谢。