2011-10-20 16 views
18

ho cercato su google e stackoverflow per 2 ore ora. Deve esserci qualcosa che sto semplicemente trascurando. C'è un modo semplice per rendere il testo selezionabile in una messagebox? A partire da ora, quando chiamo un MessageBox.Show() non riesco a copiare il testo visualizzato. Perchè no? come potrei impostare il testo in modo che sia in grado di copiare?C# seleziona il testo da messagebox.show popup

il mio codice:

//catch all exceptions 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
      //throw; 
     } 

voglio essere in grado di selezionare il messaggio di errore che viene fuori in modo che un utente può inviare a me e posso risolvere il loro problema. Qualsiasi aiuto è molto apprezzato.

MODIFICA: impossibile utilizzare il metodo crtl-c. I miei utenti non sono in grado di cogliere questo concetto. È necessario evidenziare con il mouse e fare clic con il pulsante destro per selezionare l'opzione. Grazie!

MODIFICA: Per riferimento, quello che ho finito è usare una combinazione di risposte. Ho creato una finestra popup con un solo pulsante e sull'azione del pulsante che ho copiato negli appunti. Non è perfetto ma con l'etichetta giusta funziona abbastanza bene per ora. Grazie a tutti per i suggerimenti!

//catch all exceptions 
      catch (Exception ex) 
      { 
       //MessageBox.Show(ex.Message); 
       MessageBoxButtons buttons = MessageBoxButtons.OK; 
       DialogResult result; 

       // Displays the MessageBox. 

       result = MessageBox.Show(ex.Message + "\n\nClick OK button to copy to clipboard", "Error", buttons); 

       if (result == System.Windows.Forms.DialogResult.OK) 
       { 

        Clipboard.SetText(ex.Message); 
        //throw; 

       } 

      } 
+2

Se un utente fa clic su Ctrl-C quando la MessageBox è attivo, il messaggio, la didascalia messagebox ed i pulsanti etichette vengono copiati negli appunti. – Nasreddine

+1

@Nacereddine hai ragione. Tuttavia, attualmente i miei utenti non capiscono che è un'opzione possibile e vogliono che il testo sia chiaro e riproducibile :( – toosweetnitemare

+4

Hai bisogno di un MessageBox personalizzato.Ci sono alcuni collegamenti forniti nella seguente risposta: http://stackoverflow.com/questions/ 4704839/custom-messagebox/4705061 # 4705061 – Nasir

risposta

27

Se un utente preme Ctrl-C mentre il MessageBox è attivo, il messaggio, la didascalia MessageBox e le etichette MessageBoxButtons vengono copiati negli Appunti.

Modifica: È possibile inviare i messaggi a un file di testo e chiedergli di inviarli via email? per rendere le cose più facili, si potrebbe mettere il file sul proprio desktop

+5

Un suggerimento di Windows non molto conosciuto, mentre può essere molto utile. – Otiel

+0

Creazione di file sul deskto p potrebbe non essere disponibile a causa dei diritti utente se in esecuzione sotto UAC – mgttlinger

1

Per quanto ne so, questo è stato chiesto un sacco di tempo, e l'unica soluzione che ho trovato, se che è possibile selezionare la finestra di messaggio, copiarlo (che otterrà la copia), e poi si può incollarlo, e sarà incollare il contenuto in qualcosa di simile a un bel formato ...

da predefinito, finestra di messaggio standard ha alcun modo per selezionare il testo ..

+0

Grazie Questo è ciò di cui avevo paura ... – toosweetnitemare

7

vorrei copiare il testo del MessageBox negli appunti dopo o prima che l'utente chiude il MessageBox utilizzando il codice in questo modo:

var msg = "Hello world!"; 
MessageBox.Show(msg); 
Clipboard.SetText(msg); 

Questo dovrebbe essere facile abbastanza per essere compreso dai tuoi utenti.

+1

Questo non funziona per me. 'String message =" Non ci sono Host da inviare al ping. Inserisci nome host/ip nel campo. "; MessageBox.Show (messaggio); Clipboard.SetText (messaggio); 'sembra proprio di non copiare negli appunti – toosweetnitemare

+0

@toosweetnitemare A nessuno piace sentire questo, ma il vostro codice funziona sulla mia macchina. Dopo averlo eseguito, sono in grado di incollare il messaggio nel Blocco note. Ho visto qualcuno dire che avevano lo stesso problema che hai su una macchina Windows 7. La loro soluzione era chiamare questo codice prima di chiamare SetText(): 'Clipboard.Clear();' –

+0

Quindi molto vero. Odio sentire "beh funziona sulla mia macchina" haha ​​Grazie per il suggerimento di 'Clipboard.Clear();' Stavo iniziando a giocare con le opzioni degli Appunti. Il tuo suggerimento funziona meravigliosamente, ma per riferimento, ho anche ottenuto 'Clipboard.SetDataObject (message, true);' Grazie per il tuo aiuto! – toosweetnitemare

6

Su tutti i sistemi di produzione su cui ho mai lavorato, creiamo una finestra di dialogo personalizzata che ha un messaggio utente amichevole con un pulsante per inviare via e-mail il messaggio di errore, la traccia dello stack, una schermata e le informazioni di sistema al supporto email.

+0

Alla fine di questo controllo qualità è possibile vedere un'implementazione di questo, con il registro delle azioni degli utenti incluso nell'e-mail di supporto: http://stackoverflow.com/questions/30326673/user-activity-logging-telemetry-and-variables- in--eccezioni-gestori globali –

1

MessageBox è una finestra e ha una finestra, quindi è possibile utilizzare le funzioni di windows api per trovarle.Guardate queste importazioni:

[DllImport("user32.dll", SetLastError = true)] 

static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

[DllImport("user32.dll", SetLastError = true)] 

static extern IntPtr FindWindowEx(IntPtr hwndParent, 
       IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 

static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); 

Si noti che se si dà il MessageBox un titolo rende possibile l'uso di FindWindow per trovarlo. Passando l'handle restituito in FindWindowEx puoi trovare la sua finestra figlio e GetWindowText ti permetterebbe di leggere quel testo. Source Attribution

Ma non hai già il contenuto del messaggio? Dovresti essere in grado di visualizzarlo, giusto?