Iniciar Sesión

Ver la Versión Completa : [PowerCOBOL + WinAPI] Bring Window to Top (By Name)


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