Hola
Que yo sepa sin mas, no. Lo que si que puedes hacer es preparar tus programas para que sean capaces de interpretar mensajes especiales que tu envies y en funci贸n de eso establecer un protocolo de comunicaci贸n entre dos aplicaciones. Por ejemplo con WM_COPYDATA.
Con este ejemplo puedes enviar y recibir datos de una aplicaci贸n a otra:
#include "FIVEWIN.CH"
static oWnd
#define WM_COPYDATA 74
function MAIN()
LOCAL oBtn, oBtn2, oGet, nVar1 := 1
LOCAL oGet2, nVar2 := 1
LOCAL oGet3, cVar := "Pulsa el boton Send y busca un alert"
DEFINE WINDOW oWnd TITLE "Prueba WM_COPYDATA"
@ 10, 10 GET oGet VAR nVar1 SIZE 50, 18 PIXEL OF oWnd
@ 30, 10 GET oGet2 VAR nVar2 SIZE 50, 18 PIXEL OF oWnd
@ 50, 10 GET oGet3 VAR cVar SIZE 250, 18 PIXEL OF oWnd
@ 80, 10 BUTTON oBtn PROMPT "Send" SIZE 50, 24 PIXEL OF oWnd ACTION SendInfo( nVar1, nVar2, cVar )
@ 110, 10 BUTTON oBtn2 PROMPT "Fin" SIZE 50, 24 PIXEL OF oWnd ACTION oWnd:End()
ACTIVATE WINDOW oWnd
RETURN nil
function SendInfo( nVar, nVar2, cVar )
local hWnd := FindWindow(0,"Escuchando" )
// BUSCAS EL HANDLE DE LA VENTANA CON EL NOMBRE
DEFAULT nVar := 1
DEFAULT nVar2 := 1
DEFAULT cVar := ""
if hWnd != 0
if cVar == ""
Enviar( oWnd:hWnd, hWnd, 101, nVar, nVar2, cVar )
else
Enviar( oWnd:hWnd, hWnd, 100, nVar, nVar2, cVar )
endif
else
MsgInfo( "No encontre la ventana" )
endif
return nil
#pragma BEGINDUMP
#include "windows.h"
#include "hbapi.h"
// AQUI TE CREAS LA ESTRUCTURA QUE QUIERAS CON LOS DATOS QUE QUIERAS PASAR
typedef struct tagMYREC
{
HWND hWndOrigen;
char s1[250];
int nFila;
int nColumna;
} MYREC;
HB_FUNC( ENVIAR )
{
HWND hWndOrigen = ( HWND ) hb_parnl( 1 );
HWND hWndDestino = ( HWND ) hb_parnl( 2 );
int nMsg = hb_parni( 3 ); // <<< IDENTIFICADOR DEL MENSAJE PARA QUE DESDE
// LA VENTANA DESTINO DECIDAS LO QUE HACER EN ESTE CASO
COPYDATASTRUCT MyCDS;
MYREC MyRec;
// AQUI LE DAS VALOR A LOS DATOS DE LA ESTRUCTURA
MyRec.hWndOrigen = hWndOrigen;
MyRec.nFila = hb_parni( 4 );
MyRec.nColumna = hb_parni( 5 );
strcpy( MyRec.s1, hb_parc( 6 ) );
//
// Fill the COPYDATA structure
//
MyCDS.dwData = nMsg;
MyCDS.cbData = sizeof( MyRec ); // size of data
MyCDS.lpData = &MyRec;
// SE LO ENVIAS A LA VENTANA DESTINO SIEMPRE DE ESTA FORMA
SendMessage( hWndDestino, WM_COPYDATA,(WPARAM)(HWND) hWndOrigen,(LPARAM) (LPVOID) &MyCDS );
hb_ret();
}
HB_FUNC( RECIBIR )
{
PCOPYDATASTRUCT pMyCDS;
pMyCDS = (PCOPYDATASTRUCT) hb_parnl( 1 );
// RECIBES LOS DATOS Y LOS DEVUELVES AL HANDLEEVENT DE LA VENTANA
// SI QUIERES QUE LA COMUNICACI脫N SEA EN LOS DOS SENTIDOS
// TENDRIAS QUE TENER AQUI TAMBIEN EL HANDLEEVENT REDEFINIDO
hb_reta( 5 );
hb_stornl( (long)((MYREC *)(pMyCDS->lpData))->hWndOrigen, -1, 1 );
hb_storni( pMyCDS->dwData, -1, 2 );
hb_storni( ((MYREC *)(pMyCDS->lpData))->nFila, -1, 3 );
hb_storni( ((MYREC *)(pMyCDS->lpData))->nColumna, -1, 4 );
hb_storc ( ((MYREC *)(pMyCDS->lpData))->s1, -1, 5 );
}
HB_FUNC( REGISTERWINDOWMESSAGE )
{
hb_retni( RegisterWindowMessage( ( LPCTSTR ) hb_parc(1)));
}
#pragma ENDDUMP
Luego con la funci贸n RegisterWindowMessage puedes registrar un mensaje en cada aplicaci贸n a nivel de Windows, asegurandote de que ese mensaje ser谩 煤nico en windows.
Luego en el HandleEvent de la ventana o del control capturas ese mensaje y estableces la comunicaci贸n entre la aplicaci贸n que escucha y la aplicaci贸n que espia.
nMensaje := RegisterWindowMessage( "WM_MIMENSAJE" )
En HandleEvent tendr铆as que preguntar por if nMsg == nMensaje ...
Un saludo