Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Копирование содержимого экрана на форму

Delphi , ОС и Железо , Монитор и Экран

Копирование содержимого экрана на форму


var
  Image3: TImage;

procedure TSaverForm.CopyScreen;
var

  DeskTopDC: HDc;
  DeskTopCanvas: TCanvas;
  DeskTopRect: TRect;
begin

  Image3 := TImage.Create(SaverForm);
  with Image3 do
  begin
    Height := Screen.Height;
    Width := Screen.Width;
  end;
  Image3.Canvas.copymode := cmSrcCopy;
  DeskTopDC := GetWindowDC(GetDeskTopWindow);
  DeskTopCanvas := TCanvas.Create;
  DeskTopCanvas.Handle := DeskTopDC;
  Image3.Canvas.CopyRect(Image3.Canvas.ClipRect, DeskTopCanvas,
    DeskTopCanvas.ClipRect);
  Image2.Picture.Assign(Image3.Picture);
  {image2 расположен на целевой форме и выровнен по области клиента}
end;

procedure TSaverForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin

  Image3.Free;
end;

В настоящее время я также разбираюсь в других ответах на мой вопрос.

Попробуйте следующий HAX 244, взятый из Авг/Сен номера журнала Visual Developer. Это работает, и работает хорошо.


{ смотри текстовое описание за последним END. }
unit Scrncap;

interface
uses WinTypes, WinProcs, Forms, Classes, Graphics;

function CaptureScreenRect(ARect: TRect): TBitmap;
function CaptureScreen: TBitmap;
function CaptureClientImage(Control: TControl): TBitmap;
function CaptureControlImage(Control: TControl): TBitmap;

implementation

{ используем следующий код для захвата прямоугольной области экрана }

function CaptureScreenRect(ARect: TRect): TBitmap;
var
  ScreenDC: HDC;
begin

  Result := TBitmap.Create;
  with Result, ARect do
  begin
    Width := Right - Left;
    Height := Bottom - Top;

    ScreenDC := GetDC(0);
    try
      BitBlt(Canvas.Handle, 0, 0, Width, Height,
        ScreenDC, Left, Top, SRCCOPY);
    finally
      ReleaseDC(0, ScreenDC);
    end;
  end;
end;

{ используем следующий код для захвата целого экрана }

function CaptureScreen: TBitmap;
begin

  with Screen do
    Result := CaptureScreenRect(Rect(0, 0, Width, Height));
end;

{ используем следующий код для захвата клиентской области
формы или элемента управления...}

function CaptureClientImage(Control: TControl): TBitmap;
begin

  with Control, Control.ClientOrigin do
    Result := CaptureScreenRect(Bounds(X, Y, ClientWidth,

      ClientHeight));
end;

{ используйте следующий код для захвата целой формы
или элемента управления  }

function CaptureControlImage(Control: TControl): TBitmap;
begin

  with Control do
    if Parent = nil then
      Result := CaptureScreenRect(Bounds(Left, Top, Width,
        Height))
    else
      with Parent.ClientToScreen(Point(Left, Top)) do
        Result := CaptureScreenRect(Bounds(X, Y, Width, Height));
end;

end.

{
Источник:  Visual Developer, HAX #244, Авг/Сент 1996

захват экрана с помощью Delphi

В Delphi, если вы хотите получить изображение клиентской области формы,
необходимо вызвать GetFormlmage. Но иногда возникает необходимость
получения снимка формы целиком, вместе с заголовком, контуром и всем
содержимым. Или целиком всего экрана. Если бы у вас был дефицит времени,
мы бы в этом случае посоветовали показывать диалоговое окно с надписью
"Теперь нажмите кнопку Print Screen!", после чего работать с
изображением, помещенным в буфер обмена.

Но мы никуда не спешим. Комбинирование хостов Delphi с несколькими
функциями GDI сводят задачу получения снимка экрана всего к одной
строчке кода.

CaptureScreenRect, в листинге 1, демонстрирует это. Код получает
экранный контекст устройства с помощью GetDC(O), и затем копирует
прямоугольную область этого DC на холст изображения (Bitmap). Для
копирования используется BitBlt. Смысл использования BitBlt (и
любой функции GDI) в том, что Delphi помнит, что дескриптор холста
есть DC, необходимый Windows.

Остальные функции копирования экрана в листинге 1 захватывают
прямоугольник и отдает реальную работу на откуп CaptureScreenRect.
CaptureScreen захватывает для прямоугольника целый экран.
CaptureClientImage и CaptureControlImage захватывают прямоугольник
области клиента и элемента управления, соответственно.

Эти четыре функции могут быть использованы для захвата любой
произвольной области экрана, а также экранных областей форм,
кнопок, полей редактирования, ComboBox'ов и пр.. Не забывайте
после работы освобождать используемые вами картинки (Bitmap). }

Перевод контента на русский язык:

Код, который вы предоставили, это программный код Delphi, который захватывает содержимое экрана и сохраняет его в компоненте изображения (TImage) на форме. Процедура CopyScreen использует функции GDI (GetWindowDC, BitBlt) для захвата прямоугольника рабочего стола и копирования его в канвас TImage.

Вот некоторые предложения по улучшению кода:

  1. Обработка ошибок: Код не обрабатывает ошибки, которые могут возникнуть при вызове функций GDI (например, GetWindowDC или BitBlt). Нужно добавить код проверки ошибок, чтобы программа правильно работала в случае ошибки.
  2. Организация кода: Процедура CopyScreen слишком длинная и выполняет несколько задач. Рекомендуется разбить ее на более маленькие процедуры, каждая из которых отвечает за конкретную задачу (например, захват прямоугольника рабочего стола, копирование изображения).
  3. Оптимизация производительности: Захват всей экранной области может быть ресурсоемкой операцией. Если вам нужно только захватить определенный регион экрана, рекомендуется использовать CaptureScreenRect вместо CopyScreen.
  4. Обработка изображений: Код предполагает, что компонент TImage уже создан и инициализирован. Нужно убедиться, что изображение правильно выделено и освобождается, когда оно больше не нужно.

Относительно альтернативного решения, предложенного в статье HAX 244:

  1. Функции CaptureScreenRect, CaptureScreen, CaptureClientImage и CaptureControlImage могут быть использованы для захвата различных регионов экрана.
  2. Код использует функции GDI (GetDC, BitBlt) для захвата содержимого экрана, что является более эффективным подходом, чем использовать Delphi-специфическую функцию GetFormImage.
  3. Код предоставляет четкое пример использования этих функций для захвата всей экранной области, клиентской области формы или контроля.

В целом, оба решения имеют свои сильные и слабые стороны. Оригинальный код может быть более компактным, но альтернативное решение более гибкое и повторно используемое.

Копирование содержимого экрана на форму - способ захвата любых областей экрана, форм и элементов управления с помощью функций GDI в Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Монитор и Экран ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-28 05:35:17/0.0038940906524658/0