Страница 1 из 1
Снимок экрана из программы
Добавлено: 10 Август 2015, 20:06
Игорь Столяров
Привет всем !
Помню, что когда-то этот вопрос обсуждался, но не помню нашли ли решение ...

Подскажите пожалуйста, можно ли сделать из программы на Clarion снимок текущего экрана ?
Желательно, что бы без внешних (и тем более платных) библиотек.
Заранее спасибо.

Снимок экрана из программы
Добавлено: 10 Август 2015, 20:35
Дед Пахом
мы пользовались FreeImage, думаю, на чистом API будет муторно всё это делать.
Снимок экрана из программы
Добавлено: 10 Август 2015, 20:40
Игорь Столяров
Чудесно. Можно ли просить пример выполнения снимка экрана на FreeImage ?

Снимок экрана из программы
Добавлено: 10 Август 2015, 21:17
Дед Пахом
Достаточно давно было... Вот вроде кусок, позволяющий сохранить снимок окна (WinCapture) и затем показать его в Image-контроле (Display):
Код: Выделить всё
BugZapperClass.Construct PROCEDURE()
CODE
SELF.FreeImage &= NEW FreeImageClass
BugZapperClass.Destruct PROCEDURE()
CODE
DISPOSE(SELF.FreeImage)
REMOVE(sImageFile)
BugZapperClass.WinCapture PROCEDURE(WINDOW pWin)
CODE
SELF.FreeImage.CaptureScreen(pWin)
BugZapperClass.Display PROCEDURE(WINDOW pWin, LONG pImgCtrlFeq)
CODE
SELF.FreeImage.iImage.CopyToImageControl(pWin, pImgCtrlFeq)
Снимок экрана из программы
Добавлено: 10 Август 2015, 21:22
Дед Пахом
посмотрел файл FreeImCl.clw, метод CaptureScreen имеет 2 варианта: (Window w) и (UNSIGNED hwnd), так что для снимка экрана наверно подойдёт вызов CaptureScreen(0)
Снимок экрана из программы
Добавлено: 10 Август 2015, 21:27
Игорь Столяров
Понял, спасибо. Поставлю FreeImage и буду рыть в этом направлении.

Снимок экрана из программы
Добавлено: 12 Август 2015, 6:35
Игорь Столяров
Дед Пахом писал(а): так что для снимка экрана наверно подойдёт вызов CaptureScreen(0)
Спасибо, но не совсем так. Т.к. примеров снимка экрана в FreeImage нет, вот пример этого кода.
Может кому-нибудь и пригодится, хорошая опция для запросов "непродвинутых" юзеров в тех. поддержку ...
Код: Выделить всё
CapScreen PROCEDURE (hWindow_)
theImage cfiImageControl
Window WINDOW,AT(,,1,1),SYSTEM,GRAY,MDI
region,AT(0,0),USE(?ImageControl),FULL
end
Code
Open(Window)
Window{Prop:Hide} = True
If theImage.iImageControl.Init(?ImageControl) <> False
theImage.iImage.CaptureScreen(Int(hWindow_))
theImage.iImage.SetSaveOption(JPEG_QUALITYSUPERB)
If theImage.iImage.SaveAs('C:\CaptureScreen.jpg') = False then Message('Ошибка сохранения картинки !').
end
Close(Window)
! Пример вызова - сделать снимок главного окна программы
Start(CapScreen,25000,AppFrame{Prop:Handle})
Снимок экрана из программы
Добавлено: 12 Август 2015, 10:13
finsoftrz
Да и на win api это достаточно просто делается. Где-то в архивах на этом форуме был класс Андрея Мялина для сохранения снимка окна в bmp-файл. Я использую эту функцию в 3 случаях.
1. Во всех окнах на горячих клавишах. Кроме снимка окна выводится имя app и имя процедуры (чтобы быстро найти в app).
2. Просмотр экрана другого работающего в программе пользователя.
3. Автоматическая отправка содержимого экрана через ftp во встроенной системе суппорта.
Снимок экрана из программы
Добавлено: 12 Август 2015, 11:11
Игорь Столяров
Ну да, всегда приятно когда есть категории людей у которых мысли сходятся ...

Мы просто делаем снимок главного окна со всем его содержимым и отправку в почту с описанием.
В принципе, если посмотреть исходники FreeImage - эти операции все на WinAPI + приятный бонус
в виде сохранения рисунка в JPG одной строкой кода.

Снимок экрана из программы
Добавлено: 12 Август 2015, 12:30
finsoftrz
Я перед отправкой зипую с помощью zlib. Тоже одной строчкой. При приеме автоматически распаковываю. Была еще мысль дать возможность пользователям накидать на снимок пояснений. Но, поскольку оказалось, что функционал мало востребован, отложил в долгий ящик...