Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Leer caption de botenes de cualquier APP (https://www.clubdelphi.com/foros/showthread.php?t=89647)

StartKill 05-01-2016 19:54:30

Leer caption de botenes de cualquier APP
 
Saludo a todos por fiestas del año nuevo.

A mi pregunta:
Deseo pasar el puntero del mouse sobre un boton de cualquier App y leer su caption, se puede?
o algun otro metodo para leer los caption de los button de cualquier App.


A la espera de su ayuda

Your Friend

StartKill
Lima-Perú

orodriguezca 05-01-2016 20:42:19

Si se puede. En la empresa para la que trabajo el equipo de QA utiliza una herramienta para automatización de pruebas llamada TestComplete. Esa herramienta es capaz de hacer ese tipo de cosas y, algunas de las automatizaciones, casualmente consiste en verificar que los botones de la aplicación que se está "testeando" tienen los "captions" que se esperan.

Como dije, "Si se puede", pero ¿Como se puede?, No tengo ni idea :D

Casimiro Notevi 05-01-2016 23:05:03

¿Con "app" te refieres a los programas para iOS?

escafandra 06-01-2016 00:34:00

Se puede con la API, en concreto con el mensaje WM_GETTEXT.

Lo siguiente es un ejemplo de como usarlo desde delphi:
Código Delphi [-]
var
  P: TPoint;
  hWind: HANDLE;
  Buffer: array [0..255] of CHAR;
begin
  // Localizamos la ventana a la que apunta el mouse...
  GetCursorPos(P);
  hWnd:= WindowFromPoint(P);

  // Leemos su caption...
  SendMessage(hWnd, WM_GETTEXT, 255, Cardinal(@Buffer[0]));

  // y lo mostramos en un MessageBox
  MessageBox(0, @Buffer[0], 'El Caption es:'); 
end;

Saludos.

StartKill 06-01-2016 18:16:05

Muy buenas con el foro

Antes de todo gracias por el interes a mi problema;

Etimado orodriguezca, por lo menos ya se que no era una locura mia ;)

Cita:

Por: Casimiro Notevi
¿Con "app" te refieres a los programas para iOS?
No, me refiero a Aplicaciones Windows :)

Código Delphi [-]
 Por: escafandra
var
  P: TPoint;
  hWind: HANDLE;
  Buffer: array [0..255] of CHAR;
begin
  // Localizamos la ventana a la que apunta el mouse...
  GetCursorPos(P);
  hWnd:= WindowFromPoint(P);

  // Leemos su caption...
  SendMessage(hWnd, WM_GETTEXT, 255, Cardinal(@Buffer[0]));

  // y lo mostramos en un MessageBox
  MessageBox(0, @Buffer[0], 'El Caption es:'); 
end;
Si no me equivoco este código es para obtener los caption de un aplicativo

//-------------
Siendo un poco mas explicito con mi duda:

Es un aplicativo que muestra un conjunto de botones de forma aleatoria ( pero siempre son los mismos caption )

El orden de los caption de los botones puede ser:
-> Implantar, Dregradar, Abrir, Aceptar, Cancelar

Otras veces es:
-> Implantar, Cancelar, Dregradar, Aceptar, Abrir
y todas las permutaciones que pudieran existir...

Tengo las coordenadas de los botones, pero no se en que boton automatizar el click.. por ello mi interes de capturar el caption del boton donde se encuentre el mouse antes del click automático ( logicamente sin hacer click sobre el para obtener el caption...)

Your Friend

StartKill
Lima-Perú

roman 06-01-2016 21:13:34

Cita:

Empezado por StartKill (Mensaje 501056)
Si no me equivoco este código es para obtener los caption de un aplicativo

Ese código hará lo que buscas. Recuerda que un botón es también una ventana. En todo caso, puedes complementar el código con GetClassName para determinar si la ventana bajo el cursor del ratón corresponde a un botón.

// Saludos

StartKill 06-01-2016 22:21:34

Hola a todos

Tenias razón escafandra

Gracias roman por darme la pista

Código Delphi [-]
procedure TForm17.FormCreate(Sender: TObject);
begin
   Form17.FormStyle := fsStayOnTop;
   Timer1.Interval := 50;
end;

procedure TForm17.ShowHwndAndClassName(CrPos: TPoint);
var
   hWnd: THandle;
   aName: array [0 .. 255] of Char;
   Buffer: array [0..255] of CHAR;
begin
   hWnd := WindowFromPoint(CrPos);
   Label1.Caption := 'Handle :  ' + IntToStr(hWnd);

   if Boolean(GetClassName(hWnd, aName, 256)) then begin
      Label2.Caption := 'ClassName :  ' + string(aName);
      SendMessage(hWnd, WM_GETTEXT, 255, Cardinal(@Buffer[0]));
      label3.Caption:= string(Buffer);
   end
   else
      Label2.Caption := 'ClassName :  not found';
end;

procedure TForm17.Timer1Timer(Sender: TObject);
var
   rPos: TPoint;
begin
   if Boolean(GetCursorPos(rPos)) then
      ShowHwndAndClassName(rPos);
end;

En base a sus recomendaciones empecé a buscar y añadi la lineas del código de escafandra ... :) :) :D

http://www.swissdelphicenter.ch/torr...ode.php?id=141

Gracias a todos

Your friend

StartKill
Lima-Perú

StartKill 07-01-2016 16:51:11

Saludos nuevamente

El código expuesto debería leer los caption de cualquier elemento de cualquier App.
Código Delphi [-]
procedure TForm17.FormCreate(Sender: TObject);
begin
   Form17.FormStyle := fsStayOnTop;
   Timer1.Interval := 50;
end;

procedure TForm17.ShowHwndAndClassName(CrPos: TPoint);
var
   hWnd: THandle;
   aName: array [0 .. 255] of Char;
   Buffer: array [0..255] of CHAR;
begin
   hWnd := WindowFromPoint(CrPos);
   Label1.Caption := 'Handle :  ' + IntToStr(hWnd);

   if Boolean(GetClassName(hWnd, aName, 256)) then begin
      Label2.Caption := 'ClassName :  ' + string(aName);
      SendMessage(hWnd, WM_GETTEXT, 255, Cardinal(@Buffer[0]));
      label3.Caption:= string(Buffer);
   end
   else
      Label2.Caption := 'ClassName :  not found';
end;

procedure TForm17.Timer1Timer(Sender: TObject);
var
   rPos: TPoint;
begin
   if Boolean(GetCursorPos(rPos)) then
      ShowHwndAndClassName(rPos);
end;
No me funciona con un aplicativo de un tercero instalado en una empresa...

Para salir de la duda lo probé con otros aplicativos conocidos, por ejemplo con:
-Calculadora en el windows 7 (llevo el mouse sobre algun boton y no me lee el caption)
-Total commander (Solo con algunos botones no lee el caption)

No me funcionó como esperaba, ...

A la espera de sus respuestas...

Your friend

Startkill
Lima-Perú


La franja horaria es GMT +2. Ahora son las 21:49: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