ayuda handle de multiples ventanas de la misma clase
Hola, llevo ya varios dias tratando de manejar un loop para enumerar el handle de todas las ventanas abiertas de una clase, pero sigo sin conseguirlo.
Estoy intentando enviar teclas con keybd_event a varias ventanas abiertas, todas de la misma clase. con una sola ventana no tengo problemas, pero cuando tengo que enviar keybd_event a mas de una entonces ya no funciona. como se ve en este codigo por poner un ejemplo Código:
procedure msj3; Alguien sabe como enviar las teclas pulsadas a cada una de las ventanas?? ya que en ese ejemplo si existen dos ventanas manda dos mensajes a una de las dos ventanas, pero no envia un mensaje a cada una :confused: gracias :o |
hola, las ventanas a las que les queres enviar las teclas las creas vos o son externas ?
si son externas esta medio complicado con el findWindow porque esta siempre te devuelve el primer valor coincidente con la busqueda, es decir si tenes 20 notepad.exe abiertos siempre te va a devolver el handle de la primer coincidencia. ahora, si las ventanas las creas vos ... podes hacer que en el metodo on create del formulario se auto publiquen en alguna lista con formularios abiertos, de esta manera ya tendrias el tema solucionado. |
gracias por la respuesta, si todas son ventanas externas, pero debe existir una forma de enumerarlas por separado :confused:
sigo tratando con el bucle pero no puedo conseguirlo |
Prueba usar EnumWindows. Esta función de la API de Windows, lista todas las ventanas del escritorio, y por cada una llama a la función que tú le indiques pasando su identificador como parámetro.
Un ejemplo:
El ejemplo coloca en un Memo, los nombres de las clase de las ventanas. Una vez que detectes la clase que te interesa, puedes agregar un condicional a la función que procesa cada ventana (ProcessWindow en el ejemplo):
// Saludos |
Muchas gracias, esto funciona bastante bien para listar todas las ventanas con su respectiva clase, por lo que investige la funcion que me diste usa "call back" para obtener todo el listado de las clases.
el problema es que aparte de Findwindow, no se como obtener el handle de la ventana, ya que Findwindow solo toma el handle de la primer ventana en el "top level". Entonces lo que pasa es que tambien envia las teclas a una de las dos ventanas, apesar de que la funcionProcessWindow las encuentra todas. sabes como puedo obtener el handle de todas sin importar el nivel en que se encuentren??, intentare con getwindow pero parece que no hay mucha info. gracias... :o |
De verdad que no entendí nada de tu último mensaje. ¿Para qué quieres FindWindow si EnumWindows te encuentra todas las ventanas? Por lo que dices del nivel, quizá necesites EnumChildWindows en combinación con EnumWindows.
// Saludos |
Hace más o menos dos años hice un programa que ejecutaba 9 veces una aplicación y le enviaba pulsaciones de teclas, al ejecutar cada instancia de esa otra aplicación, captaba su handle con FindWindow y le cambiaba el Caption con SetWindowText y así cada vez que necesitaba enviarle pulsaciones de teclas buscaba su handle con FindWindow con el caption que yo le asigné.
|
Perdon si me explique mal, mira, modifique la funcion "ProcessWindow" para que ademas de la clase me de el titulo de cada ventana, de esta forma ya puedo mandar las teclas a dicha ventana sin utilizar Findwindow, ya que como me comentaste no es necesario ya que "EnumWindows" se encarga de proporcionarmelas, el problema persiste cuando envio dichas teclas, veras siguiendo el ejemplo que me diste hago lo siguiente.
Código:
if UpperCase(ClassName) = 'NOTEPAD' then por ejemplo si son dos notepad, manda dos veces la instruccion a una de las dos ventanas, no de forma individual a cada una.. ya no se que mas hacer.. mis conocimientos ya no me alcanzan para solucionar eso :(. |
La franja horaria es GMT +2. Ahora son las 05:55:43. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi