Перейти к содержанию
Fire Monkey от А до Я

[XE7] Создание PrintScreen'ов полных и части экранов


Рекомендуемые сообщения

Здравствуйте.

Ищу того кто сможет создать рабочий пример на Firemonkey по созданию PrintScreen (скриншотов):

  1. Всего рабочего стола
  2. Части (регион) рабочего стола
  3. Чужого окна (включая и игры в оконном режиме)
  4. Части (регион) чужого окна.

Платформа Windows.

Важна также скорость получения скринов - т.е. вариант с перебором попиксельно, к примеру, всех цветов экрана с занесением их в TImage не требуется.

Ссылка на комментарий
  • Администраторы

Добрый день,

 

Могу предложить в качестве базового способ получения скриншота всего рабочего стола. 

1. Делаем скриншота рабочего стола по хендлу:

function MakeWindowScreenShot(const AWindowHandle: HWND): TBitmap;
var
  VCLBitmap: TBitmap;
  WindowRect: TRect;
begin
  VCLBitmap := TBitmap.Create;
  try
    WindowRect := Rect(0, 0, Screen.DesktopWidth, Screen.DesktopHeight);
    VCLBitmap.Width := WindowRect.Width;
    VCLBitmap.Height := WindowRect.Height;
    BitBlt(VCLBitmap.Canvas.Handle, WindowRect.Left, WindowRect.Top, WindowRect.Width, WindowRect.Height, AWindowHandle, 0, 0, SRCCOPY);
  except
    VCLBitmap := nil;
  end;
  Result := VCLBitmap;
end;

2. Далее получаем хендл рабочего стола, делаем скриншот и сохраняем скриншот в файл:

procedure MakeScreenShotOfDesktop(const AFileName: string);
var
  DCDesk: HDC;
  VCLBitmap: TBitmap;
  DesktopWindow: HWND;
begin
  DesktopWindow := GetDesktopWindow;
  DCDesk := GetWindowDC(DesktopWindow);
  try
    VCLBitmap := MakeWindowScreenShot(DCDesk);
    try
      if VCLBitmap <> nil then
        VCLBitmap.SaveToFile(AFileName);
    finally
      VCLBitmap.Free;
    end;
  finally
    ReleaseDC(DesktopWindow, DCDesk);
  end;
end;

Соответственно далее, можно от этого отталкиваться и делать копирование только требуемой части рабочего стола (регион, окно). Для этого нужно в строке:

BitBlt(VCLBitmap.Canvas.Handle, WindowRect.Left, WindowRect.Top, WindowRect.Width, WindowRect.Height, AWindowHandle, 0, 0, SRCCOPY);

указывать нужную область копирования.

 

Либо, продвинутый вариант. Это для конкретного окна находить хендл и делает скриншот только одного окна.

Ссылка на комментарий

А как вывести картинку сразу в TImage? А то ошибки сыпет.

Т.е. чтобы приведенный код заработал я добавил в Uses пару модулей Winapi.Windows, Vcl.Graphics.

И как следствие при попытке присвоить результат функции MakeWindowScreenShot к TImage я получаю:

E2010 Incompatible types: 'FMX.Graphics.TBitmap' and 'Vcl.Graphics.TBitmap'

 

Ну или если пытаюсь сделать так: Form1.Image1.Bitmap.Assign(VCLBitmap);

То получаю: Cannot assign a TBitmap to a TBitmapOfItem.

Ссылка на комментарий
  • Администраторы

TBitmap от VCL не заменяет и не является частью TBitmap от FMX. Это принципиально разные объекты.

Поэтому нужна конвертация. Например так: [Windows] Как подружить HBITMAP и TBitmap?

Ссылка на комментарий
  • 5 месяцев спустя...

Вопрос также по скриншотам. Имеется rectangle, на котром расположен некий компонент (с компонентом я еще не определился, т.к. ранее скриншоты не делал вообще), будь то TImage, tColorBox или же TPaintBox. На данном компоненте динамически создаются изображения, которые я могу перемещать и изменять их размер. Задача - после размещения всех нужных мне TImage сохранить скриншот данного компонента. Какие компоненты и функции для этого подойдут лучше всего? Платформа: Windows x32/x64

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...