Kbase P26493: How to capture and print the whole SCREEN image or just the active WINDOW image regardless of the Wi
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  10/09/2009 |
|
Status: Verified
GOAL:
How to capture and print the whole SCREEN image or just the active WINDOW image regardless of the Windows OS version?
FACT(s) (Environment):
Windows
Progress 8.x
Progress 9.x
OpenEdge 10.x
FIX:
/* ******************************************************************** */
/* LOAD and RUN this solution code from the Progress Procedure Editor */
/* *************************** Definitions ************************** */
&Scoped-define WINDOW-NAME C-Win
&SCOPED-DEFINE KEYEVENTF_KEYUP 2
&SCOPED-DEFINE VK_SNAPSHOT 44
&SCOPED-DEFINE VK_MENU 18
/* *********************** Control Definitions ********************** */
DEFINE VAR C-Win AS WIDGET-HANDLE NO-UNDO.
DEFINE BUTTON btnScreen
LABEL "Print &Screen"
SIZE 25 BY 1.14.
DEFINE BUTTON btnWindow
LABEL "Print &Window"
SIZE 27 BY 1.14.
/* ************************ Frame Definitions *********************** */
DEFINE FRAME DEFAULT-FRAME
btnScreen AT ROW 7.67 COL 11
btnWindow AT ROW 7.67 COL 44
WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY
SIDE-LABELS NO-UNDERLINE THREE-D
AT COL 1 ROW 1
SIZE 80 BY 16.
/* ************************* Create Window ************************** */
IF SESSION:DISPLAY-TYPE = "GUI":U THEN
CREATE WINDOW C-Win ASSIGN
HIDDEN = YES
TITLE = "Capture & print SCREEN and active WINDOW image"
HEIGHT = 16
WIDTH = 80
MAX-HEIGHT = 34.33
MAX-WIDTH = 204.8
VIRTUAL-HEIGHT = 34.33
VIRTUAL-WIDTH = 204.8
RESIZE = yes
SCROLL-BARS = no
STATUS-AREA = no
BGCOLOR = ?
FGCOLOR = ?
KEEP-FRAME-Z-ORDER = yes
THREE-D = yes
MESSAGE-AREA = no
SENSITIVE = yes.
ELSE {&WINDOW-NAME} = CURRENT-WINDOW.
IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(C-Win)
THEN C-Win:HIDDEN = no.
/* ************************ Control Triggers ************************ */
ON END-ERROR OF C-Win
OR ENDKEY OF {&WINDOW-NAME} ANYWHERE DO:
IF THIS-PROCEDURE:PERSISTENT THEN RETURN NO-APPLY.
END.
ON WINDOW-CLOSE OF C-Win
DO:
APPLY "CLOSE":U TO THIS-PROCEDURE.
RETURN NO-APPLY.
END.
/* *** Capture whole SCREEN image to the CLIPBOARD buffer *** */
ON CHOOSE OF btnScreen IN FRAME DEFAULT-FRAME /* Print Screen */
DO:
DEFINE VARIABLE dwMajorVersion AS INTEGER NO-UNDO.
RUN getWindowsMajorVersion(OUTPUT dwMajorVersion).
IF dwMajorVersion > 4 THEN
RUN keybd_event({&VK_SNAPSHOT}, 0, 0, 0).
ELSE
RUN keybd_event({&VK_SNAPSHOT}, 1, 0, 0).
RUN printUsingMicrosoftWord (INPUT "Screen").
END.
/* *** Capture active WINDOW image to the CLIPBOARD buffer ** */
ON CHOOSE OF btnWindow IN FRAME DEFAULT-FRAME /* Print Window */
DO:
DEFINE VARIABLE dwMajorVersion AS INTEGER NO-UNDO.
RUN getWindowsMajorVersion(OUTPUT dwMajorVersion).
IF dwMajorVersion > 4 THEN
RUN keybd_event({&VK_SNAPSHOT}, 1, 0, 0).
ELSE DO:
RUN keybd_event({&VK_MENU}, 0, 0, 0).
RUN keybd_event({&VK_SNAPSHOT}, 0, 0, 0).
RUN keybd_event({&VK_SNAPSHOT}, 0, {&KEYEVENTF_KEYUP}, 0).
RUN keybd_event({&VK_MENU}, 0, {&KEYEVENTF_KEYUP}, 0).
END.
RUN printUsingMicrosoftWord (INPUT "Window").
END.
/* *************************** Main Block *************************** */
ASSIGN CURRENT-WINDOW = {&WINDOW-NAME}
THIS-PROCEDURE:CURRENT-WINDOW = {&WINDOW-NAME}.
ON CLOSE OF THIS-PROCEDURE
RUN disable_UI.
PAUSE 0 BEFORE-HIDE.
MAIN-BLOCK:
DO ON ERROR UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK
ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK:
RUN enable_UI.
IF NOT THIS-PR.OCEDURE:PERSISTENT THEN
WAIT-FOR CLOSE OF THIS-PROCEDURE.
END.
/* ********************** PROCEDURE enable_UI *********************** */
PROCEDURE enable_UI :
ENABLE btnScreen btnWindow WITH FRAME DEFAULT-FRAME IN WINDOW C-Win.
VIEW C-Win.
END PROCEDURE.
/* *********************** PROCEDURE disable_UI ********************* */
PROCEDURE disable_UI :
IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(C-Win)
THEN DELETE WIDGET C-Win.
IF THIS-PROCEDURE:PERSISTENT THEN DELETE PROCEDURE THIS-PROCEDURE.
END PROCEDURE.
/* ******************** PROCEDURE GetVersionExA ********************* */
PROCEDURE GetVersionExA EXTERNAL "KERNEL32.DLL" :
DEFINE INPUT PARAMETER OSVERSIONINFO AS LONG.
DEFINE RETURN PARAMETER ReturnValue AS LONG.
END PROCEDURE.
/* ******************** PROCEDURE keybd_event *********************** */
PROCEDURE keybd_event EXTERNAL "USER32.DLL":U:
DEFINE INPUT PARAMETER bVk AS SHORT.
DEFINE INPUT PARAMETER bScan AS SHORT.
DEFINE INPUT PARAMETER dwFlags AS LONG.
DEFINE INPUT PARAMETER dwExtraInfo AS LONG.
END PROCEDURE.
/* *************** PROCEDURE getWindowsMajorVersion ***************** */
PROCEDURE getWindowsMajorVersion :
DEFINE VARIABLE OSVERSIONINFO AS MEMPTR NO-UNDO.
DEFINE VARIABLE dwOSVersionInfoSize AS INTEGER NO-UNDO.
DEFINE VARIABLE iReturnResult AS INTEGER NO-UNDO.
DEFINE OUTPUT PARAMETER dwMajorVersion AS INTEGER NO-UNDO.
ASSIGN
dwOSVersionInfoSize = 148
SET-SIZE(OSVERSIONINFO) = dwOSVersionInfoSize
PUT-LONG(OSVERSIONINFO,1) = dwOSVersionInfoSize.
RUN GetVersionExA (GET-POINTER-VALUE(OSVERSIONINFO), OUTPUT iReturnResult ).
ASSIGN
dwMajorVersion = GET-LONG(OSVERSIONINFO, 5).
END PROCEDURE.
/* *************** PROCEDURE printUsingMicrosoftWord ***************** */
PROCEDURE printUsingMicrosoftWord :
DEFINE VARIABLE hWord AS COM-HANDLE NO-UNDO.
DEFINE INPUT PARAMETER pcPrintObject AS CHARACTER NO-UNDO.
CREATE "Word.Application":U hWord NO-ERROR.
hWord:VISIBLE = FALSE.
hWord:Documents:ADD().
NO-RETURN-VALUE hWord:Selection:Paste().
NO-RETURN-VALUE hWord:ActiveDocument:PrintOut().
MESSAGE "Printing..." + pcPrintObject
VIEW-AS ALERT-BOX INFO BUTTONS OK.
NO-RETURN-VALUE hWord:QUIT(FALSE,,).
RELEASE OBJECT hWord.
ASSIGN hWord = ?.
END PROCEDURE.
.