2009-05-31 15 views
5

Sto creando una casella di messaggio personalizzata che consente di copiare il testo, ma volevo che assomigliasse esattamente a una finestra di messaggio standard, quindi vorrei impostare il testo dei pulsanti su qualunque sia la lingua del sistema, come fa la classe MessageBox . Qualcuno sa come ottenere quel testo ("Sì", "No", "Annulla", ecc.) ?.Come si ottiene la didascalia del pulsante MessageBox?

+0

Se non si trova una soluzione, è possibile inserire il messaggio negli Appunti invece e informare l'utente che il messaggio è negli Appunti. – Stormenet

+2

Se si preme Ctrl + C quando viene visualizzato un MessageBox standard, per impostazione predefinita verrà copiato il testo negli Appunti. –

+0

Grazie per il suggerimento, ma in ogni caso ho bisogno di più personalizzazioni come le barre di scorrimento per i messaggi più grandi. – rodrigoq

risposta

6

Grazie per le vostre risposte con il collegamento Snarfblam ho potuto capire il 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

Nel tempo digitato quel messaggio, si potrebbe avere digitato "Sì", "No", "Ok", "Annulla" ...

+3

Sono abbastanza sicuro che l'OP vuole prendere il testo dal sistema in modo che sia nella lingua corretta (impostazioni locali del sistema) –

+0

Esattamente Adam, è quello che mi serve quindi non devo esaurire tutte le lingue – rodrigoq

0

Si potrebbe aprire la System.Windows.Forms.dll in Reflector e vedere come si imposta il testo del pulsante.

+0

L'ho fatto, ma la chiamata alla casella di messaggio è una funzione in user32.dll, quindi il testo è ottenuto a basso livello, sono sicuro che c'è una API per ottenerlo. – rodrigoq

4

Queste stringhe sembrano essere memorizzati nella libreria User32.dll. Ci sono dettagli in this discussion sul forum Pure BASIC, verso il basso.

+0

Grazie mille per aver trovato la soluzione, posterò il codice in pochi minuti. – rodrigoq

Problemi correlati