PDA

Ver la Versión Completa : Leer caption de botenes de cualquier APP


StartKill
05-01-2016, 19:54:30
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:

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

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

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

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/torry/showcode.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.
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ú