Duda con SendMessage del API
Publicado: Jue Ago 27, 2009 9:56 pm
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)Â
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)Â