Справочник по C#

    Исходники по языку программирования CSharp

    Создание скриншота: Справочник по C#

    /
    /
    /
    73 Views



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


    Пример №1.
          В данном примере рассмотрено создание скриншота рабочего стола и выводом его в элемент управления «PictureBox».
          Создайте проект «Windows Form» в «Microsoft Visual Studio» и добавьте на главную форму вашего проекта элемент управления «PictureBox».
    Нажмите клавишу «F7», вы перейдете в редактор кода главной формы вашего проекта. Добавьте в код главной формы приведенный ниже листинг, создания скриншота.

    private static Bitmap CaptureScreen()
    {
    int screenWidth = Screen.PrimaryScreen.Bounds.Width;
    int screenHeight = Screen.PrimaryScreen.Bounds.Height;
    int screenX = Screen.PrimaryScreen.Bounds.X;
    int screenY = Screen.PrimaryScreen.Bounds.Y;
    
    Size boundsSize = Screen.PrimaryScreen.Bounds.Size;
    //Инициализирует новый экземпляр класса System.Drawing.Bitmap
    //заданными значениями размера и формата.
    Bitmap picture = new Bitmap(
    //Ширина в пикселях нового изображения System.Drawing.Bitmap.
    screenWidth,
    //Высота в пикселях нового изображения System.Drawing.Bitmap.
    screenHeight,
    //Указываем, что форматом отводится 32 бита на пиксель:
    // по 8 бит на красный,зеленый и синий каналы, а также альфа-канал.
    System.Drawing.Imaging.PixelFormat.Format32bppArgb);
    //Создаем новый объект System.Drawing.Graphics из
    //рисунка picture, с новым объектом System.Drawing.Graphics
    //для указанного объекта.
    Graphics graphics = Graphics.FromImage(picture);
    //Выполняем передачу данных о цвете, соответствующих
    //прямоугольной области пикселей, блоками битов с экрана на
    //поверхность рисования объекта System.Drawing.Graphics.
    graphics.CopyFromScreen(
    //Координата X точки в верхнем левом углу исходного прямоугольника.
    screenX,
    //Координата Y точки в верхнем левом углу исходного прямоугольника.
    screenY,
    //Координата X точки в верхнем левом углу конечного прямоугольника.
    0,
    //Координата Y точки в верхнем левом углу конечного прямоугольника.
    0,
    //Размер передаваемой области.
    boundsSize,
    //Область источника копируется прямо в область назначения.
    CopyPixelOperation.SourceCopy);
    //Возвращаем полученное изображение
    return picture;
    }

          Сделайте двойной клик левой клавишей мыши по любому свободному месту главной формы, вы перейдете в редактор кода с установкой курсора в автоматически созданном методе «Form1_Load», события «Load», выполняющегося при загрузке формы. Вставьте в тело данного метода приведенный ниже листинг, вызова метода создания скриншота рабочего стола главного экрана и вывода полученного изображения в элемент управления «PictureBox».

    pictureBox1.Image = CaptureScreen();

          Запустите проект, нажав на клавишу «F5». После успешной компиляции и запуска вашего проекта у вас откроется главная форма вашего проекта со скриншотом рабочего стола.

    Пример №2.
          Данный пример создает скриншот рабочего стола Windows с использованием «Windows API» функции «BitBlt».
          «BitBlt» — чрезвычайно эффективная операция, а потому почти все, что связано с отображением картинок и манипулировании ими, выполняется с ее помощью. Даже программное редактирование Графических изображений, предусматривающее манипулирование их частями, осуществляется с помощью операции «BitBlt» между контекстами устройств, представленными областями памяти.
          Название функции «BitBlt» происходит от слов «bit block transfer», означающих «перенос битового блока». На самом деле функция «BitBlt» позволяет делать намного больше, чем просто перенос блока пикселов. Эта функция может выполнить одну из 256 логических растровых операций над тремя наборами пикселов. Прототип функции имеет следующий вид:
    BOOL BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight,
    HDC hdcSrc, int nXSrc, int nYSrc. DWORD dwRop);

          Функция «BitBlt» передает прямоугольный блок пикселов с поверхности устройства-источника «hdcSrc» на поверхность устройства-приемника «hdcDest». Исходный прямоугольник определяется параметрами «nXSrc», «nYSrc», «nWidth», «nHeight» в логической системе координат контекста устройства-источника.
    Создайте проект «Windows Form» в «Microsoft Visual Studio» и добавьте на главную форму вашего проекта элементы управления «PictureBox».
          Нажмите клавишу «F7», вы перейдете в редактор кода главной формы вашего проекта. Добавьте в код главной формы, приведенный ниже листинг, импорта функций «BitBlt», «GetDesktopWindow» и «GetWindowDC» в данный проект, при помощи атрибута «DllImport», который находиться в пространстве имен «using System.Runtime.InteropServices». Атрибут «DllImport» сообщает компилятору, где находится точка входа, что позволяет далее вызывать функцию из нужного места.

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public extern static IntPtr GetDesktopWindow();
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern IntPtr GetWindowDC(IntPtr hwnd);
    [System.Runtime.InteropServices.DllImport("gdi32.dll")]
    public static extern UInt64 BitBlt
    (IntPtr hDestDC,
    int x, int y, int nWidth, int nHeight,
    IntPtr hSrcDC,
    int xSrc, int ySrc,
    System.Int32 dwRop);

          Сделайте двойной клик левой клавишей мыши по любому свободному месту главной формы, вы перейдете в редактор кода с установкой курсора в автоматически созданном методе «Form1_Load», события «Load», выполняющегося при загрузке формы. Вставьте в тело данного метода приведенный ниже листинг, вызова метода создания скриншота рабочего стола главного экрана и вывода полученного изображения в элемент управления «PictureBox».

    //Инициализируем новый экземпляр класса System.Drawing.Bitmap
    //с заданным размером. В качестве параметров нового изображения, передаем
    //ширину главного экрана в пикселях и высоту.
    Image myImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
    Screen.PrimaryScreen.Bounds.Height);
    //Создаем новый объект System.Drawing.Graphics из
    //рисунка myImage, с новым объектом System.Drawing.Graphics
    //для указанного объекта.
    Graphics grl = Graphics.FromImage(myImage);
    //Получаем дескриптор контекста устройства, связанный с
    //данным объектом System.Drawing.Graphics.
    IntPtr del = grl.GetHdc();
    //Получаем значение дескриптора окна рабочего стола Windows.
    //(Окно рабочего стола является областью, на верхней части
    //которой изображены все значки и другие окна). После чего
    //получаем идентификатоp контекста дисплея; 0 - если ошибка.
    IntPtr dc2 = GetWindowDC(GetDesktopWindow());
    //Функция BitBlt передает прямоугольный блок пикселов с поверхности
    //устройства-источника dc2 на поверхность устройства-приемника del
    BitBlt(del, 0, 0, Screen.PrimaryScreen.Bounds.Width,
    Screen.PrimaryScreen.Bounds.Height, dc2, 0, 0, 13369376);
    //Освобождаем дескриптор контекста устройства, полученный
    //в результате предыдущего вызова метода
    //System.Drawing.Graphics.GetHdc() данного объекта
    //System.Drawing.Graphics.
    grl.ReleaseHdc(del);
    //Сохраняем полученное изображение в директорию с запускаемым
    //файлом проекта.
    myImage.Save("screenshot.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
    //Выводим полученного изображения в элемент управления
    //pictureBox1.
    pictureBox1.Image = myImage;

          Запустите проект, нажав на клавишу «F5». После успешной компиляции и запуска вашего проекта у вас откроется главная форма вашего проекта со скриншотом рабочего стола, а в директории с исполняемым файлом вашего проекта, создастся файл «screenshot.jpg».

    Пример №3.
          Это еще одно решение для создания экранной копии (скриншота). Вообще говоря, это решение можно использовать для получения скриншота
    любой формы по известному дескриптору (handle). В данном примере будет выполняться создание скриншота главной формы текущего проекта, и сохранения полученного изображения в файл «bm.png», в директории с исполняемым файлом вашего проекта.
          Сделайте двойной клик левой клавишей мыши по любому свободному месту главной формы, вы перейдете в редактор кода с установкой курсора в автоматически созданном методе «Form1_Load», события «Load», выполняющегося при загрузке формы. Вставьте в тело данного метода приведенный ниже листинг создания скриншота главной формы текущего проекта и сохранения его в файл «screenshot.png», в директории с исполняемым файлом данного проекта.

    using (Bitmap bm = new Bitmap(Width + 2, Height + 2))
    {
    using (Graphics g = Graphics.FromImage(bm))
    {
    IntPtr dc = g.GetHdc();
    try
    {
    SendMessage(Handle, WM_PRINT,dc,
    DrawingOptions.PRF_CHILDREN |
    DrawingOptions.PRF_CLIENT |
    DrawingOptions.PRF_NONCLIENT);
    }
    finally
    {
    g.ReleaseHdc(dc);
    }
    bm.Save("screenshot.png");
    }
    }
    
    Close();

    Так же добавьте приведенный ниже код в листинг главной формы.

    [Flags]
    private enum DrawingOptions
    {
    PRF_CHECKVISIBLE = 0x00000001,
    PRF_NONCLIENT = 0x00000002,
    PRF_CLIENT = 0x00000004,
    PRF_ERASEBKGND = 0x00000008,
    PRF_CHILDREN = 0x00000010,
    PRF_OWNED = 0x00000020
    }
    private const int WM_PRINT = 0x0317;
    private const int WM_PRINTCLIENT = 0x0318;
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern int SendMessage(IntPtr hWnd, int msg,
    IntPtr dc, DrawingOptions opts);

          Запустите проект, нажав на клавишу «F5». После успешной компиляции и запуска, в директории с исполняемым файлом вашего проекта, создастся файл «screenshot.png».

    Пример №4.
          В данном примере рассмотрено получение скриншота окна приложения по его имени процесса. При запуске проекта будет получен список процессов имеющих графической интерфейс. При выборе определенного процесса из списка, в элементе управления «PictureBox» будет выведен его скриншот.
          Создайте проект «Windows Form» в «Microsoft Visual Studio» и добавьте на главную форму вашего проекта следующие элементы управления:

    • System.Windows.Forms.SplitContainer splitContainer1 – элемент управления, состоящий из подвижной строки, которая разделяет область отображения контейнера на две панели с изменяемыми размерами;
    • System.Windows.Forms.ListBox listBox1 – элемент управления для вывода списка процессов для которых может быть получен скриншот;
    • System.Windows.Forms.PictureBox pictureBox1 – элемент управления для вывода полученно скриншота для выбранного процесса;

    У вас получится приведенный ниже пример:

         Нажмите клавишу «F7», вы перейдете в редактор кода главной формы вашего проекта. Добавьте в код главной формы приведенный ниже листинг, создания скриншота.

    //Ручное расположение полей в памяти
    //используя атрибут StructLayout.
    [System.Runtime.InteropServices.StructLayout
    (System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct Rect
    {
    public int left;
    public int top;
    public int right;
    public int bottom;
    }
    
    //Функция SetForegroundWindow переводит поток, который создал определяемое окно
    //в приоритетный режим и активизирует окно. Ввод с клавиатуры направлен в окно,
    //а различные визуальные ориентиры изменяются для пользователя.
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern int SetForegroundWindow(IntPtr hWnd);
    
    //Переменная активации и отображения окна. Если окно минимизировано или развернуто,
    //Windows восстанавливает его в первоначальном размере
    //и позиции (то же самое, что и SW_SHOWNORMAL).
    private const int SW_RESTORE = 9;
    
    //Функция задающая, как должно быть показано окно.
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern IntPtr ShowWindow(IntPtr hWnd, int nCmdShow);
    
    //Функция GetWindowRect отыскивает размеры рамки ограничивающей
    //прямоугольник определяемого окна. Размеры даны в экранных
    //координатах, которые расположены относительно левого верхнего угла экрана.
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern IntPtr GetWindowRect(IntPtr hWnd, ref Rect rect);
    
    public Bitmap CaptureApplication(string procName)
    {
    //Объявляем новую переменную для
    //запрашиваемого процесса.
    System.Diagnostics.Process proc;
    
    try
    {
    //Получаем запрашиваемый процесс.
    proc = System.Diagnostics.Process.GetProcessesByName(procName)[0];
    }
    catch (IndexOutOfRangeException e)
    {
    //Процесс не был найден
    //Возвращаем пустое значение.
    return null;
    }
    
    //Активируем окно для снятия с него скриншота.
    //Если это не сделать, то будет получен скриншот
    //приложения расположенного поверх запрашиваемого.
    SetForegroundWindow(proc.MainWindowHandle);
    //Восстанавливаем окно, если оно свернуто.
    ShowWindow(proc.MainWindowHandle, SW_RESTORE);
    
    //Задержка, пока восстанавливается окно
    //запрашиваемого приложения.
    System.Threading.Thread.Sleep(1000);
    
    //Создаем новые размеры изображения.
    Rect rect = new Rect();
    IntPtr error = GetWindowRect(proc.MainWindowHandle, ref rect);
    
    // sometimes it gives error.
    while (error == (IntPtr)0)
    {
    error = GetWindowRect(proc.MainWindowHandle, ref rect);
    }
    //Получаем размеры ширины и высоты.
    int width = rect.right - rect.left;
    int height = rect.bottom - rect.top;
    
    //Инициализируем новый экземпляр класса System.Drawing.Bitmap
    //с заданными значениями размера и формата.
    Bitmap bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
    Graphics.FromImage(bmp).CopyFromScreen(rect.left,
    rect.top,
    0,
    0,
    new Size(width, height),
    CopyPixelOperation.SourceCopy);
    //Возвращаем полученное изображение.
    return bmp;
    }

          Перейдите в конструктор главной формы и сделайте двойной клик левой клавишей мыши по любому свободному месту главной формы, вы перейдете в редактор кода с установкой курсора в автоматически созданном методе «Form1_Load», события «Load», выполняющегося при загрузке формы. Вставьте в тело данного метода приведенный ниже листинг, получения списка имен процессов имеющих графический интерфейс.

    //Получаем список всех запущенных процессов.
    System.Diagnostics.Process[] procs =
    System.Diagnostics.Process.GetProcesses();
    //Проходимся по списку процессов и
    //добавляем в элемент управления listBox1
    //только те процессы, в которых есть заголовок
    //главного окна.
    foreach (System.Diagnostics.Process p in procs)
    {
    if (p.MainWindowTitle.Trim() != "")
    listBox1.Items.Add(p.ProcessName);
    }

          Вернитесь в конструктор главной формы и сделайте двойной клик левой клавишей мыши по элементу управления «listBox1». Вы перейдете в редактор кода с установкой курсора в автоматически созданном методе «listBox1_SelectedIndexChanged», события «SelectedIndexChanged», выполняющегося при выборе элемента из списка.

    //Выводим в элемент управления pictureBox1 полученное изображение.
    pictureBox1.Image = CaptureApplication(listBox1.SelectedItem.ToString());

          Запустите проект, нажав на клавишу «F5». После успешной компиляции и запуска вашего проекта у вас откроется главная форма вашего проекта с заполненным списком именами процессов имеющих графический интерфейс. Выберете любой процесс, в правой части главной формы у вас отобразится скриншот данного приложения.

    Создание скриншота: Справочник по C#

    0.00 (0%) 0 votes

    moyadcode13
    • Facebook
    • Twitter
    • Google+
    • Linkedin
    • Pinterest
    moyadcode10
    moyadcode11
    moyadcode9