Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-04-2008
octalh octalh is offline
Miembro
 
Registrado: feb 2008
Posts: 18
Poder: 0
octalh Va por buen camino
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;
var
  ventanas:Array[0..20] of HWND;
  Count:Integer;
begin
 ventanas[count] := FindWindow('Notepad', nil);
   if Ventanas[count] > 0 then begin
         For Count := 20 downto 0 do begin

              // codigo keybd_event

         end;
   end;

end;
Suponiendo que tengo dos ventanas del bloc de notas, el codigo unicamente enviara keybd_event a una de las dos ventanas abiertas.

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

gracias
Responder Con Cita
  #2  
Antiguo 22-04-2008
Avatar de juanmdq
juanmdq juanmdq is offline
Miembro
 
Registrado: dic 2004
Posts: 52
Poder: 20
juanmdq Va por buen camino
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.
__________________
Al infierno se llega por atajos.
Responder Con Cita
  #3  
Antiguo 23-04-2008
octalh octalh is offline
Miembro
 
Registrado: feb 2008
Posts: 18
Poder: 0
octalh Va por buen camino
gracias por la respuesta, si todas son ventanas externas, pero debe existir una forma de enumerarlas por separado

sigo tratando con el bucle pero no puedo conseguirlo
Responder Con Cita
  #4  
Antiguo 23-04-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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:

Código Delphi [-]
{
  Procesa la ventana indicada por Handle

  La función agrega el nombre de la clase de la ventana al objeto TStrings que
  se le pasa como parámetro.

  La función debe regresar true para indicar a EnumWindows que continúe
  listando ventanas.
}
function ProcessWindow(Handle: HWND; Log: TStrings): BOOL; stdcall;
var
  ClassName: array[0..255] of Char;

begin
  GetClassName(Handle, ClassName, 255);
  Log.Add(ClassName);

  Result := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear;
  Memo1.Lines.BeginUpdate;

  EnumWindows(@ProcessWindow, LParam(Memo1.Lines));

  Memo1.Lines.EndUpdate;
end;

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):

Código Delphi [-]
if UpperCase(ClassName) = 'NOTEPAD' then
begin
  {
    Hacer lo que quieras con la ventana indicada por Handle
  }
end;

// Saludos
Responder Con Cita
  #5  
Antiguo 23-04-2008
octalh octalh is offline
Miembro
 
Registrado: feb 2008
Posts: 18
Poder: 0
octalh Va por buen camino
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...
Responder Con Cita
  #6  
Antiguo 23-04-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #7  
Antiguo 23-04-2008
Avatar de Faust
Faust Faust is offline
Miembro
 
Registrado: abr 2006
Ubicación: México D.F.
Posts: 930
Poder: 19
Faust Va por buen camino
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é.
__________________
Herr Heins Faust
Responder Con Cita
  #8  
Antiguo 23-04-2008
octalh octalh is offline
Miembro
 
Registrado: feb 2008
Posts: 18
Poder: 0
octalh Va por buen camino
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
begin
// codigo keybd_event para enviar teclas
end;
solo que el problema regresa.. solo se envian a una de las dos.

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 .
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Multiples Ventanas en una Aplicacion Nomad Varios 7 18-05-2007 22:12:28
ayuda como agregar una clase Big_blood Varios 1 24-04-2007 05:25:03
Ayuda sobre Handle Pascalizado Varios 2 06-11-2006 05:21:54
ayuda comparar Handle JerS API de Windows 3 30-10-2006 20:19:01
Ayuda Con Clase DES edgusano .NET 2 04-04-2005 22:05:41


La franja horaria es GMT +2. Ahora son las 12:26:08.


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
Copyright 1996-2007 Club Delphi