2009-05-31 15 views
5

Estoy creando un cuadro de mensaje personalizado que le permite copiar texto, pero quería que se viera exactamente como un cuadro de mensaje estándar, así que me gustaría configurar el texto de los botones en el idioma del sistema, como lo hace la clase MessageBox . ¿Alguien sabe cómo obtener ese texto ("Sí", "No", "Cancelar", etc.) ?.¿Cómo obtengo el título del botón MessageBox?

+0

Si no encuentra una solución, quizás pueda colocar el mensaje de texto en el portapapeles e informar al usuario que el mensaje está en el portapapeles. – Stormenet

+2

Si presiona Ctrl + C cuando se muestra un MessageBox estándar, copiará el texto en el portapapeles de manera predeterminada. –

+0

Gracias por la sugerencia, pero de todos modos necesito más personalización, como barras de desplazamiento para mensajes más grandes. – rodrigoq

Respuesta

6

Gracias por sus respuestas con el enlace de Snarfblam pude entender el resto.

class Program { 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern int LoadString(IntPtr hInstance, uint uID, StringBuilder lpBuffer, int nBufferMax); 
[DllImport("kernel32")] 
static extern IntPtr LoadLibrary(string lpFileName); 

private const uint OK_CAPTION = 800; 
private const uint CANCEL_CAPTION = 801; 
private const uint ABORT_CAPTION = 802; 
private const uint RETRY_CAPTION = 803; 
private const uint IGNORE_CAPTION = 804; 
private const uint YES_CAPTION = 805; 
private const uint NO_CAPTION = 806; 
private const uint CLOSE_CAPTION = 807; 
private const uint HELP_CAPTION = 808; 
private const uint TRYAGAIN_CAPTION = 809; 
private const uint CONTINUE_CAPTION = 810; 

static void Main(string[] args) { 
    StringBuilder sb = new StringBuilder(256); 

    IntPtr user32 = LoadLibrary(Environment.SystemDirectory + "\\User32.dll"); 

    LoadString(user32, OK_CAPTION, sb, sb.Capacity); 
    string ok = sb.ToString(); 

    LoadString(user32, CANCEL_CAPTION, sb, sb.Capacity); 
    string cancel = sb.ToString(); 

    LoadString(user32, ABORT_CAPTION, sb, sb.Capacity); 
    string abort = sb.ToString(); 

    LoadString(user32, RETRY_CAPTION, sb, sb.Capacity); 
    string retry = sb.ToString(); 

    LoadString(user32, IGNORE_CAPTION, sb, sb.Capacity); 
    string ignore = sb.ToString(); 

    LoadString(user32, YES_CAPTION, sb, sb.Capacity); 
    string yes = sb.ToString(); 

    LoadString(user32, NO_CAPTION, sb, sb.Capacity); 
    string no = sb.ToString(); 

    LoadString(user32, CLOSE_CAPTION, sb, sb.Capacity); 
    string close = sb.ToString(); 

    LoadString(user32, HELP_CAPTION, sb, sb.Capacity); 
    string help = sb.ToString(); 

    LoadString(user32, TRYAGAIN_CAPTION, sb, sb.Capacity); 
    string tryAgain = sb.ToString(); 

    LoadString(user32, CONTINUE_CAPTION, sb, sb.Capacity); 
    string cont = sb.ToString(); 

} 
-2

En el momento en que escribió ese mensaje, que podría haber escrito "Sí", "No", "aceptable", "Cancelar" ...

+3

Estoy bastante seguro de que OP quiere tomar el texto del sistema para que esté en el idioma correcto (configuración regional del sistema) –

+0

Exactamente Adán, eso es lo que necesito para no tener que agotar todos los idiomas – rodrigoq

0

Es posible abrir la System.Windows.Forms.dll en Reflector y vea cómo está configurando el texto del botón.

+0

Lo hice, pero la llamada al cuadro de mensaje es una función en user32.dll por lo que el texto se obtiene en el nivel bajo, estoy seguro de que hay una API para obtenerlo. – rodrigoq

4

Estas cadenas parece que está almacenado en la biblioteca User32.dll. Hay detalles en this discussion en el foro Pure BASIC, hacia la parte inferior.

+0

Muchas gracias porque pude encontrar la solución, publicaré el código en unos minutos. – rodrigoq

Cuestiones relacionadas