Как сделать скришот?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как сделать скришот?

Сообщение shade » 27.10.2008 22:11:21

Пишем небольшую утилиту делающую скришоты. Есть Windows-версия на Delphi, хотелось портировать на Lazarus, чтобы работало и в Windows и в *nix.

Есть какой-то кроссплатформный способ?
Если нет, то как сделать это на *nix'ах ?
Нужно делать как снимок всего окна, так и снимок одно отдельно взятого окна, типа как KSnapshot.

PS: кроме собственно делания снимков будет одна приятная вкусность о которой узнаете после выхода первой версии :wink:
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Re: Как сделать скришот?

Сообщение Andreich » 28.10.2008 00:10:42

Все довольно просто,... Под Win32 не проверял, а под Linux работает как часы!

Код: Выделить всё
uses ..., LCLIntf, LCLType;

...

procedure TForm1.Button1Click(Sender: TObject);
var
  MyBitmap: TBitmap;
  ScreenDC: HDC;
begin
  MyBitmap := TBitmap.Create;
  ScreenDC := GetDC(0);
  MyBitmap.LoadFromDevice(ScreenDC);
  Image.Picture.Bitmap:=MyBitmap;
  MyBitmap.Free;
end;
Последний раз редактировалось Andreich 28.10.2008 01:05:11, всего редактировалось 2 раз(а).
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Как сделать скришот?

Сообщение B4rr4cuda » 28.10.2008 00:12:37

Код: Выделить всё
/opt/freepascal/lib/fpc/fpc-2.2.0/packages/base/imagemagick/demo2/screenshot.lpr

Код: Выделить всё
/opt/freepascal/lib/fpc/fpc-2.2.2/packages/imagemagick/examples/screenshot.lpr
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: Как сделать скришот?

Сообщение shade » 28.10.2008 18:13:04

Andreich
Спасибо :)

Ещё пара сопутствующих вопросов:

1. есть экранные координаты точки, как определить окно над которыми она находиться? Т.е. как узнать хендл, который нужно передать функции GetDC ?

2. Как узнать размеры найденого (п.1.) окна ? (гы, сам догадался: GetWindowRect :D )

Попробовал: ScreenDC := GetDC(Form1.Handle);
чтобы сделать снимок самой формы, но почему в снимок не папали заголовок и рамка окна :(
Можно конечно сделать снимок всего экрана с последущей обрезкой, но может есть более прямое решение?

Добавлено спустя 6 минут 5 секунд:
B4rr4cuda писал(а):/opt/freepascal/lib/fpc/fpc-2.2.2/packages/imagemagick/examples/screenshot.lpr

Работает через xwd, ни айс :(
Код: Выделить всё
  shellStr := 'xwd -root -out ' + TempDir + 'display.xwd';


Добавлено спустя 40 минут 3 секунды:
shade писал(а):1. есть экранные координаты точки, как определить окно над которыми она находиться? Т.е. как узнать хендл, который нужно передать функции GetDC ?

Нашел метод WindowFromPoint, пока не проверял, но столкнулся с другой проблемой:

3. Как захватить мышь? На WinAPI -> SetCapture, в LCLIntf тоже есть, но не работает, form1.CaptureMouseButtons тоже :(

Добавлено спустя 2 часа 34 минуты 29 секунд:
Млин, WindowFromPoint возвращает 0 (GTK2) :(
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 44

Рейтинг@Mail.ru