Necesito ayuda con PostMessage

25/05/2007 - 10:15 por Jowie | Informe spam
Hola,
¿Alguien me puede decir que parametros le tengo que pasar a
postMessage para que envie un texto a otra aplicación?, muchas gracias.

Preguntas similare

Leer las respuestas

#11 RFOG
28/05/2007 - 14:04 | Informe spam
Grrr.

Eso me pasa por no mirar bien. Puedes utilizar WM_SETTEXT para enviar la
cadena completa a la ventana de destino.

Los pasos son los mismos, pero ahora estás enviando la cadena al completo
y tienes que localizar el nombre del control destino.

Una vez que has encontrado la ventana destino tienes que encontrar la
ventana que quieres mediante FindWindow, y enviarle el mensaje.

http://msdn2.microsoft.com/en-us/li...32644.aspx

http://msdn2.microsoft.com/en-us/li...33499.aspx

Te digo que tampoco lo he hecho nunca en C# (ni siquiera en C++/CLI), pero
en C++ bajo Win32 funciona perfectamente, tanto esto como lo anterior.


En Mon, 28 May 2007 13:46:35 +0200, RFOG
escribió:

En Mon, 28 May 2007 11:54:06 +0200, Jowie
escribió:

Tienes una opción mejor que es hacerlo mediante el método SendMessage
de
Win32, en ese caso no tendrás problemas con el foco ni con nada (ni
siquiera es necesario que la aplicación destino esté activa), pero
tienes
que utilizar Interop a partir del Handle de ventana destino y la tecla
pulsada.



Se que te va a parecer una tonteria, pero te importaria madarme un
ejemplo con los parametros que hay que pasarle a dicha funcíon porque
sino lo hice asi desde un principio es porque no consigo que funcione.
Gracias por tu interes.

PD.: he mirado los links pero mi nivel de ingles es suficientemente
malo como para saltarme algo.




Tienes que obtener el HWND Win32 de la ventana destino (creo que Handle
de Windows Forms lo hace, aunque se lo tendrás que pedir a la aplicación
de destino mediante FindWindow, etc).

Luego tienes que obtener el valor numérico de WM_CHAR para ponerlo en
msg.

Luego tienes que empaquetar el caracter en wParam como su valor ASCII o
UNICODE

Y posteriormente también los bits de control (el 32 ha de ser 1 para que
así vea que es liberación, no pulsación).

Si SendMessage te devuelve cero es que al menos la aplicación destino ha
aceptado el mensaje. Si no hace nada puede deberse a que estás
equivocando el handle o que simplemente el .NET pasa olímpicamente de
todo esto (que me ha pasado, y mucho, en otras cosas mezclando y
filtrando mensajes nativos).

No te puedo poner código de ejemplo porque nunca lo he hecho desde C#,
aunque sí desde C++ nativo (es lo habitual hacerlo así).






Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
No tienes lo que mereces, tienes lo que no puedes esquivar.
Respuesta Responder a este mensaje
#12 Jowie
28/05/2007 - 15:10 | Informe spam
Eso me pasa por no mirar bien. Puedes utilizar WM_SETTEXT para enviar la
cadena completa a la ventana de destino.

Los pasos son los mismos, pero ahora estás enviando la cadena al completo
y tienes que localizar el nombre del control destino.

Una vez que has encontrado la ventana destino tienes que encontrar la
ventana que quieres mediante FindWindow, y enviarle el mensaje.



Utilizando algo como esto:

SendMessage(this.formularioActivo, SET_TEXT, 0, "hola");

consigo cambiar el titulo al formulario pero no insertar texto en uno
de sus controles, me diras que le pase el nombre del control, pero no
puedo porque es un teclado virtual y lo que se supone es que tiene que
poner el texto en el control activo. Perdoname por ser tan pesado pero
estamos a punto de conseguirlo.

Gracias por tu interes.
Respuesta Responder a este mensaje
#13 RFOG
28/05/2007 - 15:23 | Informe spam
En Mon, 28 May 2007 15:10:22 +0200, Jowie
escribió:

Eso me pasa por no mirar bien. Puedes utilizar WM_SETTEXT para enviar la
cadena completa a la ventana de destino.

Los pasos son los mismos, pero ahora estás enviando la cadena al
completo
y tienes que localizar el nombre del control destino.

Una vez que has encontrado la ventana destino tienes que encontrar la
ventana que quieres mediante FindWindow, y enviarle el mensaje.



Utilizando algo como esto:

SendMessage(this.formularioActivo, SET_TEXT, 0, "hola");

consigo cambiar el titulo al formulario pero no insertar texto en uno
de sus controles, me diras que le pase el nombre del control, pero no
puedo porque es un teclado virtual y lo que se supone es que tiene que
poner el texto en el control activo. Perdoname por ser tan pesado pero
estamos a punto de conseguirlo.

Gracias por tu interes.



Claro, se debe a que le estás enviando el texto a una ventana de verdad
(no un control), y el comportamiento de una ventana ante ese mensaje es
cambiar su título.

Pues entonces debes recorrer todos los controles de la ficha (y sus
subcontroles) hasta que uno de ellos te devuelva Focused a cierto.
Hablamos de código .NET, no nativo. Cuando tengas ese control, entonces le
puedes enviar el mensaje. Lo que no sé es si la encadenación de controles
mantienene el foco, es decir, si un text que está contenido en un panel
que está contenido en un form ambos tres contienen Focused a cierto o sólo
el text. Quizás haya otra forma de obtener el control que tiene el foco
dentro del .NET

Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
No tienes lo que mereces, tienes lo que no puedes esquivar.
Respuesta Responder a este mensaje
#14 RFOG
28/05/2007 - 15:31 | Informe spam
Tomado de mi código de por ahí:

HWND hwnd=::GetFocus();
if(hwnd!=NULL)
::SendMessage(,WM_SETTEXT,0,m_pstrInjectedText);
else
...

Es código en C++ nativo.



En Mon, 28 May 2007 15:23:06 +0200, RFOG
escribió:

En Mon, 28 May 2007 15:10:22 +0200, Jowie
escribió:

Eso me pasa por no mirar bien. Puedes utilizar WM_SETTEXT para enviar
la
cadena completa a la ventana de destino.

Los pasos son los mismos, pero ahora estás enviando la cadena al
completo
y tienes que localizar el nombre del control destino.

Una vez que has encontrado la ventana destino tienes que encontrar la
ventana que quieres mediante FindWindow, y enviarle el mensaje.



Utilizando algo como esto:

SendMessage(this.formularioActivo, SET_TEXT, 0, "hola");

consigo cambiar el titulo al formulario pero no insertar texto en uno
de sus controles, me diras que le pase el nombre del control, pero no
puedo porque es un teclado virtual y lo que se supone es que tiene que
poner el texto en el control activo. Perdoname por ser tan pesado pero
estamos a punto de conseguirlo.

Gracias por tu interes.



Claro, se debe a que le estás enviando el texto a una ventana de verdad
(no un control), y el comportamiento de una ventana ante ese mensaje es
cambiar su título.

Pues entonces debes recorrer todos los controles de la ficha (y sus
subcontroles) hasta que uno de ellos te devuelva Focused a cierto.
Hablamos de código .NET, no nativo. Cuando tengas ese control, entonces
le puedes enviar el mensaje. Lo que no sé es si la encadenación de
controles mantienene el foco, es decir, si un text que está contenido en
un panel que está contenido en un form ambos tres contienen Focused a
cierto o sólo el text. Quizás haya otra forma de obtener el control que
tiene el foco dentro del .NET






Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
No tienes lo que mereces, tienes lo que no puedes esquivar.
Respuesta Responder a este mensaje
#15 Jowie
28/05/2007 - 16:32 | Informe spam
Pues entonces debes recorrer todos los controles de la ficha (y sus
subcontroles) hasta que uno de ellos te devuelva Focused a cierto.
Hablamos de código .NET, no nativo. Cuando tengas ese control, entonces le
puedes enviar el mensaje. Lo que no sé es si la encadenación de controles
mantienene el foco, es decir, si un text que está contenido en un panel
que está contenido en un form ambos tres contienen Focused a cierto o sólo
el text. Quizás haya otra forma de obtener el control que tiene el foco
dentro del .NET



No encuentro la forma de obtener el control activo. He puesto un bucle
que ejecuta la funcion sendMessage provando todos los valores en el
parametro tercero, pero ante cualquier numero siempre hace lo mismo,
cambiar el texto a la ventana.
SendMessage(this.formularioActivo, SET_TEXT, 0, "hola");

Gracias de todas formas.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida