Saving screenshots of open Windows with graphic files

This forum is for eXpress++ general support.
Message
Author
User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Saving screenshots of open Windows with graphic files

#11 Post by Eugene Lutsenko »

Thanks, Roger! Thanks, Tom!

It turned out that the program lacked:

Code: Select all

#define KEYEVENTF_KEYUP     0x02
#define VK_MENU             0x12
#define VK_SNAPSHOT         0x2C
#DEFINE VK_LBUTTON          0x01
#DEFINE VK_RBUTTON          0x02
[/size]
Everything works fine! Thank you! That's what you need. Now I can turn on the system mode logging all screenshots in the course of their appearance in a separate folder (in the right order). After that, it will be enough to place them in a separate file to create a presentation or other description of the work. It's convenient for educational purposes. Thank you!

PS
I have installed Yandex-disk, which when you put the information in the clipboard immediately displays scissors and I do not know how to Unscrew it. But this is minor.

User avatar
Tom
Posts: 1171
Joined: Thu Jan 28, 2010 12:59 am
Location: Berlin, Germany

Re: Saving screenshots of open Windows with graphic files

#12 Post by Tom »

Great!

But one correction: "nResolution" should be "nCompression". It's not the resolution you set with the 3rd parameter of ":SaveFile()", but the JPG-compression. 0 (zero) is none (best quality, big file), 100 is maximum (worst quality, small file). I also recommend to use PNG (XBPBMP_FORMAT_PNG) instead of JPG.
Best regards,
Tom

"Did I offend you?"
"No."
"Okay, give me a second chance."

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Saving screenshots of open Windows with graphic files

#13 Post by Eugene Lutsenko »

Thanks, Tom!

Understood. Another question. How can I use this function to capture an image of an active window like this? And it turns out. The correct second picture.

Code: Select all

DCSETPARENT oBrowGrSc
   DCBROWSECOL FIELD Gr_OpSc->KOD_GrOS  HEADER L('Код градации'                            ) WIDTH 1  PROTECT {|| .T. };
               COLOR {||IIF(AT('SPECTRINTERV:',Opis_Sc->NAME_OpSc)=0,nil,{nil,GraMakeRGBColor({VAL(SUBSTR(Gr_OpSc->NAME_GrOS, AT('{', Gr_OpSc->NAME_GrOS)+1, AT('{', Gr_OpSc->NAME_GrOS)+ 3-AT('{', Gr_OpSc->NAME_GrOS)+1+1)),VAL(SUBSTR(Gr_OpSc->NAME_GrOS, AT('{', Gr_OpSc->NAME_GrOS)+5, AT('{', Gr_OpSc->NAME_GrOS)+ 7-AT('{', Gr_OpSc->NAME_GrOS)+5+1)),VAL(SUBSTR(Gr_OpSc->NAME_GrOS, AT('{', Gr_OpSc->NAME_GrOS)+9, AT('{', Gr_OpSc->NAME_GrOS)+11-AT('{', Gr_OpSc->NAME_GrOS)+9+1))})})}       // Вывод поля цветом RGB
   DCBROWSECOL FIELD Gr_OpSc->NAME_GrOS HEADER L('Наименование градации описательной шкалы') WIDTH 42
   DCBROWSECOL FIELD Gr_OpSc->INT_INF   HEADER L('Информативность'                         ) WIDTH 1
   DCBROWSECOL FIELD Gr_OpSc->ABS       HEADER L('N объектов об.выб.(абс)'                 ) WIDTH 3
   DCBROWSECOL FIELD Gr_OpSc->PERC_FIZ  HEADER L('N объектов об.выб.(%)'                   ) WIDTH 3

DCGETOPTIONS SAYFONT '10.Helv Bold' TABSTOP AUTORESIZE

cTitle = L('2.2. Описательные шкалы и градации. Текущая модель: "')+UPPER(Ar_Model[M_CurrInf])+'"'

DCREAD GUI ;
   FIT ;
   OPTIONS GetOptions ;
   MODAL ;
   TITLE cTitle ;
   EVAL {|o|SetAppFocus(oBrowScale:GetColumn(1))}

   SaveScreenAsFile('F2_2.jpg')
[/size]
And where then to set resolution:

Code: Select all

******************************************************************************************
******** Запись скриншота активного окна в виде файла. 
******** Joined: Thu Jan 28, 2010 10:59 am, Posts: 667, Location: Berlin, Germany
*******  http://bb.donnay-software.com/donnay/viewtopic.php?f=2&t=2401&sid=4855442dd13ea455a60bad9915ac4054 
******************************************************************************************
FUNCTION SaveScreenAsFile(cFileName)         // hand over filename you want to use
LOCAL oClipBoard, oPicture, nCompression := 5, nResolution := 600
DC_Scrn2Clipboard()
oClipBoard := XbpClipBoard():new():create()
oClipBoard:open()
oPicture := oClipBoard:GetBuffer(XBPCLPBRD_BITMAP)
oClipBoard:Close()
oPicture:SaveFile(cFileName,XBPBMP_FORMAT_JPG,nResolution)
RETURN File(cFileName)
[/size]
Attachments
F2_2.jpg
F2_2.jpg (71.36 KiB) Viewed 12722 times
Без имени-1.jpg
Без имени-1.jpg (74.94 KiB) Viewed 12723 times

User avatar
Tom
Posts: 1171
Joined: Thu Jan 28, 2010 12:59 am
Location: Berlin, Germany

Re: Saving screenshots of open Windows with graphic files

#14 Post by Tom »

You can hand any object to DC_Scrn2Clipboard() as a parameter, so it saves the object:

Code: Select all

FUNCTION SaveScreenAsFile(oObject,cFileName)         // hand over filename you want to use
LOCAL oClipBoard, oPicture, nCompression := 5, nResolution := 600
DC_Scrn2Clipboard(oObject)
"oObject" maybe a dialog, a drawing area or, for example, a browse on a dialog.

BTW, you changed to "nCompression", but you need to change it here aswell:

Code: Select all

oPicture:SaveFile(cFileName,XBPBMP_FORMAT_JPG,nCompression) // last para!
Best regards,
Tom

"Did I offend you?"
"No."
"Okay, give me a second chance."

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Saving screenshots of open Windows with graphic files

#15 Post by Eugene Lutsenko »

I'm sorry, Tom, for being bothersome and incomprehensible. But so far not really get what I would like. Below is a piece of source text that displays the window shown above. I would like to record an image of this window as a high quality file (with high resolution and low compression). The view of the function itself is below. And the execution error too

Code: Select all

/* ----- Create browse-1 ----- */

bScale := {|| Gr_OpSc->(DC_SetScope(0,Opis_Sc->KOD_OpSc)), ;
              Gr_OpSc->(DC_SetScope(1,Opis_Sc->KOD_OpSc)), ;
              Gr_OpSc->(DC_DbGoTop()), ;
              oBrowGrSc:refreshAll() }

@ 1, 0 DCBROWSE oBrowScale ALIAS 'Opis_Sc' SIZE 48,26 ;
       EDIT xbeBRW_ItemSelected MODE DCGUI_BROWSE_EDITDOWN ;            // Редактирование БД Opis_Sc
       NOSOFTTRACK ;
       SCOPE ;
       ITEMMARKED {|| Eval(bScale), ;
                      DC_GetRefresh(GetList,, ;
                      DCGETREFRESH_TYPE_EXCLUDE,{GETLIST_BROWSE}) }

DCSETPARENT oBrowScale
DCBROWSECOL FIELD Opis_Sc->KOD_OpSc  HEADER L('Код шкалы'                      ) WIDTH 1  PROTECT {|| .T. }
DCBROWSECOL FIELD Opis_Sc->NAME_OpSc HEADER L('Наименование описательной шкалы') WIDTH 22
DCBROWSECOL FIELD Opis_Sc->INT_INF   HEADER L('Информативность'                ) WIDTH 1


/* ----- Create browse-2 ----- */

DCSETPARENT TO

@ 1,50 DCBROWSE oBrowGrSc ALIAS 'Gr_OpSc' SIZE 82,26 ;
       EDIT xbeBRW_ItemSelected MODE DCGUI_BROWSE_EDITDOWN ;
       NOSOFTTRACK ;
       SCOPE ;
       ITEMMARKED bItems;
       COLOR {||IIF(2*INT(Gr_OpSc->KOD_GrOS/2)==Gr_OpSc->KOD_GrOS,nil,{nil,GraMakeRGBColor({230,252,213})})}          // Вывод строки цветом RGB

*********************

*        mPosR1 = AT('{', mScName)+1
*        mPosR2 = mPosR1+2
*        mPosG1 = mPosR2+2
*        mPosG2 = mPosG1+2
*        mPosB1 = mPosG2+2
*        mPosB2 = mPosB1+2

*        mRed   = VAL(SUBSTR(mScName, mPosR1, mPosR2-mPosR1+1))
*        mGreen = VAL(SUBSTR(mScName, mPosG1, mPosG2-mPosG1+1))
*        mBlue  = VAL(SUBSTR(mScName, mPosB1, mPosB2-mPosB1+1))

*********************

*        mPosR1 = AT('{', Gr_OpSc->NAME_GrOS)+1
*        mPosR2 = AT('{', Gr_OpSc->NAME_GrOS)+3
*        mPosG1 = AT('{', Gr_OpSc->NAME_GrOS)+5
*        mPosG2 = AT('{', Gr_OpSc->NAME_GrOS)+7
*        mPosB1 = AT('{', Gr_OpSc->NAME_GrOS)+9
*        mPosB2 = AT('{', Gr_OpSc->NAME_GrOS)+11

*        mRed   = VAL(SUBSTR(Gr_OpSc->NAME_GrOS, AT('{', Gr_OpSc->NAME_GrOS)+1, AT('{', Gr_OpSc->NAME_GrOS)+ 3-AT('{', Gr_OpSc->NAME_GrOS)+1+1))
*        mGreen = VAL(SUBSTR(Gr_OpSc->NAME_GrOS, AT('{', Gr_OpSc->NAME_GrOS)+5, AT('{', Gr_OpSc->NAME_GrOS)+ 7-AT('{', Gr_OpSc->NAME_GrOS)+5+1))
*        mBlue  = VAL(SUBSTR(Gr_OpSc->NAME_GrOS, AT('{', Gr_OpSc->NAME_GrOS)+9, AT('{', Gr_OpSc->NAME_GrOS)+11-AT('{', Gr_OpSc->NAME_GrOS)+9+1))

*********************

DCSETPARENT oBrowGrSc
   DCBROWSECOL FIELD Gr_OpSc->KOD_GrOS  HEADER L('Код градации'                            ) WIDTH 1  PROTECT {|| .T. };
               COLOR {||IIF(AT('SPECTRINTERV:',Opis_Sc->NAME_OpSc)=0,nil,{nil,GraMakeRGBColor({VAL(SUBSTR(Gr_OpSc->NAME_GrOS, AT('{', Gr_OpSc->NAME_GrOS)+1, AT('{', Gr_OpSc->NAME_GrOS)+ 3-AT('{', Gr_OpSc->NAME_GrOS)+1+1)),VAL(SUBSTR(Gr_OpSc->NAME_GrOS, AT('{', Gr_OpSc->NAME_GrOS)+5, AT('{', Gr_OpSc->NAME_GrOS)+ 7-AT('{', Gr_OpSc->NAME_GrOS)+5+1)),VAL(SUBSTR(Gr_OpSc->NAME_GrOS, AT('{', Gr_OpSc->NAME_GrOS)+9, AT('{', Gr_OpSc->NAME_GrOS)+11-AT('{', Gr_OpSc->NAME_GrOS)+9+1))})})}       // Вывод поля цветом RGB
   DCBROWSECOL FIELD Gr_OpSc->NAME_GrOS HEADER L('Наименование градации описательной шкалы') WIDTH 42
   DCBROWSECOL FIELD Gr_OpSc->INT_INF   HEADER L('Информативность'                         ) WIDTH 1
   DCBROWSECOL FIELD Gr_OpSc->ABS       HEADER L('N объектов об.выб.(абс)'                 ) WIDTH 3
   DCBROWSECOL FIELD Gr_OpSc->PERC_FIZ  HEADER L('N объектов об.выб.(%)'                   ) WIDTH 3

DCGETOPTIONS SAYFONT '10.Helv Bold' TABSTOP AUTORESIZE

cTitle = L('2.2. Описательные шкалы и градации. Текущая модель: "')+UPPER(Ar_Model[M_CurrInf])+'"'

DCREAD GUI ;
   FIT ;
   OPTIONS GetOptions ;
   MODAL ;
   TITLE cTitle ;
   EVAL {|o|SetAppFocus(oBrowScale:GetColumn(1))}

   SaveScreenAsFile(oBrowScale, 'F2_2.jpg')
[/size]

Code: Select all

FUNCTION SaveScreenAsFile (oWind, cFileName)          // hand over filename you want to use
LOCAL oClipBoard, oPicture, nCompression := 5, nResolution := 600
DC_Scrn2Clipboard (oWind)
oClipBoard := XbpClipBoard():new():create()
oClipBoard:open()
oPicture := oClipBoard:GetBuffer(XBPCLPBRD_BITMAP)
oClipBoard:Close()
oPicture:SaveFile(cFileName,XBPBMP_FORMAT_JPG,nCompression)
RETURN File(cFileName)
[/size]
Attachments
Безымянный.jpg
Безымянный.jpg (75.85 KiB) Viewed 12713 times

Wolfgang Ciriack
Posts: 479
Joined: Wed Jan 27, 2010 10:25 pm
Location: Berlin Germany

Re: Saving screenshots of open Windows with graphic files

#16 Post by Wolfgang Ciriack »

You can not save the screen after the dialog has ended (is destroyed).
Put you SaveScreen.. to the ABORTQUERY, CLOSEQUERY codeblock of DCGET OPTIONS.
f.e. DCGET OPTION CLOSEQUERY MSG {|| SaveScreenToFile(...), .T. }
_______________________
Best Regards
Wolfgang

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Saving screenshots of open Windows with graphic files

#17 Post by Eugene Lutsenko »

Thanks, Wolfgang! I had this idea, but I didn't know how to do it. I'm going to give it a go.
This feature works well for me:

Code: Select all

FUNCTION DC_Scrn2ImageFile( oXbp, cFileName, nFormat )

LOCAL oSourcePS, oBitmap, oClipBoard, aPos

oSourcePS := oXbp:lockPS()
IF oXbp:isDerivedFrom('XbpDialog')
  aPos := { -4, -4 }
ELSE
  aPos := { 0, 0 }
ENDIF
oBitmap := GraSaveScreen( oSourcePS, aPos, oXbp:currentSize() )
RETURN oBitMap:saveFile( cFileName, nFormat )
[/size]

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Saving screenshots of open Windows with graphic files

#18 Post by Eugene Lutsenko »

Experimented. Really works the first option proposed by Tom. And after the window is displayed. The only drawback: displays the main screen of the system and its background the current window. And I would like only the current window. Other options don't work at all.

Code: Select all

FUNCTION SaveScreenAsFile(cFileName) // hand over filename you want to use
LOCAL oClipBoard, oPicture, nResolution := 30
DC_Scrn2Clipboard()
oClipBoard := XbpClipBoard():new():create()
oClipBoard:open()
oPicture := oClipBoard:GetBuffer(XBPCLPBRD_BITMAP)
oClipBoard:Close()
oPicture:SaveFile(cFileName,XBPBMP_FORMAT_JPG,nResolution)
RETURN File(cFileName)
[/size]

Code: Select all

/* ----- Create browse-1 ----- */

bScale := {|| Gr_OpSc->(DC_SetScope(0,Opis_Sc->KOD_OpSc)), ;
              Gr_OpSc->(DC_SetScope(1,Opis_Sc->KOD_OpSc)), ;
              Gr_OpSc->(DC_DbGoTop()), ;
              oBrowGrSc:refreshAll() }

@ 1, 0 DCBROWSE oBrowScale ALIAS 'Opis_Sc' SIZE 48,26 ;
       EDIT xbeBRW_ItemSelected MODE DCGUI_BROWSE_EDITDOWN ;            // Редактирование БД Opis_Sc
       NOSOFTTRACK ;
       SCOPE ;
       ITEMMARKED {|| Eval(bScale), ;
                      DC_GetRefresh(GetList,, ;
                      DCGETREFRESH_TYPE_EXCLUDE,{GETLIST_BROWSE}) }

DCSETPARENT oBrowScale
DCBROWSECOL FIELD Opis_Sc->KOD_OpSc  HEADER L('Код шкалы'                      ) WIDTH 1  PROTECT {|| .T. }
DCBROWSECOL FIELD Opis_Sc->NAME_OpSc HEADER L('Наименование описательной шкалы') WIDTH 22
DCBROWSECOL FIELD Opis_Sc->INT_INF   HEADER L('Информативность'                ) WIDTH 1


/* ----- Create browse-2 ----- */

DCSETPARENT TO

@ 1,50 DCBROWSE oBrowGrSc ALIAS 'Gr_OpSc' SIZE 82,26 ;
       EDIT xbeBRW_ItemSelected MODE DCGUI_BROWSE_EDITDOWN ;
       NOSOFTTRACK ;
       SCOPE ;
       ITEMMARKED bItems;
       COLOR {||IIF(2*INT(Gr_OpSc->KOD_GrOS/2)==Gr_OpSc->KOD_GrOS,nil,{nil,GraMakeRGBColor({230,252,213})})}          

DCSETPARENT oBrowGrSc
   DCBROWSECOL FIELD Gr_OpSc->KOD_GrOS  HEADER L('Код градации'                            ) WIDTH 1  PROTECT {|| .T. };
               COLOR {||IIF(AT('SPECTRINTERV:',Opis_Sc->NAME_OpSc)=0,nil,{nil,GraMakeRGBColor({VAL(SUBSTR(Gr_OpSc->NAME_GrOS, AT('{', Gr_OpSc->NAME_GrOS)+1, AT('{', Gr_OpSc->NAME_GrOS)+ 3-AT('{', Gr_OpSc->NAME_GrOS)+1+1)),VAL(SUBSTR(Gr_OpSc->NAME_GrOS, AT('{', Gr_OpSc->NAME_GrOS)+5, AT('{', Gr_OpSc->NAME_GrOS)+ 7-AT('{', Gr_OpSc->NAME_GrOS)+5+1)),VAL(SUBSTR(Gr_OpSc->NAME_GrOS, AT('{', Gr_OpSc->NAME_GrOS)+9, AT('{', Gr_OpSc->NAME_GrOS)+11-AT('{', Gr_OpSc->NAME_GrOS)+9+1))})})}       // Вывод поля цветом RGB
   DCBROWSECOL FIELD Gr_OpSc->NAME_GrOS HEADER L('Наименование градации описательной шкалы') WIDTH 42
   DCBROWSECOL FIELD Gr_OpSc->INT_INF   HEADER L('Информативность'                         ) WIDTH 1
   DCBROWSECOL FIELD Gr_OpSc->ABS       HEADER L('N объектов об.выб.(абс)'                 ) WIDTH 3
   DCBROWSECOL FIELD Gr_OpSc->PERC_FIZ  HEADER L('N объектов об.выб.(%)'                   ) WIDTH 3

DCGETOPTIONS SAYFONT '10.Helv Bold' TABSTOP AUTORESIZE

cTitle = L('2.2. Описательные шкалы и градации. Текущая модель: "')+UPPER(Ar_Model[M_CurrInf])+'"'

DCREAD GUI ;
   FIT ;
   OPTIONS GetOptions ;
   MODAL ;
   TITLE cTitle ;
   EVAL {|o|SetAppFocus(oBrowScale:GetColumn(1))}

   SaveScreenAsFile('F2_2.jpg')
[/size]
Attachments
F2_2.jpg
F2_2.jpg (56.12 KiB) Viewed 12698 times

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Saving screenshots of open Windows with graphic files

#19 Post by Eugene Lutsenko »

Tom! Your program writes the previous clipboard contents to the file, not the new ones (the actual screen content at the time of the program launch)

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Saving screenshots of open Windows with graphic files

#20 Post by Eugene Lutsenko »

Tom wrote:..."oObject" maybe a dialog, a drawing area or, for example, a browse on a dialog.
Hi, Tom! And what is the variable in my case (in the examples I gave) " browse on a dialog"? There are two Windows with the attitude: "one to many"

Post Reply