Rapinto
19 de mayo de 2015, 17:19
Ás vezes necessitamos de executar o código que está num botão, sem o operador saber.
Por exemplo, para correr um programa automaticamente, sem intervenção do operador, mas utilizando o mesmo programa com interface com o operador.
Com este código, podemos simular que foi pressionado um botão (ou CMCommand1).
@OPTIONS NOALPHA
************************************************** ***************
* Copyright (c) 2005 R.P.S.
*
* Last Modified: Jan 2005.
************************************************** ***************
IDENTIFICATION DIVISION.
PROGRAM-ID. INVOKECLICK.
AUTHOR. Rui Pinto - MAR 2005.
*-----------------------------------------------------------------
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*-----------------------------------------------------------------
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
*
*
01 MSGFUNCTION PIC S9(009) COMP-5 VALUE ZERO.
01 MSGPARAM1 PIC S9(009) COMP-5 VALUE ZERO.
01 MSGPARAM2 PIC S9(009) COMP-5 VALUE ZERO.
LINKAGE SECTION.
01 WS-HANDLER PIC S9(009) COMP-5.
PROCEDURE DIVISION USING WS-HANDLER.
MAIN SECTION.
MAIN-00.
IF WS-HANDLER = 0
CALL "GetFocus" WITH STDCALL RETURNING WS-HANDLER.
**** MOUSE DOWN
MOVE 513 TO MSGFUNCTION.
MOVE 0 TO MSGPARAM2.
MOVE 0 TO MSGPARAM1.
CALL "SendMessageA" WITH STDCALL USING BY VALUE WS-HANDLER
BY VALUE MSGFUNCTION
BY VALUE MSGPARAM1
BY VALUE MSGPARAM2.
**** MOUSE UP
MOVE 514 TO MSGFUNCTION.
MOVE 0 TO MSGPARAM2.
MOVE 0 TO MSGPARAM1.
CALL "SendMessageA" WITH STDCALL USING BY VALUE WS-HANDLER
BY VALUE MSGFUNCTION
BY VALUE MSGPARAM1
BY VALUE MSGPARAM2.
**** BUTTON STATE
MOVE 243 TO MSGFUNCTION.
MOVE 0 TO MSGPARAM2.
MOVE 0 TO MSGPARAM1.
CALL "SendMessageA" WITH STDCALL USING BY VALUE WS-HANDLER
BY VALUE MSGFUNCTION
BY VALUE MSGPARAM1
BY VALUE MSGPARAM2.
MAIN-99.
END PROGRAM INVOKECLICK.
* INVOKE CMCOMMAND2 "SETFOCUS". FOCUS NO BOTAO A CLICKAR
* CALL "INVOKECLICK".
* INVOKE CMCOMMAND1 "SETFOCUS". FOCUS PARA OUTRO OBJECTO
Espero que ajude alguém.
Un saludo,
Rui Pinto
Por exemplo, para correr um programa automaticamente, sem intervenção do operador, mas utilizando o mesmo programa com interface com o operador.
Com este código, podemos simular que foi pressionado um botão (ou CMCommand1).
@OPTIONS NOALPHA
************************************************** ***************
* Copyright (c) 2005 R.P.S.
*
* Last Modified: Jan 2005.
************************************************** ***************
IDENTIFICATION DIVISION.
PROGRAM-ID. INVOKECLICK.
AUTHOR. Rui Pinto - MAR 2005.
*-----------------------------------------------------------------
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*-----------------------------------------------------------------
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
*
*
01 MSGFUNCTION PIC S9(009) COMP-5 VALUE ZERO.
01 MSGPARAM1 PIC S9(009) COMP-5 VALUE ZERO.
01 MSGPARAM2 PIC S9(009) COMP-5 VALUE ZERO.
LINKAGE SECTION.
01 WS-HANDLER PIC S9(009) COMP-5.
PROCEDURE DIVISION USING WS-HANDLER.
MAIN SECTION.
MAIN-00.
IF WS-HANDLER = 0
CALL "GetFocus" WITH STDCALL RETURNING WS-HANDLER.
**** MOUSE DOWN
MOVE 513 TO MSGFUNCTION.
MOVE 0 TO MSGPARAM2.
MOVE 0 TO MSGPARAM1.
CALL "SendMessageA" WITH STDCALL USING BY VALUE WS-HANDLER
BY VALUE MSGFUNCTION
BY VALUE MSGPARAM1
BY VALUE MSGPARAM2.
**** MOUSE UP
MOVE 514 TO MSGFUNCTION.
MOVE 0 TO MSGPARAM2.
MOVE 0 TO MSGPARAM1.
CALL "SendMessageA" WITH STDCALL USING BY VALUE WS-HANDLER
BY VALUE MSGFUNCTION
BY VALUE MSGPARAM1
BY VALUE MSGPARAM2.
**** BUTTON STATE
MOVE 243 TO MSGFUNCTION.
MOVE 0 TO MSGPARAM2.
MOVE 0 TO MSGPARAM1.
CALL "SendMessageA" WITH STDCALL USING BY VALUE WS-HANDLER
BY VALUE MSGFUNCTION
BY VALUE MSGPARAM1
BY VALUE MSGPARAM2.
MAIN-99.
END PROGRAM INVOKECLICK.
* INVOKE CMCOMMAND2 "SETFOCUS". FOCUS NO BOTAO A CLICKAR
* CALL "INVOKECLICK".
* INVOKE CMCOMMAND1 "SETFOCUS". FOCUS PARA OUTRO OBJECTO
Espero que ajude alguém.
Un saludo,
Rui Pinto