2012-06-20 13 views
7

Estoy intentando crear un script C# .NET 2.0 para automatizar un flujo de trabajo en una aplicación de terceros escrita en Java.Esperar a que se cargue la ventana de la aplicación de un tercero

Estoy usando las funciones user32.dll para poder interactuar con las ventanas de la aplicación Java.

Mi problema es que las ventanas de la aplicación Java tardan en cargarse completamente y mi acción enviada a través de IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, UInt32 wParam, IntPtr lParam) a veces se pierde. Ejemplo: durante la carga de la ventana principal, si trato de abrir un menú (en este momento tengo un control en la ventana principal), mi mensaje simplemente se pierde y el menú nunca se abre.

Encontré algunas respuestas en Stack Overflow diciendo que podíamos usar el método Process.WaitForInputIdle() para tal fin, pero descubrí que esto solo funciona si la aplicación es de un solo subproceso, que no es el caso de mi aplicación Java. (C# SendKeys Wait for Program to Load before sending)

estoy en busca de algo de trabajo de la misma idea, pero que soporta multi-hilo o cualquier otra idea que podría tener:?!)

siguiente idea del Mari9' finalmente he utilizado la System.Diagnostic.PerformanceCounter() para ver el tercer actividad de proceso de la aplicación del partido Luego commite a 0, significa que el proceso ha hecho lo que tenía que hacer y es capaz de ejecutar el mensaje que le envío.

PerformanceCounter PC = new PerformanceCounter(); 
PC.CategoryName = "Process"; 
PC.CounterName = "% Processor Time"; 
PC.InstanceName = "<process name>"; 
Console.WriteLine(PC.NextValue().ToString()); 
+0

eliminé la respuesta porque no leí la segunda mitad de su pregunta :-( – Schwarzie2478

Respuesta

3

que se supone que tiene una forma de detectar cuando la ventana que desea enviar a la entrada se muestra en la pantalla, pero el envío inmediato de entrada no funciona ya que la ventana está ocupada.

Puede tener un intervalo de espera predefinido/codificado (posiblemente personalizado para cada ventana de Java); esto no es muy confiable, pero puede funcionar bien en un entorno controlado (por ejemplo, si la aplicación se usa solo en su computadora).

Si la apariencia de la ventana cambia confiablemente cuando se completa la carga, puede capturar una captura de pantalla de la ventana y probar si los píxeles correctos están allí, y repetir esto hasta que sea verdadero antes de enviar el mensaje.

Otra opción es utilizar Spy ++ para ver si se genera un mensaje en particular para una ventana cuando la carga está completa (por ejemplo, podría ser un repintado con ciertos parámetros) e instalar un gancho para detectar esos mensajes.

Si la aplicación Java usa controles de ventana nativos (SWT), puede tratar de detectar cambios en los textos/estructuras de la ventana que indiquen que la carga está completa.

Si el proceso de carga de la ventana consume muchos recursos, también puede controlar el uso de la CPU de la aplicación Java y esperar al final del 'pico' antes de enviar su mensaje.

+0

Ya utilicé las funciones para hacer que funcione mi script. Lo que no me gusta con esa solución es que o bien conservo suficiente margen y el script lento o no uso suficiente y el script a veces falla. Para la solución del mensaje, no he encontrado un mensaje que indique la finalización de la carga de la ventana. Acerca de su idea de captura de pantalla, ¿conoce una API que funciona bien? en C#? – Tuxicoman

+1

Prefiero PrintWindow a través de P/Invoke, ya que captura la ventana independientemente de lo que está en la parte superior: http://www.pinvoke.net/default.aspx/user32/PrintWindow.html – Mari9

+0

Tengo que admitir que mi función no siempre funciona. Tal vez intente con el pinvoke. Pero necesitaré una buena función de comparación de imágenes (rápida). – Tuxicoman

Cuestiones relacionadas