C# CopyFromScreen具有不同的行为
我创建了一个按钮来捕获RichTextBox的屏幕截图 所以我从这一页上得到了答案: 它提到 只要没有其他窗口与RTB重叠,这应该可以很好地工作 但这种情况并不总是发生 这是我的密码: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
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只是测试您的代码,并且工作正常。谢谢。