2011-10-20 116 views
18

he estado buscando en google y stackoverflow durante 2 horas ahora. Tiene que haber algo que simplemente estoy pasando por alto. ¿Hay alguna manera fácil de seleccionar el texto en un cuadro de mensaje? A partir de ahora cuando llamo a un MessageBox.Show() no puedo copiar el texto que se muestra. Por qué no? ¿Cómo puedo configurar el texto para que pueda copiar?C# seleccionar texto de messagebox.show popup

mi código:

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

Quiero ser capaz de seleccionar el mensaje de error que sale por lo que un usuario puede enviar a mí y me puede solucionar su problema. Cualquier ayuda es muy apreciada.

EDITAR: No se puede usar el método crtl-c. Mis usuarios no pueden comprender ese concepto. Es necesario resaltar con el mouse y hacer clic con el botón derecho para seleccionar la opción. ¡Gracias!

EDITAR: Por referencia, lo que terminé haciendo es usar una mezcla de las respuestas. Creé una ventana emergente con un solo botón y sobre la acción del botón copié en el portapapeles. No es perfecto, pero con la etiqueta correcta funciona bastante bien por ahora. ¡Gracias por todas las sugerencias!

//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

Si un usuario hace clic en Ctrl-C cuando MessageBox tiene el foco, el mensaje, el título del mensaje y las etiquetas de los botones se copian en el portapapeles. – Nasreddine

+1

@Nacereddine estás en lo cierto. Sin embargo, mis usuarios actualmente no entienden que es una opción posible y quieren que el texto sea resaltable y se pueda copiar :( – toosweetnitemare

+4

Necesita un MessageBox personalizado. Hay algunos enlaces en la siguiente respuesta: http://stackoverflow.com/questions/ 4704839/custom-messagebox/4705061 # 4705061 – Nasir

Respuesta

27

Si un usuario presiona Ctrl-C mientras MessageBox tiene el foco, el mensaje, el título de MessageBox y las etiquetas MessageBoxButtons se copian en el portapapeles.

Editar: ¿Podría enviar los mensajes a un archivo de texto y enviarlos por correo electrónico? para facilitar las cosas, se puede poner el archivo en su escritorio

+5

Una sugerencia de Windows no tan conocida, mientras que puede ser muy útil. – Otiel

+0

Crear archivos en el escritorio p puede no estar disponible debido a derechos de usuario si se ejecuta bajo UAC – mgttlinger

1

Por lo que yo sé, esto se ha hecho una gran cantidad de tiempo, y la única solución que encontré si eso se puede seleccionar el cuadro de mensaje, copiarlo (se obtendrá copia), y luego se puede pegar, y va a pegar el contenido en algo así como un formato agradable ...

de forma predeterminada, cuadro de mensaje estándar no tiene manera de seleccionar el texto ..

+0

Gracias .esto es a lo que le tenía miedo ... – toosweetnitemare

7

Me gustaría copiar el texto de su cuadro de mensaje en el portapapeles después o antes de que el usuario cierra el cuadro de mensaje utilizando el código de la siguiente manera:

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

Esto debería ser fácil suficiente para que tus usuarios lo entiendan

+1

Eso no funciona para mí. 'String message =" No hay un host para hacer ping. Ingrese nombre de host/ip en el campo. "; MessageBox.Show (mensaje); Clipboard.SetText (mensaje); 'parece que no copia al portapapeles – toosweetnitemare

+0

@toosweetnitemare A nadie le gusta escuchar esto, pero tu código funciona en mi máquina. Después de ejecutarlo, puedo pegar tu mensaje en el Bloc de notas. Vi a alguien decir que tenían el mismo problema que está teniendo en una máquina con Windows 7. Su solución era llamar a este código antes de llamar a SetText(): 'Clipboard.Clear();' –

+0

Muy cierto. Odio escuchar "bueno, funciona en mi máquina" jaja Gracias por la sugerencia de 'Clipboard.Clear();' Estaba empezando a jugar con las opciones del Portapapeles. Tu sugerencia funciona maravillosamente, pero como referencia, también obtuve 'Clipboard.SetDataObject (message, true);' ¡Gracias por tu ayuda! – toosweetnitemare

6

En todos los sistemas de producción en los que he trabajado, creamos un diálogo personalizado que tiene un mensaje de usuario amigable con un botón para enviar el mensaje de error, el seguimiento de pila, una captura de pantalla y la información del sistema al correo electrónico de soporte.

+0

Al final de este control de calidad puede ver una implementación de esto, con el registro de acciones de los usuarios incluido en el correo electrónico de soporte: http://stackoverflow.com/questions/30326673/user-activity-logging-telemetry-and-variables- in-global-exception-handlers –

1

El MessageBox es una ventana y tiene una ventana, por lo que puede usar las funciones de Windows api para encontrarlas.Mira estas importaciones:

[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); 

Tenga en cuenta que si se le da el cuadro de mensaje un título que hace posible el uso de FindWindow para encontrarlo. Pasar el controlador devuelto a FindWindowEx le permite encontrar su ventana secundaria y GetWindowText le permitirá leer ese texto. Source Attribution

¿Pero ya tienes el contenido del mensaje? Tendría que hacerlo para mostrarlo, ¿verdad?