PDA

Ver la Versión Completa : Realizar acciones con la ventana del programa inactiva


Furyxe
23-01-2012, 02:45:09
Hola a todos.

Vengo a ver si alguien puede ayudarme. Explicare la situación.

Yo he creado un programa, que envía una serie de "Teclas" a un webbrowser cada XX minutos. Esas "Teclas" son utilizadas para automatizar procesos.
El problema es, que para que el programa envie las teclas, y el Web Browser las reciba y ejecute, el programa tiene que estar como ventana activa.
Impidiéndome realizar ninguna otra acción de mientras en el ordenador, como por ejemplo jugar.

Lo que yo quiero hacer, es que el programa sea capaz de realizar las mismas acciones, pero cuando la ventana no esté activa.

Asi podría minimizarlo al lado del reloj de windows, y el programa seguiría realizando las acciones cada XX minutos.

Ha alguien se le ocurre alguna solucion?

Gracias ^^

Neftali [Germán.Estévez]
23-01-2012, 11:06:40
A veces pensamos en un programa como la "ventana activa" tal y como tú comentas, y realmente a veces no es así. Me explico. Seguramente, el componente que recibe las teclas no es "el Browser", el "browser" es la aplicación y dentro de esta aplicación hay muchos componentes y cada uno de ellos con un ID (Handle). Aunque la aplicación recibe las teclas, en realidad éstas van a parar a unos de los componentes concretos que hay en esa aplicación.

No se si funcionará, pero podrías intentar acceder al handle del componente que relamente recibe las teclas y enviárselas a ese.

No se si me explico...

Casimiro Notevi
23-01-2012, 11:46:06
No sé qué es lo que estás haciendo ni para qué, pero si quieres hacer algo repetitivo (o no) enviando teclas, también puedes usar macros en el propio navegador, por ejemplo: imacros
(https://addons.mozilla.org/es-ES/firefox/addon/imacros-for-firefox/?src=userprofile)

Furyxe
23-01-2012, 12:38:56
A ver.

Neftali, lo entiendo a medias, el razonamiento si esta claro, pero nose como enviar las teclas a ese handle.

Casimiro.

La idea es un programa que envia una serie de tabuladores, y la tecla enter, con el fin de navegar por distintos enlaces. Quizas el componente de firefox que me pasas, sea util. Pero la idea es hacer yo el programa, y seguir aprendiendo, y no usar soluciones ya existentes.

El codigo que utilizo actualmente para enviar teclas, es:

keybd_event(VK_SPACE, 0, 0, 0);
keybd_event(VK_SPACE, 0, KEYEVENTF_KEYUP, 0);

Creo que tambien hay por ahi una forma de enviar las teclas de forma "virtual".

El programa, realiza bien las tareas, pero solo cuando tiene el foco.
Alguna idea?

Gracias a ambos por las respuestas ^^

Neftali [Germán.Estévez]
23-01-2012, 13:15:04
Neftali, lo entiendo a medias, el razonamiento si esta claro, pero nose como enviar las teclas a ese handle.

...La idea es un programa que envía una serie de tabuladores,

Bueno, mi comentario es más una idea, no te puedo asegurar que funcione. Se trataría de enviar mensajes a ese handle. Revisa en los foros sobre envío de mensajes...

En cuanto a lo que comentas a Casimiro, si la idea es ir navegando a accediendo a páginas, ¿no podrías extraer la información de la página web y posteriormente acceder directamente a esas direcciones?

Furyxe
23-01-2012, 13:43:13
Bueno, mi comentario es más una idea, no te puedo asegurar que funcione. Se trataría de enviar mensajes a ese handle. Revisa en los foros sobre envío de mensajes...

En cuanto a lo que comentas a Casimiro, si la idea es ir navegando a accediendo a páginas, ¿no podrías extraer la información de la página web y posteriormente acceder directamente a esas direcciones?

Ahora cuando tenga un ratito reviso eso.

Y en cuanto a lo de extraerla, si y no.

Resulta, que el programa funciona con un sistema de configuraciones.
Podria haber extraido toda la informacion, almacenarla en una base de datos, y obtener. Pero resulta, que tras analizar la informacion, son mas de 300 url a guardar, y las url a ser de paginas externas, pueden cambiar en cualquier momento.

En cambio, el algoritmo que yo he hecho, es bastante simple, trabaja con un bucle for, que segun la configuracion asignada, da mas o menos "vueltas". Y las vueltas son obtenidas de una pequeña formula que me he inventado. Es decir, es una solucion rapida, sin tener que andar accediendo a base de datos u otros medios parecidos.

Y funciona perfectamente, pero solo si esta activo el programa. En caso de tenerlo minimizado o algo, no hace nada, y eso es lo que quiero arreglar.


EDITO:
He probado a enviar mensajes al handle con: "PostMessage(Form1.WebBrowser1.handle,WM_KEYDOWN,VK_TAB,0);".

Basandome en el siguiente codigo de internet:
var
x,tecla:integer
begin
for x:=0 to ComponentCount-1 do
if (Componentes[x] is TEdit) and
(TEdit(Components[x]).Focused=True)then
PostMessage(TEdit(Components[x]).handle,WM_KEYDOWN,tecla,0);

Parece ser o que no uso bien la "conversion" que he hecho, o que no funciona:S

Furyxe
24-01-2012, 22:08:01
Mmm, busco por internet pero no encuentro respuesta alguna.

Alguien tiene alguna idea sobre el tema?