Rapinto
13 de abril de 2015, 23:06
Rotina para trazer qualquer window para 1º plano.
Tive que fazer esta rotina, pois quando imprimia para PDF ou exportava para Excel, ficava apenas a indicação na barra em baixo a piscar e tinha que fazer um click com o rato para abrir.
@OPTIONS NOALPHA
IDENTIFICATION DIVISION.
PROGRAM-ID. WINDOWONTOP.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
REPOSITORY.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 OLE-TRUE PIC 1(1) BIT VALUE B"1".
01 FILLER PIC 1(7) BIT.
01 OLE-FALSE PIC 1(1) BIT VALUE B"0".
01 FILLER PIC 1(7) BIT.
01 S-INDEX PIC S9(4) COMP-5 VALUE 0.
01 CONTALOOP PIC S9(9) COMP-5.
01 MILISECONDS PIC S9(9) COMP-5 VALUE 0.
01 WINDOWCLASSE BINARY-LONG VALUE ZERO.
01 HWND BINARY-LONG.
01 SECONDS PIC S9(9) COMP-5.
LINKAGE SECTION.
01 WINDOWNAME PIC X(064).
PROCEDURE DIVISION USING WINDOWNAME.
MAIN SECTION.
MAIN-00.
IF WINDOWNAME = SPACE GO TO MAIN-99.
MOVE 40 TO SECONDS.
COMPUTE S-INDEX = FUNCTION STORED-CHAR-LENGTH(WINDOWNAME).
ADD 1 TO S-INDEX.
MOVE X"00" TO WINDOWNAME(S-INDEX:1).
* DISPLAY WINDOWNAME. STOP " ".
MOVE ZERO TO CONTALOOP.
*
MAIN-10.
CALL "FindWindowA" WITH STDCALL USING
BY VALUE WINDOWCLASSE
BY REFERENCE WINDOWNAME
RETURNING HWND.
IF HWND > 0 GO TO MAIN-20.
IF CONTALOOP > SECONDS GO TO MAIN-99.
MOVE 500 TO MILISECONDS.
CALL "Sleep" WITH STDCALL USING
BY VALUE MILISECONDS.
ADD 1 TO CONTALOOP.
GO TO MAIN-10.
MAIN-20.
CALL "SetForegroundWindow" WITH STDCALL USING
BY VALUE HWND.
*
MAIN-99.
END PROGRAM WINDOWONTOP.
Basta passar o nome correto da "Window" e esta fica em primeiro plano sobre todas as outras.
A utilização de "Sleep" tem a ver com o tempo de criação do PDF ou da Folha de Excel.
Espero que sirva para alguém.
Saludos,
Rui Pinto
Tive que fazer esta rotina, pois quando imprimia para PDF ou exportava para Excel, ficava apenas a indicação na barra em baixo a piscar e tinha que fazer um click com o rato para abrir.
@OPTIONS NOALPHA
IDENTIFICATION DIVISION.
PROGRAM-ID. WINDOWONTOP.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
REPOSITORY.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 OLE-TRUE PIC 1(1) BIT VALUE B"1".
01 FILLER PIC 1(7) BIT.
01 OLE-FALSE PIC 1(1) BIT VALUE B"0".
01 FILLER PIC 1(7) BIT.
01 S-INDEX PIC S9(4) COMP-5 VALUE 0.
01 CONTALOOP PIC S9(9) COMP-5.
01 MILISECONDS PIC S9(9) COMP-5 VALUE 0.
01 WINDOWCLASSE BINARY-LONG VALUE ZERO.
01 HWND BINARY-LONG.
01 SECONDS PIC S9(9) COMP-5.
LINKAGE SECTION.
01 WINDOWNAME PIC X(064).
PROCEDURE DIVISION USING WINDOWNAME.
MAIN SECTION.
MAIN-00.
IF WINDOWNAME = SPACE GO TO MAIN-99.
MOVE 40 TO SECONDS.
COMPUTE S-INDEX = FUNCTION STORED-CHAR-LENGTH(WINDOWNAME).
ADD 1 TO S-INDEX.
MOVE X"00" TO WINDOWNAME(S-INDEX:1).
* DISPLAY WINDOWNAME. STOP " ".
MOVE ZERO TO CONTALOOP.
*
MAIN-10.
CALL "FindWindowA" WITH STDCALL USING
BY VALUE WINDOWCLASSE
BY REFERENCE WINDOWNAME
RETURNING HWND.
IF HWND > 0 GO TO MAIN-20.
IF CONTALOOP > SECONDS GO TO MAIN-99.
MOVE 500 TO MILISECONDS.
CALL "Sleep" WITH STDCALL USING
BY VALUE MILISECONDS.
ADD 1 TO CONTALOOP.
GO TO MAIN-10.
MAIN-20.
CALL "SetForegroundWindow" WITH STDCALL USING
BY VALUE HWND.
*
MAIN-99.
END PROGRAM WINDOWONTOP.
Basta passar o nome correto da "Window" e esta fica em primeiro plano sobre todas as outras.
A utilização de "Sleep" tem a ver com o tempo de criação do PDF ou da Folha de Excel.
Espero que sirva para alguém.
Saludos,
Rui Pinto