CopyFromScreen с другим поведением - PullRequest
0 голосов
/ 30 августа 2018

Я создал кнопку, чтобы сделать снимок экрана RichTextBox.

Итак, я взял ответ с этой страницы: как сохранить содержимое файла richtextbox-as-jpg-file

И стоит упомянуть, что

Это должно работать хорошо, если никакое другое окно не перекрывает ваш 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, а некоторые нет. На моих окнах 10 CopyFromScreen работает отлично, но на компьютере моего коллеги выходной файл JPG всегда содержит изображение окна saveFileDialog. Это означает, что окно saveFileDialog блокирует RTB, в результате чего CopyFromScreen захватывает окно saveFileDialog вместо RTB

вот вопрос:

Что вызывает другое поведение? (Захватить окно saveFileDialog окна или нет)

Почему это произошло, поскольку CopyFromScreen был запущен после закрытия окна saveFileDialog. Нет никакой причины, что CopyFromScreen захватывает изображение saveFileDialog окна

1 Ответ

0 голосов
/ 30 августа 2018

Похоже, у вас есть проблемы со временем. Вы (вероятно) снимаете экран до полного закрытия диалогового окна сохранения. Я думаю, что самое простое решение может быть следующим:

  1. Захват изображения.
  2. Показать диалог сохранения.
  3. Сохранить изображение.

Выражается как код:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...