Screen.PrimaryScreen.Bounds.Width, Height, Size error - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь создать консольное приложение c#, которое делает снимок всего экрана, я знаю, что об этом много раз спрашивали на SO, но у меня проблема с этим, которую я просто не могу найти ответ на вопрос.

Это мой код:

Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
using (Graphics g = Graphics.FromImage(bmp))
{
 g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size);
 bmp.Save("screenshot.png");  // saves the image
}

Но по какой-то причине я получаю сообщение об ошибке

Название «Экран» делает не существует в текущем контексте

1 Ответ

0 голосов
/ 15 января 2020

Но по какой-то причине я получаю сообщение об ошибке: «Название« Экран »не существует в текущем контексте»

Причина этого заключается в том, что класс Screen принадлежит сборке System.Windows.Forms, на которую по умолчанию нет ссылки в консольном приложении.

Чтобы решить эту проблему, добавьте ссылку на сборку в свой проект, а затем добавьте using System.Windows.Forms в начало вашего файла кода.

Чтобы добавить ссылку:

  1. Щелкните правой кнопкой мыши свой проект в обозревателе решений и выберите «Добавить ссылку ...»
  2. В открывшемся окне Reference Manager перейдите к Assemblies -> Framework слева
  3. Прокрутите вниз среднее окно и установите флажок рядом с System.Windows.Forms
  4. Нажмите "OK" "

Затем добавьте оператор using в ваш файл кода, аналогично этому примеру на основе вашего кода:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Tests
{
    public class Program
    {
        public static Bitmap TakeScreenshot(string filePath = null)
        {
            var bounds = Screen.PrimaryScreen.Bounds;
            var bmp = new Bitmap(bounds.Width, bounds.Height);

            using (var g = Graphics.FromImage(bmp))
            {
                g.CopyFromScreen(0, 0, 0, 0, bounds.Size);
            }

            if (filePath != null) bmp.Save(filePath);

            return bmp;
        }

        public static void Main()
        {
            Console.WriteLine("Taking a screenshot now...");

            TakeScreenshot("screenshot.bmp");

            Console.WriteLine("\nDone! Press any key to exit...");
            Console.ReadKey();
        }
    }
}

Примечание: В наши дни многие пользователи имеют более одного монитора, поэтому, если вы хотите сделать снимок экрана, на котором * 103 5 * все экранов, вы можете создать прямоугольник, который охватывает все экраны:

public static Bitmap TakeScreenshot(string filePath = null)
{
    var rect = new Rectangle();

    // Take a screenshot that includes all screens by
    // creating a rectangle that captures all monitors
    foreach (var screen in Screen.AllScreens)
    {
        var bounds = screen.Bounds;
        var width = bounds.X + bounds.Width;
        var height = bounds.Y + bounds.Height;

        if (width > rect.Width) rect.Width = width;
        if (height > rect.Height) rect.Height = height;
    }

    var bmp = new Bitmap(rect.Width, rect.Height);

    using (var g = Graphics.FromImage(bmp))
    {
        g.CopyFromScreen(0, 0, 0, 0, rect.Size);
    }

    if (filePath != null) bmp.Save(filePath);

    return bmp;
}
...