• Lunes 29 de Abril de 2024, 03:43

Autor Tema:  Escribir En Otra Aplicacion  (Leído 1684 veces)

Vatoicc

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Escribir En Otra Aplicacion
« en: Miércoles 21 de Marzo de 2007, 01:35 »
0
Estoy tratando de escribir en otra aplicacion, desde mi programa, e intentado usar SendMessage de la API de windows, pero no me funciona, no se si este haciendo lo correcto

Primero habro la aplicacion (Bloc de notas) y guardo el HANDLE

Código: Text
  1.  
  2. void __fastcall TForm1::Button1Click(TObject *Sender)
  3. {
  4.  
  5.    AnsiString Programa = "C:\\WINDOWS\\NOTEPAD.EXE";
  6.    AnsiString Wname = "Sin título - Bloc de notas";
  7.    
  8.    char WinName[80];
  9.    char WinClass[80];
  10.  
  11.    //HandleProg esta declarada dentro de la clase de la forma (HWND HandleProg;)
  12.    ShellExecute(HandleProg,"open", Programa.c_str() , NULL ,NULL,SW_SHOWNORMAL );
  13.  
  14.    while(1)
  15.    {
  16.       HandleProg = FindWindow( 0,Wname.c_str() );
  17.       if( HandleProg != NULL )
  18.          break;
  19.    }
  20.  
  21.    //Esto es solo para ver el nombre de la clase y el titulo del programa
  22.    GetWindowTextA( HandleProg ,WinName,sizeof( WinName )-1 );
  23.    GetClassNameA( HandleProg ,WinClass,sizeof( WinClass ) - 1 );
  24.  
  25.    Label_WinClass->Caption = WinClass;
  26.    Label_WinName->Caption = WinName;
  27. }
  28. //---------------------------------------------------------------------------
  29.  
  30.  

Ya que tengo guardado el HANDLE del programa, lo puedo cerrar, por lo que
compruebo que el HANDLE es correcto

Código: Text
  1.  
  2. void __fastcall TForm1::Button2Click(TObject *Sender)
  3. {
  4.    SendMessage( HandleProg,WM_CLOSE,0,0 );
  5. }
  6. //---------------------------------------------------------------------------
  7.  
  8.  

Pero no puede escribir un caracter :s

Código: Text
  1.  
  2. void __fastcall TForm1::Button3Click(TObject *Sender)
  3. {
  4.    SendMessage( HandleProg,WM_CHAR,'r',0 );
  5. }
  6. //---------------------------------------------------------------------------
  7.  
  8.  

Lo que e logrado hacer con el mensaje WM_CHAR es escribir en un Edit o un Memo, pero solo dentro de mi aplicacion

Código: Text
  1.  
  2.    SendMessage( Edit1->Handle,WM_CHAR,'r',0 );
  3.    SendMessage( Memo1->Handle,WM_CHAR,'r',0 );
  4.  
  5.  

Por eso creo que el mensaje WM_CHAR es lo que estoy buscando, pero creo que el error esta en el parametro Handle de la funcion SendMessage.
Creo que tendria que poner el Handle del Memo que tiene el Bloc de notas, pero eso si no se como obtenerlo :s
E intentado usar FindWindowEx() pero no e tenido exito.

Si alguien puede darme un norte se los agradeceria muchisimo.
O algun codigo donde manejen este tipo de funciones del APIWin para comunicarce con otras aplicaciones tambien se le agradece
La paranoia es una vision mas sutil de la vida

AmelRenier

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Escribir En Otra Aplicacion
« Respuesta #1 en: Lunes 30 de Abril de 2007, 22:14 »
0
Yo probe a hacer eso, y lo logré despues de hacer lo siguiente.
Primero busqué el manajador de la ventana de bloc de notas como mismo tu lo hiciste y despues use la funcion GetWindow pasandole como parametro lo necesario para que me devuelva el manejador de la primera ventana hija (child) despues la ventana del bloc de notas.
 A ese manejador si le puedes mandar el mensaje WM_CHAR con el codigo de la letra a pasar ...

No tengo ahora el codigo a mano, pero creo que te he puesto aki todo lo que hay que hacer.

Algo asi fue lo que hice:

HWND hWnd = FindWindow(...,"Sin título - Bloc de notas",...)// no recuerdo los parametros
HWND hWndChild = GetWindow(GW_Child)// o algo asi

 SendMessage(hWndChild,WM_CHAR,'r',0 );

Espero que te sea de alguna utilidad.

Ah, prueba a mandarle un mensaje de WM_CLOSE para que veas lo k sucede......

Vatoicc

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Escribir En Otra Aplicacion
« Respuesta #2 en: Domingo 6 de Mayo de 2007, 04:21 »
0
Te dire que funciono bien,  este es el codigo:

Código: Text
  1.  
  2.    HWND P = GetWindow( HandleProg,GW_CHILD );
  3.    SendMessage( P,WM_CHAR,'r',0 );
  4.  
  5.  

La verdad no se cuanto tiempo estube intentando solucionar el problema, y crei que ya no hiban a responer mi mensaje, asi que te agradesco mucho la atencion que tubiste en  hacerlo.

Pero te dire que solucione el problema de una mejor forma, el programa que queria manipular es para grabar audio en mp3, y tenia la intencion de correrlo de manera oculta detras de mi programa para mandar "teclas virtuales" con las hotkeys que maneja el programa para la grabacion de audio, pues queria incluirle un modulo de grabacion de audio a mi programa, para que fuera un sistema integral, que hiciera todo.

Y buscando un poco sobre ese programa de mp3, vi que usa un dll llamado lame, que es un codificador de mp3 de codigo libre. Pero ahi otro problema, no sabia manejar dll  :blink: .
Y despues de mucho buscar en este foro y en todo lo que me arrojara google, logre hacer una funcion para convertir wav a mp3.
Y mi programa, ahora es un sistema mas completo.

Pero nuevamente te agradesco la atencion que te tomaste
La paranoia es una vision mas sutil de la vida