In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Duda con SendMessage del API

Foro público de Xailer en español
Responder
Jesus Semper
Mensajes: 54
Registrado: Lun Ene 04, 2010 2:40 pm

Duda con SendMessage del API

Mensaje por Jesus Semper »

Mantengo una instalacion en red con un sistema de gestion de desarrollo
propio.
Esta en Clipper porque ha ido evolucionando desde 1992 y hace la mayoria de
las cosas que necesitamos.
He decidido que, sin prisa, vamos a transformarlo a Windows y para ello lo
cambiaremos por modulos y poco a poco.
Estoy en fase de aprendizaje de Xailer y me habia propuesto automatizar un
proceso que nos da bastante trabajo:
Cuando recibimos un pedido se informatiza, se imprime un documento de
confirmacion y se envia por fax al cliente.
Disponemos de una fotocopiadora-impresora-fax y ahora el proceso se hace
manual: con el papel vamos al fax, se marca el numero del cliente y
se envia. El papel lo llevamos a reciclaje ya que usamos otro formato para
produccion (este lleva indicacion de los paquetes que componen
cada articulo - fabricamos muebles).
Estoy probando y retocando el programa ...SamplesPrintingPrinterInfo y
me parecia relativamente sencillo.
Me encuentro lo siguiente:
El fax utiliza un driver especifico del que no tengo informacion.Ni obtengo
informacion a traves del debugger del nombre del formulario ni
ningun otro detalle.
Se me ocurrio que con simple Timer que controlara si estaba en la Ventana
del driver de fax ("LAN_Fax", es de Ricoh) podria forzar para
automatizarlo y escribir el nº de fax al que hay que enviarlo.
Despues de muchas lecturas y pruebas consigo - a traves de funciones del API
de Windows - que los numeros del fax entren en el campo
destinado al mismo (siempre que este en el campo de nº de fax), pero estoy
parado porque no hay manera de que me reaccione para enviarle la
combinacion de teclas "Alt+X" o 6 tabuladores seguidos (me hace falta para
llevar el foco a dicho campo). He probado con WM_SYSKEYDOWN,
KEYDOWN, WM_CHAR con el ultmop parametro en 0, 2 ^ 29, ... no doy con la
solucion. He probado la funcion SetFocus del API y funciona pero
tiene un problema: necesita el hWnd del TEdit del fax y a priori no lo se
salvo que me ponga encima y haga GetFocus().
El evento OnTimer del Timer es:
------------------------------------------------------
METHOD Timer1Timer( oSender ) CLASS TForm1
LOCAL hWnd := GetActiveWindow()
LOCAl oActForm
LOCAL nWParam := 9
LOCAL nLPAram := 0
IF GetWindowText( hWnd ) == "LAN-Fax"
// No funcionan:
// HB_KeyPut( 301 )
SendMessage(GetFocus(), WM_SYSKEYDOWN, VK_TAB, 5)
SendMessage(GetFocus(), WM_KEYDOWN, VK_TAB, 5)
SendMessage(GetFocus(), WM_CHAR, VK_TAB, 5)
// SI FUNCIONA:
// Asi se pone el numero, de 1 en 1 caracter
SendMessage(GetFocus(), WM_CHAR, Asc("9"), 0)
SendMessage(GetFocus(), WM_CHAR, Asc("7"), 0)
SendMessage(GetFocus(), WM_CHAR, Asc("6"), 0)
SendMessage(GetFocus(), WM_CHAR, Asc("8"), 0)
SendMessage(GetFocus(), WM_CHAR, Asc("7"), 0)
SendMessage(GetFocus(), WM_CHAR, Asc("2"), 0)
SendMessage(GetFocus(), WM_CHAR, Asc("0"), 0)
SendMessage(GetFocus(), WM_CHAR, Asc("2"), 0)
SendMessage(GetFocus(), WM_CHAR, Asc("4"), 0)
MsgInfo("Ventana [LAN-Fax] " + Str(hWnd) + "- Foco:" +
Str(GetFocus()))
// Y ahora el ENTER para que lo envie.
SendMessage(GetFocus(), WM_CHAR, VK_RETURN, 0) // No funciona
ENDIF
RETURN Nil
------------------------------------------------------
Despues de todo este royo:
¿alguien sabe como enviar "Alt+X", VK_TAB, VK_RETURN para que cambie de
control dentro de la dichosa ventana de LAN_Fax ?


Attached files 1.jp2 (32.2 KB)Â
Jesus Semper
Mensajes: 54
Registrado: Lun Ene 04, 2010 2:40 pm

Duda con SendMessage del API

Mensaje por Jesus Semper »

Por fin he resuelto mi problema y, como me ha costado encontrar la solución,
voy a compartirla.
Deseo automatizar el envío de Fax por una fotocopiadora-impresora-fax de
red.
Al hacerlo me presenta una pantalla sobre la que tengo ningún control.
La famosa instrucción Keyboard() de Clipper, mi amigo Windows se la pasa por
el "arco de triunfo". (por no decir una famosa parte del cuerpo humano
masculino).
La solución a priori era:
- Crear un Timer que me permitiera saber que estoy en la ventana
"incontrolada".
- Utilizar algo que simule las pulsaciones que hace el usuario para
evitarle el trabajo (y errores): fundamentalmente meter el numero de fax que
tengo en la tabla de clientes.
El problema: el peculiar modo de Windows de tratar las entradas del teclado.
Solución: pues muy simple si se sabe. Solo hay que usar algunas funciones
del API de Windows y en concreto:
hWnd := GetActiveWindow()
que devuelve el handle de la ventana activa. (un numero que identifica el
objeto gráfico activo (puede ser una ventana, un botón, un edit, o cualquier
cosa gráfica)
cNombre := GetWindowText( hWnd )
que devuelve el nombre de la ventana de dicho Handle. Nos sirve en el caso
de una ventana para poder saber si esta activa la que deseamos tratar.
(previamente hay que ver el texto que aparece en el titulo de la ventana)
SendMessage( HWND hwnd, uMsg, wParam, LParam)
Parámetros:
hwnd: identifica la ventana cuyo procedimiento de ventana recibirá el
mensaje.
uMsg: especifica el mensaje a enviar.
wParam: especifica información adicional específica para el mensaje.
lParam: especifica información adicional específica para el mensaje.
este es el sistema fundamental de Windows para hacer las cosas: envía
constantemente "mensajitos" y alguien se encarga de tratarlos. Nuestro
antiguo Keyboard() no sabe llamar bien y por eso no le hacen caso.
De esta función destacamos (buscar información del API de Windows -
localizar en interner un fichero llamado "WinAPI5.pdf" en castellano, muy
interesante.):
SendMessage(hWnd, WM_NEXTDLGCTL ,0 ,0)
con esto cambiamos el foco, en la ventana hWnd, al siguiente objeto (como si
pulsamos TAB).
SendMessage(hWnd, WM_CHAR, Asc(cCaracter), 0)
con esto, en un control de edición (de handle hWnd), simulamos la pulsación
del carácter "cCaracter".
SendMessage(GetFocus(), BM_CLICK, 0, 0, 0)
con esto simulamos el click en un botón.
Ojo: es muy importante el hWnd que se usa: no es lo mismo poner el de la
ventana activa (es el necesario para cuando cambiamos el foco), que el del
control en el que hacemos click o ponemos un carácter.
Os envío como me ha quedado el evento onTimer ... y ¡¡ ME FUNCIONA !! (no me
beso porque no me llego)
//---------------------------------------------------------- ----------------
----
METHOD Timer1Timer( oSender ) CLASS TForm1
LOCAL hWnd, hWnDFax, cCaracter
LOCAL nNumFax := "976872024"
LOCAL nNum
hWnd := GetActiveWindow() // Ya que me presenta otra ventana
IF GetWindowText( hWnd ) == "LAN-Fax"
// 5 cambios de Foco me llevan al Edit del nº de FAx
FOR nNum = 1 TO 5
SendMessage(hWnd, WM_NEXTDLGCTL ,0 ,0)
END
hWnDFax := GetFocus() // Handle del objeto Edit
FOR EACH cCaracter IN nNumFax
// Asi se pone el numero de fax, de 1 en 1 caracter
SendMessage(hWnDFax, WM_CHAR, Asc(cCaracter), 0)
END
// 9 cambios de Foco me llevan al Boton "Enviar"
FOR nNum = 1 TO 9
SendMessage(hWnd, WM_NEXTDLGCTL ,0 ,0)
END
// ... y pulso ENTER en el boton
SendMessage(GetFocus(), BM_CLICK, 0, 0, 0)
::oTimer1:lEnabled := .F. // DesActivo el Timer
ENDIF
RETURN Nil
//---------------------------------------------------------- ----------------
----
ssi-estono-
Mensajes: 239
Registrado: Sab Ene 24, 2009 8:23 pm

Duda con SendMessage del API

Mensaje por ssi-estono- »

Pregunto:
¿Esto tambien valdria para una ventana de msdos?
En mi empresa se trabaja con una aplicacion que creo que es un emulador de
un sistema de IBM(AS600). Y tengo que poner valores en una venta de msdos,
despues me devuelve la información y tengo que capturarla.
¿Serviria?
Paco V
----- Original Message -----
From: "jso" <jesus@semper-sl.com>
Newsgroups: local.xailer.spanish
Sent: Saturday, August 29, 2009 9:38 AM
Subject: Re: Duda con SendMessage del API
> Por fin he resuelto mi problema y, como me ha costado encontrar la
> solución,
> voy a compartirla.
>
> Deseo automatizar el envío de Fax por una fotocopiadora-impresora-fax de
> red.
> Al hacerlo me presenta una pantalla sobre la que tengo ningún control.
> La famosa instrucción Keyboard() de Clipper, mi amigo Windows se la pasa
> por
> el "arco de triunfo". (por no decir una famosa parte del cuerpo humano
> masculino).
>
> La solución a priori era:
> - Crear un Timer que me permitiera saber que estoy en la ventana
> "incontrolada".
> - Utilizar algo que simule las pulsaciones que hace el usuario para
> evitarle el trabajo (y errores): fundamentalmente meter el numero de fax
> que
> tengo en la tabla de clientes.
>
> El problema: el peculiar modo de Windows de tratar las entradas del
> teclado.
>
> Solución: pues muy simple si se sabe. Solo hay que usar algunas funciones
> del API de Windows y en concreto:
>
> hWnd := GetActiveWindow()
>
> que devuelve el handle de la ventana activa. (un numero que identifica el
> objeto gráfico activo (puede ser una ventana, un botón, un edit, o
> cualquier
> cosa gráfica)
>
> cNombre := GetWindowText( hWnd )
>
> que devuelve el nombre de la ventana de dicho Handle. Nos sirve en el caso
> de una ventana para poder saber si esta activa la que deseamos tratar.
> (previamente hay que ver el texto que aparece en el titulo de la ventana)
>
> SendMessage( HWND hwnd, uMsg, wParam, LParam)
>
> Parámetros:
> hwnd: identifica la ventana cuyo procedimiento de ventana recibirá el
> mensaje.
> uMsg: especifica el mensaje a enviar.
> wParam: especifica información adicional específica para el mensaje.
> lParam: especifica información adicional específica para el mensaje.
>
> este es el sistema fundamental de Windows para hacer las cosas: envía
> constantemente "mensajitos" y alguien se encarga de tratarlos. Nuestro
> antiguo Keyboard() no sabe llamar bien y por eso no le hacen caso.
>
> De esta función destacamos (buscar información del API de Windows -
> localizar en interner un fichero llamado "WinAPI5.pdf" en castellano, muy
> interesante.):
>
> SendMessage(hWnd, WM_NEXTDLGCTL ,0 ,0)
>
> con esto cambiamos el foco, en la ventana hWnd, al siguiente objeto (como
> si
> pulsamos TAB).
>
> SendMessage(hWnd, WM_CHAR, Asc(cCaracter), 0)
>
> con esto, en un control de edición (de handle hWnd), simulamos la
> pulsación
> del carácter "cCaracter".
>
> SendMessage(GetFocus(), BM_CLICK, 0, 0, 0)
>
> con esto simulamos el click en un botón.
>
> Ojo: es muy importante el hWnd que se usa: no es lo mismo poner el de la
> ventana activa (es el necesario para cuando cambiamos el foco), que el del
> control en el que hacemos click o ponemos un carácter.
>
> Os envío como me ha quedado el evento onTimer ... y ¡¡ ME FUNCIONA !! (no
> me
> beso porque no me llego)
>
> //---------------------------------------------------------- ----------------
> ----
>
> METHOD Timer1Timer( oSender ) CLASS TForm1
>
> LOCAL hWnd, hWnDFax, cCaracter
> LOCAL nNumFax := "976872024"
> LOCAL nNum
>
> hWnd := GetActiveWindow() // Ya que me presenta otra ventana
> IF GetWindowText( hWnd ) == "LAN-Fax"
>
> // 5 cambios de Foco me llevan al Edit del nº de FAx
> FOR nNum = 1 TO 5
> SendMessage(hWnd, WM_NEXTDLGCTL ,0 ,0)
> END
>
> hWnDFax := GetFocus() // Handle del objeto Edit
> FOR EACH cCaracter IN nNumFax
> // Asi se pone el numero de fax, de 1 en 1 caracter
> SendMessage(hWnDFax, WM_CHAR, Asc(cCaracter), 0)
> END
>
> // 9 cambios de Foco me llevan al Boton "Enviar"
> FOR nNum = 1 TO 9
> SendMessage(hWnd, WM_NEXTDLGCTL ,0 ,0)
> END
>
> // ... y pulso ENTER en el boton
> SendMessage(GetFocus(), BM_CLICK, 0, 0, 0)
>
> ::oTimer1:lEnabled := .F. // DesActivo el Timer
>
> ENDIF
>
> RETURN Nil
>
> //---------------------------------------------------------- ----------------
> ----
>
>
"jso" <jesus@semper-sl.com> escribió en el mensaje
news:[email=4a98de7d@svctag-j7w3v3j....]4a98de7d@svctag-j7w3v3j....[/email]
> Por fin he resuelto mi problema y, como me ha costado encontrar la
> solución,
> voy a compartirla.
>
> Deseo automatizar el envío de Fax por una fotocopiadora-impresora-fax de
> red.
> Al hacerlo me presenta una pantalla sobre la que tengo ningún control.
> La famosa instrucción Keyboard() de Clipper, mi amigo Windows se la pasa
> por
> el "arco de triunfo". (por no decir una famosa parte del cuerpo humano
> masculino).
>
> La solución a priori era:
> - Crear un Timer que me permitiera saber que estoy en la ventana
> "incontrolada".
> - Utilizar algo que simule las pulsaciones que hace el usuario para
> evitarle el trabajo (y errores): fundamentalmente meter el numero de fax
> que
> tengo en la tabla de clientes.
>
> El problema: el peculiar modo de Windows de tratar las entradas del
> teclado.
>
> Solución: pues muy simple si se sabe. Solo hay que usar algunas funciones
> del API de Windows y en concreto:
>
> hWnd := GetActiveWindow()
>
> que devuelve el handle de la ventana activa. (un numero que identifica el
> objeto gráfico activo (puede ser una ventana, un botón, un edit, o
> cualquier
> cosa gráfica)
>
> cNombre := GetWindowText( hWnd )
>
> que devuelve el nombre de la ventana de dicho Handle. Nos sirve en el caso
> de una ventana para poder saber si esta activa la que deseamos tratar.
> (previamente hay que ver el texto que aparece en el titulo de la ventana)
>
> SendMessage( HWND hwnd, uMsg, wParam, LParam)
>
> Parámetros:
> hwnd: identifica la ventana cuyo procedimiento de ventana recibirá el
> mensaje.
> uMsg: especifica el mensaje a enviar.
> wParam: especifica información adicional específica para el mensaje.
> lParam: especifica información adicional específica para el mensaje.
>
> este es el sistema fundamental de Windows para hacer las cosas: envía
> constantemente "mensajitos" y alguien se encarga de tratarlos. Nuestro
> antiguo Keyboard() no sabe llamar bien y por eso no le hacen caso.
>
> De esta función destacamos (buscar información del API de Windows -
> localizar en interner un fichero llamado "WinAPI5.pdf" en castellano, muy
> interesante.):
>
> SendMessage(hWnd, WM_NEXTDLGCTL ,0 ,0)
>
> con esto cambiamos el foco, en la ventana hWnd, al siguiente objeto (como
> si
> pulsamos TAB).
>
> SendMessage(hWnd, WM_CHAR, Asc(cCaracter), 0)
>
> con esto, en un control de edición (de handle hWnd), simulamos la
> pulsación
> del carácter "cCaracter".
>
> SendMessage(GetFocus(), BM_CLICK, 0, 0, 0)
>
> con esto simulamos el click en un botón.
>
> Ojo: es muy importante el hWnd que se usa: no es lo mismo poner el de la
> ventana activa (es el necesario para cuando cambiamos el foco), que el del
> control en el que hacemos click o ponemos un carácter.
>
> Os envío como me ha quedado el evento onTimer ... y ¡¡ ME FUNCIONA !! (no
> me
> beso porque no me llego)
>
> //---------------------------------------------------------- ----------------
> ----
>
> METHOD Timer1Timer( oSender ) CLASS TForm1
>
> LOCAL hWnd, hWnDFax, cCaracter
> LOCAL nNumFax := "976872024"
> LOCAL nNum
>
> hWnd := GetActiveWindow() // Ya que me presenta otra ventana
> IF GetWindowText( hWnd ) == "LAN-Fax"
>
> // 5 cambios de Foco me llevan al Edit del nº de FAx
> FOR nNum = 1 TO 5
> SendMessage(hWnd, WM_NEXTDLGCTL ,0 ,0)
> END
>
> hWnDFax := GetFocus() // Handle del objeto Edit
> FOR EACH cCaracter IN nNumFax
> // Asi se pone el numero de fax, de 1 en 1 caracter
> SendMessage(hWnDFax, WM_CHAR, Asc(cCaracter), 0)
> END
>
> // 9 cambios de Foco me llevan al Boton "Enviar"
> FOR nNum = 1 TO 9
> SendMessage(hWnd, WM_NEXTDLGCTL ,0 ,0)
> END
>
> // ... y pulso ENTER en el boton
> SendMessage(GetFocus(), BM_CLICK, 0, 0, 0)
>
> ::oTimer1:lEnabled := .F. // DesActivo el Timer
>
> ENDIF
>
> RETURN Nil
>
> //---------------------------------------------------------- ----------------
> ----
>
>
Jesus Semper
Mensajes: 54
Registrado: Lun Ene 04, 2010 2:40 pm

Duda con SendMessage del API

Mensaje por Jesus Semper »

No me queda muy claro si los datos a capturar estan en pantalla completa de
MS-DOS.
Si fuera asi, en un programa Clipper se capturaba el contenido de una zona
mediante:
cPantalla := SaveScreen(nSup, nIzq,nInf,nDer)
esto, creo recordar, era una cadena con 2 caracteres por posicion de
pantalla (80x24 habitualmente) y seleccionando los pares o impares daria el
texto del contenido.
¿ Se puede hacer eso desde Windows ? .... Ni idea.
En cualquier caso para que alguien lo resuelva hace falta mas detalles del
proceso:
¿ Desde tu programa Windows ejecutas un programa emulador para acceder al
IBM(AS600) y aparece un programa MS-DOS en pantalla completa ( ¿o en
ventana?) y deseas desde tu programa Windows capturar los datos de dicha
pantalla MS-DOS para luego tratarlos en el programa Windows ? .
"Paco V." <ssi-estono-@ono.com> escribió en el mensaje
news:4a98ee44$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
>
> Pregunto:
> ¿Esto tambien valdria para una ventana de msdos?
>
> En mi empresa se trabaja con una aplicacion que creo que es un emulador de
> un sistema de IBM(AS600). Y tengo que poner valores en una venta de
msdos,
> despues me devuelve la información y tengo que capturarla.
> ¿Serviria?
>
> Paco V
ssi-estono-
Mensajes: 239
Registrado: Sab Ene 24, 2009 8:23 pm

Duda con SendMessage del API

Mensaje por ssi-estono- »

La ventana de MS-DOS está maximizada pero es ventana.
Necesito escribir datos en esa ventana, y luego leer los resulatdos que me
devuelva para tratarlos desde la aplicación de Xailer.
Gracias por tu interes.
Saludos.
Paco V
"jso" <jesus@semper-sl.com> escribió en el mensaje
news:4a98f3ea$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> No me queda muy claro si los datos a capturar estan en pantalla completa
> de
> MS-DOS.
>
> Si fuera asi, en un programa Clipper se capturaba el contenido de una zona
> mediante:
>
> cPantalla := SaveScreen(nSup, nIzq,nInf,nDer)
>
> esto, creo recordar, era una cadena con 2 caracteres por posicion de
> pantalla (80x24 habitualmente) y seleccionando los pares o impares daria
> el
> texto del contenido.
>
> ¿ Se puede hacer eso desde Windows ? .... Ni idea.
>
> En cualquier caso para que alguien lo resuelva hace falta mas detalles del
> proceso:
> ¿ Desde tu programa Windows ejecutas un programa emulador para acceder
> al
> IBM(AS600) y aparece un programa MS-DOS en pantalla completa ( ¿o en
> ventana?) y deseas desde tu programa Windows capturar los datos de dicha
> pantalla MS-DOS para luego tratarlos en el programa Windows ? .
>
>
>
>
> "Paco V." <ssi-estono-@ono.com> escribió en el mensaje
> news:4a98ee44$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
>>
>> Pregunto:
>> ¿Esto tambien valdria para una ventana de msdos?
>>
>> En mi empresa se trabaja con una aplicacion que creo que es un emulador
>> de
>> un sistema de IBM(AS600). Y tengo que poner valores en una venta de
> msdos,
>> despues me devuelve la información y tengo que capturarla.
>> ¿Serviria?
>>
>> Paco V
>
>
Jesus Semper
Mensajes: 54
Registrado: Lun Ene 04, 2010 2:40 pm

Duda con SendMessage del API

Mensaje por Jesus Semper »

He probado una cosa y creo que se podría automatizar algo. (Tendrás que
investigar mas sobre ello)
He creado en Xailer un simple programa con una sola ventana y un TMemo en su
interior.
He definido la propiedad ::oFont del memo como Courier ya que esta es un
tipo de letra fija y así se obtendrá el formato encolumnado igual que en
MS-DOS
Lanzo mi programa Xailer.
Ejecuto mi programa de gestión (Clipper en MS-DOS) en ventana completa.
En el programa de gestión, en la pantalla que quiero capturar he pulsado la
tecla ImpPant del teclado (esta hace que se envíe el contenido de la
pantalla al portapapeles-tambien en MS-DOS).
Con Alt+Tab cambio del programa MS-DOS al de Xailer.
Estando en el memo de xailer pulso Ctr+V (Pegar al portapapeles) y... ¡¡ YA
TIENES TUS DATOS EN EL MEMO !!
Ahora tienes que sacar la parte que te interese de dicho memo. Si siempre es
el mismo formato de pantalla no tendrás problemas porque la información
siempre ocupara las mismas posiciones.
Si no es una pantalla sino que es un listado. imagino que se detendrá y
esperará a que pulses una tecla para seguir (además, en este caso, no me
extrañaría que el emulador tenga la opción de enviar los datos a un
fichero - En este caso si que no tienes problemas para tratarlo luego en
xailer)
Cosas que hay que resolver para automatizar mas:
1º - Lo mas difícil son automatizar las acciones estando en el MS-DOS.
Hay que decirle a Window que capture la pantalla MS-DOS y que cambie a otra
venta.
Esto se debería hacer programando un timer que detecte si estás en la
ventana MS-DOS que deseas capturar. Si no, te hará capturas de pantallas que
quizás no te interesen.
¿Como distinguir la pantalla con los datos que te interesa capturar de otra
que no deseas? - Quizas el sistema de pulsar uno mismo sea lo mas adecuado.
Otro problema vendrá porque un timer en xailer seguramente no haga nada
salvo que estés en xailer. Con lo cual no se activará estando en la ventana
MS-DOS.
He visto en el API un mensaje llamado SendMessage(hWnd, WM_TIMER, ...) que
imagino permitirá crear un timer general. No se si mecere la pena trabajar
en ello.
No he probado nada mas pero quizás funcionen:
SendMessage(hWnd, WM_SYSCOMMAND, SC_SCREENSAVE,0,0) // Para salvar
pantalla en MS-DOS
SendMessage(hWnd, WM_SYSCOMMAND, SC_NEXTWINDOW,0,0) // Pasar a
siguiente ventana - para volver a xailer.
2º- Copiar en el memo. quizás con el mensaje
SendMessage(hWnd, WM_PASTE,0,0) // Desde Xailer para pegar contenido del
portapapeles
Aunque aquí tengo dudas ya que existe en xailer la clase TClipboard que
seguro que es mas sencilla de uso.
Ya nos contaras si avanzas en algo. Un saludo.
-------------------------------------------------
"Paco V." <ssi-estono-@ono.com> escribió en el mensaje
news:4a9909a1$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> La ventana de MS-DOS está maximizada pero es ventana.
> Necesito escribir datos en esa ventana, y luego leer los resulatdos que me
> devuelva para tratarlos desde la aplicación de Xailer.
>
> Gracias por tu interes.
>
> Saludos.
>
> Paco V
> "jso" <jesus@semper-sl.com> escribió en el mensaje
> news:4a98f3ea$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
>> No me queda muy claro si los datos a capturar estan en pantalla completa
>> de
>> MS-DOS.
>>
>> Si fuera asi, en un programa Clipper se capturaba el contenido de una
>> zona
>> mediante:
>>
>> cPantalla := SaveScreen(nSup, nIzq,nInf,nDer)
>>
>> esto, creo recordar, era una cadena con 2 caracteres por posicion de
>> pantalla (80x24 habitualmente) y seleccionando los pares o impares daria
>> el
>> texto del contenido.
>>
>> ¿ Se puede hacer eso desde Windows ? .... Ni idea.
>>
>> En cualquier caso para que alguien lo resuelva hace falta mas detalles
>> del
>> proceso:
>> ¿ Desde tu programa Windows ejecutas un programa emulador para acceder
>> al
>> IBM(AS600) y aparece un programa MS-DOS en pantalla completa ( ¿o en
>> ventana?) y deseas desde tu programa Windows capturar los datos de dicha
>> pantalla MS-DOS para luego tratarlos en el programa Windows ? .
>>
>>
>>
>>
>> "Paco V." <ssi-estono-@ono.com> escribió en el mensaje
>> news:4a98ee44$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
>>>
>>> Pregunto:
>>> ¿Esto tambien valdria para una ventana de msdos?
>>>
>>> En mi empresa se trabaja con una aplicacion que creo que es un emulador
>>> de
>>> un sistema de IBM(AS600). Y tengo que poner valores en una venta de
>> msdos,
>>> despues me devuelve la información y tengo que capturarla.
>>> ¿Serviria?
>>>
>>> Paco V
>>
>>
>
>
notengo
Mensajes: 417
Registrado: Vie Oct 12, 2007 1:29 pm

Duda con SendMessage del API

Mensaje por notengo »

Jesús,
si quieres redondear tu solución puedes usar FindWindow y así­ te sirve
aunque la aplicación del FAX no esté en primer plano o no esté visible.
METHOD Timer1Timer( oSender ) CLASS TForm1
...
//hWnd := GetActiveWindow() // Ya que me presenta otra ventana
hWnd := FindWindowEx( , "Lan-FAX" )
IF ! Empty( hWnd )
...
//---------------------------------------------------------- --------------------
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
XA_FUNC( FINDWINDOWEX )
{
hb_retnl( (LONG) FindWindowEx(
ISNUM( 3 ) ? (HWND) hb_parnl( 3 ) : NULL,
ISNUM( 4 ) ? (HWND) hb_parnl( 4 ) : NULL,
ISCHAR( 1 ) ? (LPCTSTR) hb_parc( 1 ) : NULL,
ISCHAR( 2 ) ? (LPCTSTR) hb_parc( 2 ) : NULL ) );
}
#pragma ENDDUMP
Saludos,
José Lalí­n
Jesus Semper
Mensajes: 54
Registrado: Lun Ene 04, 2010 2:40 pm

Duda con SendMessage del API

Mensaje por Jesus Semper »

Para este caso no se si me sirve. Me exprese mal. Tras hacer la
previsualizacion y dar al boton de "Imprimir" aparece la ventana de
"Imprimir" (todavia no existe la ventana "Lan-FAX"), esta aparece cuando
selecciono dicha impresora y pulso "Aceptar". Por ello tengo dudas de que
funcionara.
Sin embargo si me parece muy interesante para otras ocasiones en que ya este
activa una pantalla y se desea seleccionar esta.
Muchas gracias.
"José Lalín" <notengo@correo.com> escribió en el mensaje
news:[email=4aa56a04@svctag-j7w3v3j....]4aa56a04@svctag-j7w3v3j....[/email]
Jesús,
si quieres redondear tu solución puedes usar FindWindow y así te sirve
aunque la aplicación del FAX no esté en primer plano o no esté visible.
METHOD Timer1Timer( oSender ) CLASS TForm1
....
//hWnd := GetActiveWindow() // Ya que me presenta otra ventana
hWnd := FindWindowEx( , "Lan-FAX" )
IF ! Empty( hWnd )
....
//---------------------------------------------------------- --------------------
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
XA_FUNC( FINDWINDOWEX )
{
hb_retnl( (LONG) FindWindowEx(
ISNUM( 3 ) ? (HWND) hb_parnl( 3 ) : NULL,
ISNUM( 4 ) ? (HWND) hb_parnl( 4 ) : NULL,
ISCHAR( 1 ) ? (LPCTSTR) hb_parc( 1 ) : NULL,
ISCHAR( 2 ) ? (LPCTSTR) hb_parc( 2 ) : NULL ) );
}
#pragma ENDDUMP
Saludos,
José Lalín
notengo
Mensajes: 417
Registrado: Vie Oct 12, 2007 1:29 pm

Duda con SendMessage del API

Mensaje por notengo »

Jesus,
entendido, pensaba que lo tení­as corriendo como un servicio.
Saludos,
José Lalí­n
Jesus Semper
Mensajes: 54
Registrado: Lun Ene 04, 2010 2:40 pm

Duda con SendMessage del API

Mensaje por Jesus Semper »

Solo es una prueba.
Al contestar un mensaje en "local.xailer.pro.es" me da error de servidor
480 y problema en puerto 110.
Jesus Semper
Mensajes: 54
Registrado: Lun Ene 04, 2010 2:40 pm

Duda con SendMessage del API

Mensaje por Jesus Semper »

Corrijo, puerto 119, error de servidor 480. Me dice que no tengo "posting"
Responder