Страница 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. Тоже одной строчкой. При приеме автоматически распаковываю. Была еще мысль дать возможность пользователям накидать на снимок пояснений. Но, поскольку оказалось, что функционал мало востребован, отложил в долгий ящик...