Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ayuda handle de multiples ventanas de la misma clase (https://www.clubdelphi.com/foros/showthread.php?t=55565)

octalh 21-04-2008 02:43:19

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

gracias :o

juanmdq 22-04-2008 19:54:46

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.

octalh 23-04-2008 02:54:20

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

roman 23-04-2008 03:49:32

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

octalh 23-04-2008 05:47:53

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

roman 23-04-2008 06:36:30

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

Faust 23-04-2008 06:54:56

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é.

octalh 23-04-2008 07:44:16

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 :(.


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