PDA

Ver la Versión Completa : Saber el ClassNAme de una ventana


Faust
29-07-2007, 00:49:39
Estoy probando la función GetClassName para saber el ClassName de una ventana, pero como no soy muy bueno con los PChar y PAnsiChar, no puedo, ¿alguien me podría ayudar?

Gracias

cHackAll
29-07-2007, 03:14:20
procedure TForm1.Button1Click(Sender: TObject);
var ClassName: array [0..255] of Char;
begin
GetClassName(Handle, @ClassName, SizeOf(ClassName));
Caption := ClassName;
end;

un PChar, tambien denominado PAnsiChar es un puntero que apunta una posicion de la memoria que contiene una cadena de texto terminada por #0. Para acceder a ella podrías hacer algo como esto:

FindWindow('Progman', nil);
FindWindow(PChar('Progman')), nil);
FindWindow(PChar(Str), nil); // Siendo Str un string

Para obtener un valor debes tener muy en cuenta cómo funciona la API, sin embargo aconsejo utilizar mi ejemplo como base.

Saludos.

Caral
29-07-2007, 03:18:22
Hola
Muy interesante cHackAll, esto del API, siempre me deja perdido.:)
Se nota la mano del maestro.
saludos

Faust
29-07-2007, 04:11:39
Muchas gracias compañero cHackAll, ahora estoy haciendo algunas pruebas

Me armé un programilla con un Edit para anotar el Caption del formulario que quiero saber que ClassName tiene, un botón para ejecutar GetClassName y un memo para guardar los ClassName que vaya viendo, pero ahora noto algo raro:

De mi formulario mi aplicación tiene como ClassName TForm1, pero de otras de mis aplicaciones su ClassName es TApplication, de una aplicación hecha en VB es ThunderRT6FormDC y de una aplicación MFC es Afx:400000:b:10013:6:302a1, con que cosas se encuentra uno, normalmente ¿cuál sería el ClassName de un Form? ¿el del que desciende p. ej. TForm?, ¿pero porque algunas de mis aplicaciones muestran TApplication?, ¿exactamente que es el ClassName que devuelve la función GetClassName?

cHackAll
30-07-2007, 10:03:00
...¿exactamente que es el ClassName que devuelve la función GetClassName?

GetClassMame retorna el nombre de la clase de la ventana; el problema es que cuando le haces GetClassName(Handle..., estás pidiendo el nombre de la clase de la ventana "actual", cuando le haces GetClassName(Application.Handle... le estas pidiendo el nombre de la clase de la aplicación.

Cuando tu registras una clase puedes ponerle lo que quieras, así que tener una clase que englobe al 100% de las ventanas está un poco dificil.

Saludos