elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Cambiar el ClassName de un formulario
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Cambiar el ClassName de un formulario  (Leído 3,633 veces)
Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Cambiar el ClassName de un formulario
« en: 2 Marzo 2016, 16:09 pm »

Hola

Es algo que se ha preguntado mucho pero que parece no haber respuesta y es como cambiar el ClassName de un formulario VB.

He comprobado el ClassName de todas las aplicaciones que tengo y jamás me ha aparecido el ThunderRT6... o WindowsForms10.Window.8... típico de formularios de VB. Luego ¿Nadie programa con VB? Con el viejo VB6 no se podía, ¿ahora tampoco? O es que VB es solo para memos  :¬¬


S2s


« Última modificación: 3 Marzo 2016, 12:50 pm por Lekim » En línea

kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
Re: Cambiar el ClassName de un formulario
« Respuesta #1 en: 2 Marzo 2016, 16:33 pm »

En C++ cuando creas una instancia de una ventana puedes registrar el nombre de su clase con la API RegisterClassEx antes de llamar a CreateWindowEx. Supongo que es algo que hace el framework por defecto al crear la instancia de tu Windows Form.

Aunque con SetWindowLongPtr he llegado a cambiar hasta el bucle de eventos por el mío propio, así que como la MSDN dice, SetWindowLongPtr sirve para cambiar aspectos de la ventana especificada. También tienes SetClassLongPtr que te permite cambiar atributos de la estructura WNDCLASSEX, estructura que tiene un campo para el nombre de la clase. Así que supongo que por ahí van los tiros. Suele ser una práctica implementada en packers o programas que ocultan la traza del lenguaje en el que fue codeada la aplicación.

Saludos!


« Última modificación: 2 Marzo 2016, 17:15 pm por kub0x » En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Cambiar el ClassName de un formulario
« Respuesta #2 en: 3 Marzo 2016, 13:07 pm »

Bueno, en realidad también se puede hacer lo mismo en VB que en C++ siempre y cuando crees una ventana mediante CreateWindowEx e iniciando la aplicación desde Sub Main (en vb6 no he probado en .Net). En tal caso es cuando se puede usar RegisterClassEx.

Pero entonces no vale la pena programar con VB para eso yo me pasaría a C /C++ diréctamente. Lo bueno de VB es la facilidad de entorno de programación, la facilidad del diseño gráfico y el no tener que crear ventanas, ni controles mediante código.



« Última modificación: 3 Marzo 2016, 13:35 pm por Lekim » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Cambiar el ClassName de un formulario
« Respuesta #3 en: 3 Marzo 2016, 17:17 pm »

He comprobado el ClassName de todas las aplicaciones que tengo y jamás me ha aparecido el ThunderRT6... o WindowsForms10.Window.8... típico de formularios de VB. Luego ¿Nadie programa con VB?

La conclusión a la que has llegado no es acertada, el "prefijo" WindowsForms10 del nombre de la clase de ventana se refiere a la versión de la tecnología Windows Forms (10), y esto a su vez indica que se trata de una app que está desarrallada bajo cualquier lenguaje soportado por dicha tecnología (como por ejemplo C#), no tiene por que ser Vb.Net, por ende, no tiene sentido pensar que nadie programa en Vb.Net (o C#) solamente por no encontrar ese tipo de classname en las aplicaciones instaladas en un PC cualquiera.



Para Microsoft, cada ventana debe tener un nombre de clase de ventana único para evitar colisiones con otros nombres de clase de ventana en otros procesos, es por ese motivo que en la implementación de WindowsForms los nombres de classes se autogeneran dinamicamente siguiendo estas reglas de identificación de ventana:

Código:
<windowsformsversion>.<windowstyle>.app<hexappdomainhash>

No es posible asignar un nombre distinto de forma arbitraria, pero por otro lado, para la mayoría de classes que implementan la interfáz IWin32Window (como Form, o Control) se puede hackear el identificador del estilo de ventana (<windowstyle>) de forma sencilla mediante el uso de la propiedad que controla los parámetros de la ventana, conocida como CreateParams), de la siguiente manera:
 
Código
  1. Public NotInheritable Class Form2 : Inherits Form
  2.  
  3.    Protected Overrides ReadOnly Property CreateParams As CreateParams
  4.        Get
  5.            MyBase.CreateParams.ClassName = "BUTTON" ' WindowsForms10.BUTTON.app***
  6.            Return MyBase.CreateParams
  7.        End Get
  8.    End Property
  9.  
  10. End Class


También podemos crear una simple ventana Win32 y podemos registrar un nombre de clase para dicha ventana con la función RegisterClassEx de la API de Microsoft Windows como ya ha mencionado el compañero @Kub0x (aunque basicamente esto en realidad es una colección de valores o flags que determinan el estilo de ventana), es algo más tedioso, así que he buscado un ejemplo ya desarrollado para mostrar:

PD: En WPF, UWP, y otras tecnologías de Microsoft, imagino que la mecánica o estructura de los classnames será más o menos la misma que en Windows Forms, no me he llegado a fijar nunca en si hay un patrón, pero no hay motivo para pensar lo contrario.

Saludos!
« Última modificación: 3 Marzo 2016, 17:35 pm por Eleкtro » En línea

Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Cambiar el ClassName de un formulario
« Respuesta #4 en: 3 Marzo 2016, 18:59 pm »

WindowsForms10 del nombre de la clase de ventana se refiere a la versión de la tecnología Windows Forms (10),

Obvio , y si es la versión VB56 pues será WindowsForms56 pero aún falta mucho para eso XD. Se entiende que son ejemplos...

se puede hackear el identificador del estilo de ventana (<windowstyle>) de forma sencilla mediante el uso de la propiedad que controla los parámetros de la ventana, conocida como CreateParams), de la siguiente manera:

Este método ya lo conocía, si no recuerdo mal colgué el mismo método para cambiar los estilos del form. Pero cambiar solo WindowsForms10.MyForm... o lo que sea pues no me sirve, pero se agradece el ejemplo.

http://foro.elhacker.net/net/cambiar_estilo_de_las_ventanas_invertir_quitar_botones_bloquear_etc-t444898.0.html

Código:
También podemos crear una simple ventana Win32 y podemos registrar un nombre de clase para dicha ventana con la función RegisterClassEx

Bien, eso es lo que he comentado yo, pero para eso no vale la pena, según me parecer programar con VB. Por lo que ya he explicado. En su día lo hacía con VB6 iniciando desde Sub Main, pero como he dicho no he probado con VB.Net. De hecho cuando empecé hace poco en VB.Net, esperaba no tener que usar RegisterClassEx y no tener que crear mi propia ventana.
 
Método con VB6:
http://visualbasic.happycodings.com/api-and-miscellaneous/code12.html


Código
  1. Private Sub CreateForm()
  2.    Const CLASSNAME = "Custom_Form"
  3.    Const TITLE = "TITLE"
  4.  
  5.    Dim lhwndWindow As Long, lHwndLabel As Long
  6.  
  7.    Dim tCreate As CREATESTRUCT
  8.    Dim tWinClass As WNDCLASSEX
  9.    Dim tMessage As MSG
  10.  
  11. '....
  12.  
  13.    'Create a window
  14.    lhwndWindow = CreateWindowEx(0&, CLASSNAME, TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0&, 0&, App.hInstance, 0&)
  15.  
  16.  

En este ejemplo el Form tendría com nombre de clase Custom_Form

Sl2s
« Última modificación: 3 Marzo 2016, 19:13 pm por Lekim » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines