• Sábado 14 de Diciembre de 2024, 18:52

Autor Tema:  Tomar Datos De Un Control Edit En Un Exe Compilado  (Leído 2963 veces)

mmarrodan

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Tomar Datos De Un Control Edit En Un Exe Compilado
« en: Miércoles 8 de Agosto de 2007, 13:19 »
0
Agradecería muchísimo si alguien pudiera echarme una mano con este tema con el que llevo muchos días.

Descripción
-------------
Si utilizo la función EnumWindows puedo averíguar los manejadores de los programas abiertos en Windows, y si utilizo EnumChildWindows puedo averiguar los distintos manejadores de los controles de una ventana.

Pregunta
-----------
Al utilizar la macro Edit_GetText(hWnd, szBuffer) utilizando el manejador que hemos obtenido mediante EnumChildWindow, Windows no devuelve ninguna información. ¿Hay algún modo de obtener la información que hay en un control EDIT, desde un programa que ya está compilado?

Verdaderamente agradecería mucho cualquier información.
Gracias y un saludo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Tomar Datos De Un Control Edit En Un Exe Compilado
« Respuesta #1 en: Miércoles 8 de Agosto de 2007, 13:32 »
0
Podes enviar el mensaje WM_GETTEXT al control.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

mmarrodan

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Tomar Datos De Un Control Edit En Un Exe Compilado
« Respuesta #2 en: Miércoles 8 de Agosto de 2007, 13:38 »
0
En realidad enviar un mensaje WM_GETTEXT es lo mismo que llamar a Edit_GetText o a GetWindowText.

Windows no retorna nada.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Tomar Datos De Un Control Edit En Un Exe Compilado
« Respuesta #3 en: Miércoles 8 de Agosto de 2007, 13:50 »
0
Cita de: "mmarrodan"
En realidad enviar un mensaje WM_GETTEXT es lo mismo que llamar a Edit_GetText o a GetWindowText.

Windows no retorna nada.
No es lo mismo si estamos hablando de una ventana de otro proceso.

Fuente GetWindowText:

If the target window is owned by the current process, GetWindowText causes a WM_GETTEXT message to be sent to the specified window or control. If the target window is owned by another process and has a caption, GetWindowText retrieves the window caption text. If the window does not have a caption, the return value is a null string. This behavior is by design. It allows applications to call GetWindowText without becoming unresponsive if the process that owns the target window is not responding. However, if the target window is not responding and it belongs to the calling application, GetWindowText will cause the calling application to become unresponsive.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

mmarrodan

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Tomar Datos De Un Control Edit En Un Exe Compilado
« Respuesta #4 en: Miércoles 8 de Agosto de 2007, 14:13 »
0
Efectivamente tienes razón,

Tal vez el proceso esté descrito como diferente en la ayuda sin embargo, una vez que he conseguido el manejador, puedo hacer cualquiera de las 3 cosas, llamar a:

Llamar a la macro Edit_GetText
Llamar a la función GetWindowText
Utilizar SendMessage para enviar un WM_GETTEXT

Windows siempre retorna, efectivamente, la window caption text, y no la window text. La cosa está en que, incluso un control edit tiene una zona de caption y una zona de datos. Cuando el programa es nuestro y lo estamos haciendo, al llamar a Edit_GetText Windows nos da los datos, sin embargo si el programa ya está compilado, Windows sólo nos da la caption del control edit.

*** Sin embargo es curioso que los campos "static" no se comportan igual; es decir, si llamas a la misma función GetWindowText preguntanto por la información que hay en un control estático... SÍ te devuelve el texto que tiene ese control (incluso si el programa ya está compilado).

La cuestión sigue siendo por tanto, si hay algún modo de acceder al WINDOW TEXT de un campo edit, y no al WINDOW CAPTION TEXT de un edit.

Muchas gracias por tu interés y ayuda.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Tomar Datos De Un Control Edit En Un Exe Compilado
« Respuesta #5 en: Miércoles 8 de Agosto de 2007, 14:16 »
0
En realidad debes tener otro problema ya que funciona tal y como dice la MSDN.

Usando el Spy++ busco un HANDLE de por ejemplo el Edit de una instancia del Notepad en ejecucion.

Esto da como resultado lo que comentas:
Código: Text
  1.  
  2.   char data[256];
  3.   GetWindowText((HWND)0x5B2378, data, sizeof(data));
  4.  
  5.  

Esto me devuelve el texto del Edit:
Código: Text
  1.  
  2.   char data[256];
  3.   SendMessage((HWND)0x5B2378, WM_GETTEXT, sizeof(data), (LPARAM)&data);
  4.  
  5.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

mmarrodan

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Tomar Datos De Un Control Edit En Un Exe Compilado
« Respuesta #6 en: Miércoles 8 de Agosto de 2007, 17:15 »
0
Tienes razón.

Acabo de hacer la misma prueba que tu has hecho con el notepad y efectivamente no es lo mismo utilizar GetWindowText que utilizar SendMessage con WM_GETTEXT. Actúa exactamente como decías en tu último mensaje.


Pero no lo entiendo porque yo ya había utilizado el mensaje WM_GETTEXT para acceder al programa al que intento entrar, y no había podido. !Tal vez el programa al que intento acceder no está hecho en Visual C! y funciona de modo diferente en cuanto a la mensajería. ??

Ahora no estoy en casa (y no puedo acceder al programa donde quiero entrar), pero cuando llegue esta noche volveré a intentarlo haciendo incapié en el SendMessage. Además voy a apoyarme en el programa Spy++ que indicabas en tu mensaje y que he podido bajar de la red.

Verdaderamente has sido muy amable. Tan pronto como sepa algo más te mantendré al corriente de si he podido o no acceder aunque sólo sea para agradecerte tu ayuda.

Un saludo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Tomar Datos De Un Control Edit En Un Exe Compilado
« Respuesta #7 en: Miércoles 8 de Agosto de 2007, 18:10 »
0
Cita de: "mmarrodan"
Verdaderamente has sido muy amable. Tan pronto como sepa algo más te mantendré al corriente de si he podido o no acceder aunque sólo sea para agradecerte tu ayuda.

De nadas, ya nos contaras si sigue fallando o no  B)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

mmarrodan

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Tomar Datos De Un Control Edit En Un Exe Compilado
« Respuesta #8 en: Lunes 13 de Agosto de 2007, 11:20 »
0
Lamento haber tardado en responder un poco, pero he estado un par de días de vacaciones y no he tenido internet.

Sabes que, efectivamente el tema del SendMessage funciona como dices, pero es verdad que el problema en este caso es un poco más raro (ya te contaba que lo había probado y no me había ido). El caso es que la ventana de donde yo intento sacar la información no es un "Edit" normal.

Te cuento el caso completo:

1/ Se trata de un diccionario
2/ Tú tecleas en la ventana la palabra a buscar (por ejemplo "mesa") y te aparece un campo descriptivo que te dice "Objeto habitualmente de madera, que tiene patas, varios usos..."
3/ Ese campo descriptivo es al que yo quiero acceder y no puedo.
4/ La particularidad que tiene ese control es que tú puedes pulsar doble click individualmente en cualquiera de las palabras de la descripción; es decir, encima de "Objeto" o de "habitualmente" o de "madera"... y entonces el diccionario te muestra la descripción correspondiente a la palabra donde has pulsado doble click.

---> He utilizado el Spy++ para ver si había algún puntero que direccionara al texto completo, pero no hay ninguno. Me da la impresión que este tipo de campo funciona parecido a una listbox, pero en vez de llenar palabras en una lista rellena palabras en una cadena de texto formando una frase, o un pequeño texto.

Espero no haberte aburrido con esta descripción del caso, que por otra parte, parece muy intrigante.

Un saludo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Tomar Datos De Un Control Edit En Un Exe Compilado
« Respuesta #9 en: Lunes 13 de Agosto de 2007, 11:25 »
0
Bien, el punto entonces es que no es un Edit o como minimo no es un Edit sin modificacion de comportamiento (subclassing, aunque lo dudo).

Usando el Spy++ podes conseguir el nombre de la clase del control en cuestion, vas a Properties y en el tab Class esta Class Name. Tal vez saberla sea util, puede que sea un Rich Edit ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

mmarrodan

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Tomar Datos De Un Control Edit En Un Exe Compilado
« Respuesta #10 en: Lunes 13 de Agosto de 2007, 12:14 »
0
He hecho una impresión de pantalla para poder mostrarte incluso la ventana de la que hablamos. Como verás la palabra que está ahora mismo en la ventana es "abalone", es un texto en francés.

La ventana que está analizada con el Spy++ no es toda la dialog sino todo lo que hay dentro (lo señala todo como uno), tanto los botones check de la izquierda como la descripción de la parte derecha de la ventana.


Te la envío adjunta en un BMP
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Tomar Datos De Un Control Edit En Un Exe Compilado
« Respuesta #11 en: Lunes 13 de Agosto de 2007, 12:29 »
0
Bueno, como se puede ver ahi facilmente, no es un Edit en lo absoluto. Supongo que es una clase registrada por el programa que se llama: TXTWNDCLASSNAME. Segun lo que se ve ahi tambien es un programa de 16 bits ya que esta siendo ejecutado por el ntvdm.exe. ¿Algo de Windows 3.1 por casualidad?

Los check boxes de la izquierda estan ahi, son buttons. ¿Estas seguro que ese control es el que contiene Zool? Proba con algun programa que te permita ocultar un control (visible=false).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

mmarrodan

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Tomar Datos De Un Control Edit En Un Exe Compilado
« Respuesta #12 en: Lunes 13 de Agosto de 2007, 13:06 »
0
Creo que este CD es bastante antiguo, con lo que es posible que provenga de Windows 3.1. La verdad es que no lo sé.

Si ejecuto la instrucción:

   if ( GetWindowID(hWnd) == 0 )
   {
      ShowWindow(hWnd, SW_HIDE);
      ShowWindow(hWnd, SW_NORMAL);
   }

y voy paso a paso con el debuger, cuando se oculta la ventana no se ocultan los controles button, con lo que ese manejador de ventana efectivamente sólo está referido al texto y no a los button.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Tomar Datos De Un Control Edit En Un Exe Compilado
« Respuesta #13 en: Lunes 13 de Agosto de 2007, 13:29 »
0
Por los resultados que salen en Google con el nombre de la clase (cero) me parece que solo te queda un camino: ingenieria inversa.

Comproba que mesajes se envian/reciben a ese control cuando interactuas con el programa, lo ideal seria depurandolo, busca el manejador de mensajes.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

mmarrodan

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Tomar Datos De Un Control Edit En Un Exe Compilado
« Respuesta #14 en: Lunes 13 de Agosto de 2007, 14:14 »
0
Cuando hace unos días hablaste del Spy++, como te comenté, me lo bajé de la red. Parece verdaderamente muy útil para cosas de este tipo.

En el caso de este programa he revisado todos los mensajes que se mandan y en ninguno aparece la descripción del texto (tan sólo se hace referencia en la respuesta a WM_GETTEXT a un texto que se corresponde con la caption del TXTWNDCLASSNAME; es decir, al título de la palabra... pero no a su descripción.

... he intentado también bombardear el control con SendMessage (metido en un contador nCount++) pero sin resultado.


Yo lo seguiré intentando, si en algún momento consiguiera algo te tendría al corriente para compatir información. Sea como sea te agradezco muchotu interés.

Un saludo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Tomar Datos De Un Control Edit En Un Exe Compilado
« Respuesta #15 en: Lunes 13 de Agosto de 2007, 14:23 »
0
De nadas.

Queda una alternativa y es intentar desensamblarlo/depurarlo, especialmente el manejador del control. Enviar mensajes "bombardeando" puede ser util pero solo hasta cierto punto, no sabemos los parametros de los mismos ... mientras que si pudieras depurarlo/desensamblarlo ... la funcion RegisterClass/Ex recibe parametros interesantes (la estructura que contiene el puntero al manejador de ventana por ejemplo) y la tienen que llamar para registrar el tipo del control (TXTWNDCLASSNAME). Fijate si podes usar el WinDbg, me imagino que no si es como creo un programa de 16 bits.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.