Iniciar Sesión

Ver la Versión Completa : [PowerCOBOL + WinAPI] Hacer Click en un botón por Software


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

Galileo
22 de diciembre de 2015, 09:39
Entiendo que estás hablando de un programa hecho en PowerCOBOL. En PC 3.0 yo lo que hago es poner en el botón sólo la llamada a un subprograma que estará en el evento PROCEDURE del form.

Por ejemplo, en el botón estaría un código como éste:

CALL "Imprimir"

El subprograma "Imprimir" estaría en la PROCEDURE. Si yo quiero imprimir sin pulsar el botón, símplemente llamo a dicho subprograma.

Si el programa es nuevo creo que es una buena práctica proceder de esta manera. Pero si el programa ya está hecho y es grande, entonces tu código sí es de utilidad. Y me resulta muy ilustrativo sobre la forma de invocar las funciones de la API de Windows.

Rapinto
23 de diciembre de 2015, 00:19
Galileo,

Também utilizo esse forma de programar no PowerCobol 9.0
(No botão tem apenas o "call" e a rotina esta fora).
Tens razão, é a melhor maneira de programar.

Este meu exemplo tem mesmo como objectivo, dar uma ideia de como utilizar as API's do Windows.

Un Saludo e Feliz Navidad

Rui Pinto