FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
Probando la función RealGetWindowClass
Un favor. Les estaré agradecido si pudieran realizar esta sencilla prueba en Delphi de la función de la API de Windows RealGetWindowClass y decirme qué resultado les arroja en pantalla:
En mi caso y con Windows XP, la cadena que devuelve BaseClassName es 'Button'. Me interesa conocer si esto será así en todas las versiones de Windows, o si en algunos casos Windows pudiera devolver la cadena totalmente en mayúsculas. La duda me surge a raíz de que toda la documentación oficial sobre las clases predefinidas de Windows, refieren a éstas con letras mayúsculas (BUTTON, EDIT, COMBOBOX, etcétera). Quiero estar seguro de que si RealGetWindowClass devuelve "Button", entonces siempre será "Button" y no a veces "BUTTON". Muchas gracias, saludos. |
#2
|
||||
|
||||
Hola Al.
Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#3
|
|||
|
|||
Hola Alberto
[Window Title] Project1 [Content] TButton [OK] Windows 7, Delphi XE2 y XE3 Saludos
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney |
#4
|
||||
|
||||
[Al González],
En Windows XP Professional SP3 x32 la función BaseClassName retorna : Button En Windows 7 Professional SP1 x32 la función BaseClassName retorna : Button En Windows 7 Professional x64 la función BaseClassName retorna : Button Espero sea útil Nelson. |
#5
|
||||
|
||||
Gracias ecfisa, Eliseo y Nelson.
Eliseo: Me llamó la atención tu resultado. Acabo de hacer la prueba en XE2 y Delphi 2007, y en efecto, me da 'TButton' cuando en Delphi 7 arroja 'Button'. Esto podría significar que algo cambió en la VCL respecto a la forma de hacer superclasificación. Con esto le sale otro tentáculo al problema que intento solucionar, ya que pensé que sólo habría de preocuparme el asunto de las mayúsculas y minúsculas, y casi daba por hecho que RealGetWindowClass serviría para obtener el nombre de la clase Windows sobre la que se basan algunos controles. Trato de encontrar el mecanismo por el cual, teniendo un identificador de ventana Windows (HWND) que no necesariamente sea de un objeto Delphi, pueda determinar si ese identificador es de un botón de presión normal, un cuadro de verificación (check box), un botón de radio (radio button), u otro tipo de objeto. Una dificultad estriba en que los tres primeros tipos de controles comparten en Windows la misma clase: "Button", pero se resolvería apoyándome en la función GetWindowLong con el parámetro gwl_Style para saber cuál de los tres tipos es. No podría usar solamente ésta última, porque las constantes de estilo comparten valor entre diferentes tipos de objetos Windows. Lo primero es determinar si un Handle dado es "Button" o no es "Button". GetClassName no sirve para eso con objetos Delphi y de otros lenguajes, ya que devuelve el nombre que una clase de componente registra en Windows (TButton, TCheckBox, TRadioButton). Como es de suponerse, estos nombres no son de fiar para determinar lo que se busca (podría haber un componente TColorCheckBox y no por que diga "CheckBox" significa que sea un cuadro de verificación). En cambio, y al menos en Delphi 7, RealGetWindowClass devuelve el nombre de la clase base, que por lo general es nativa de Windows y eso da cierta certeza. Pero ahora veo que Delphi 2007 o alguna versión anterior cambió esta regla y no será posible usar RealGetWindowClass...¿no será un "bug"? Lo sé, debí poner un título más descriptivo y empezar por detallar el objetivo, pero como creí que sólo iba a ser una cuestión de mayúsculas y minúsculas... Vamos a descansar, habrá de ocurrírsenos algo... Última edición por Al González fecha: 05-11-2012 a las 09:46:23. |
#6
|
||||
|
||||
Encontré que la función de Windows GetClassInfo podría ser la culpable, o más bien señalar al culpable. GetClassInfo trabaja de manera distinta si se activa la opción de proyecto Enable runtime themes.
Cuando se compila con esa opción, la cadena que devuelve RealGetWindowClass es 'TButton' y cuando no, la cadena devuelta es 'Button' (la que espero obtener). Esto ocurre porque momentos antes se llama a GetClassInfo para llenar una estructura WNDCLASS (lo cual es normal), pero el campo lpfnWndProc de esta estructura queda con un valor diferente al esperado cuando se utilizan "temas". Los invito a hacer nuevamente la prueba de antes con y sin temas. Toca indagar más sobre esta característica y ver qué tanto obstaculiza obtener la clase base de un HWND... Saludos y gracias nuevamente. |
#7
|
||||
|
||||
Cita:
// Saludos |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Probando el emsamblador de Delphi | Mav | API de Windows | 8 | 28-03-2008 06:51:13 |
Probando el ensamblador de Delphi 2 | Mav | Varios | 5 | 31-10-2007 04:15:33 |
|