• Domingo 15 de Diciembre de 2024, 22:05

Autor Tema:  Como obtengo el handle de un MessageBox  (Leído 2873 veces)

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Como obtengo el handle de un MessageBox
« en: Viernes 10 de Abril de 2009, 00:40 »
0
Estoy utilizando el MessageBox del .NetFramework

Necesito cambiarle el texto que traen los botones por defecto, eso lo hice con ayuda de la API de Windows y todo funciono correctamente.

Básicamente lo que hice fue ejecutar en el thread de la ventana actual una serie de llamados a EnumChildWindows buscando cual de ellas es el MessageBox y una vez lo encuentro hago otro llamado a EnumChildWindows buscando cuales de esas ventanas son los botones  a estos Botones  les cambio el texto a mi conveniencia con SetWindowText.

Hasta ahí todo funciona OK.

El lio es que cuando llamo al MessageBox desde una aplicación en modo consola el trabajo anterior no me sirve porque no se cual es la ventana padre del MessageBox, incluso he tratado hallando el handle de la ventana de la aplicación de consola pero he verificado que esta no es la ventana padre del MessageBox.

Cual es la ventana padre del MessageBox cuando la aplicación se ejecuta en modo consola?
o
En .net framework el MessageBox es estático, cómo se cual es el handler de un MesageBox si aún no lo he mostrado y ademas no tiene propiedades para obtener su handler?
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Como obtengo el handle de un MessageBox
« Respuesta #1 en: Viernes 10 de Abril de 2009, 06:35 »
0
Solucionado.

En una aplicación por consola un messagebox siempre es hijo de la ventana del desktop.

Por anto, también se debe tener en cuenta que se modifique solo el messagebox del proceso actual y que para este caso puntual la instancia estática del messageBox solo se crea al momento de invocar Show, así que se debe lanzar un proceso de manera asíncrona que  'escuche' por algún tiempo las ventanas de message box creadas y solo cuando sea creada en el proceso actual proceder a realizar el cambio de texto de los botones.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Como obtengo el handle de un MessageBox
« Respuesta #2 en: Viernes 10 de Abril de 2009, 10:04 »
0
Suena a solucion demasiado compleja y que tal vez no tenga en cuenta varios idiomas, muy probablemente crear un dialogo propio sea mas simple y efectivo (excepto que esto se ejecute sobre aplicaciones de terceros).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Como obtengo el handle de un MessageBox
« Respuesta #3 en: Viernes 10 de Abril de 2009, 15:46 »
0
Hola,
si es un poco compleja, mas de lo que espere inicialmente, pero la cree a manera de utilidad los textos no están fijos, son 100% intercambiables, básicamente creé una librería como utilidad capaz de modificar el comportamiento de los textos del messageBox quedo funcionando así:

Código: C#
  1.  
  2.     MsgBoxUtil::HackMessageBox("SI","NO", "CANCELAR");
  3.     MessageBox::Show("hola", "hola", MessageBoxButtons::YesNoCancel);
  4.  
  5.     MsgBoxUtil::HackMessageBox("REINTENTAR", "CANCELAR");
  6.     MessageBox::Show("hola2", "hola2", MessageBoxButtons::RetryCancel);
  7.  
  8.     MsgBoxUtil::HackMessageBox("Descartar", "Reintentar", "Ignorar");
  9.     MessageBox::Show("hola3", "hola3", MessageBoxButtons::AbortRetryIgnore);
  10.  
  11.     MsgBoxUtil::UnHackMessageBox();
  12.  
  13.     MessageBox::Show("Normal", "Normal", MessageBoxButtons::AbortRetryIgnore);
  14.  
  15.     Console::ReadLine();
  16.  
  17.  

EL muchacho en msdn quiere hacerlo localizable, creo que con esto puede tener una base para trabajar. :alien:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Heravar

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Como obtengo el handle de un MessageBox
« Respuesta #4 en: Jueves 23 de Abril de 2009, 15:09 »
0
Buenas!
Justo estoy necesitando algo así para usar junto con el ActiveSkin, que sirve para skinnear los formularios en VB6/VBNET/C#, pero que no skinnea los messageboxes, entonces tendría que hacer una jugada similar, para aplicarle el skin con el handle del msgbox

Podrias postear esa libreria?

Muchas gracias!

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Como obtengo el handle de un MessageBox
« Respuesta #5 en: Jueves 23 de Abril de 2009, 15:51 »
0
Es el ultimo articulo en mi blog.

Revisalo.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io