brunnengi Опубликовано 11 октября, 2014 Поделиться Опубликовано 11 октября, 2014 Здравствуйте. Ищу того кто сможет создать рабочий пример на Firemonkey по созданию PrintScreen (скриншотов): Всего рабочего стола Части (регион) рабочего стола Чужого окна (включая и игры в оконном режиме) Части (регион) чужого окна. Платформа Windows. Важна также скорость получения скринов - т.е. вариант с перебором попиксельно, к примеру, всех цветов экрана с занесением их в TImage не требуется. Цитата Ссылка на комментарий
Администраторы Brovin Yaroslav Опубликовано 14 октября, 2014 Администраторы Поделиться Опубликовано 14 октября, 2014 Добрый день, Могу предложить в качестве базового способ получения скриншота всего рабочего стола. 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); указывать нужную область копирования. Либо, продвинутый вариант. Это для конкретного окна находить хендл и делает скриншот только одного окна. Alex7wrt 1 Цитата Ссылка на комментарий
brunnengi Опубликовано 14 октября, 2014 Автор Поделиться Опубликовано 14 октября, 2014 А как вывести картинку сразу в 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. Цитата Ссылка на комментарий
Администраторы Brovin Yaroslav Опубликовано 14 октября, 2014 Администраторы Поделиться Опубликовано 14 октября, 2014 TBitmap от VCL не заменяет и не является частью TBitmap от FMX. Это принципиально разные объекты. Поэтому нужна конвертация. Например так: [Windows] Как подружить HBITMAP и TBitmap? Andrey Efimov 1 Цитата Ссылка на комментарий
loony-pants Опубликовано 23 марта, 2015 Поделиться Опубликовано 23 марта, 2015 Вопрос также по скриншотам. Имеется rectangle, на котром расположен некий компонент (с компонентом я еще не определился, т.к. ранее скриншоты не делал вообще), будь то TImage, tColorBox или же TPaintBox. На данном компоненте динамически создаются изображения, которые я могу перемещать и изменять их размер. Задача - после размещения всех нужных мне TImage сохранить скриншот данного компонента. Какие компоненты и функции для этого подойдут лучше всего? Платформа: Windows x32/x64 Цитата Ссылка на комментарий
Вячеслав Опубликовано 23 марта, 2015 Поделиться Опубликовано 23 марта, 2015 Ну вот же. Там все очень доступно и подробно. А вообще поиск по форуму еще никто не отменял. Цитата Ссылка на комментарий
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.