C#从MessageBox.Show弹出窗口中选择文本

24
我已经在谷歌和stackoverflow上搜索了2个小时。肯定有我简单地忽略掉的东西。是否有一种简单的方法可以使MessageBox中的文本可选择?当前,当我调用MessageBox.Show()时,我不能复制显示的文本。为什么?如何设置文本可以被复制?
我的代码:
//catch all exceptions
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            //throw;
        }

我希望能够选择生成的错误信息,以便用户将其发送给我,我可以解决他们遇到的问题。非常感谢任何帮助。

编辑:无法使用ctrl-c方法。我的用户无法理解那个概念。需要用鼠标突出显示并右键单击以选择选项。谢谢!

编辑:为了参考,我最终采用了多种答案。我创建了一个弹出窗口,其中有一个按钮,当按钮被点击时,会将内容复制到剪贴板。虽然不是完美的解决方案,但在正确的标签下它已经足够好用了。感谢大家的建议!

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

                }

            }

3
如果用户在消息框具有焦点时单击Ctrl-C,则将消息、消息框标题和按钮标签复制到剪贴板中。 - Nasreddine
1
@Nacereddine,你说得很对。然而,我的用户目前不明白这是一个可行的选择,并希望文本能够被高亮和复制 :( - toosweetnitemare
4
你需要一个自定义的MessageBox。以下回答提供了一些链接:http://stackoverflow.com/questions/4704839/custom-messagebox/4705061#4705061 - Nasir
1
@toosweetnitemare 你可以将消息输出到文本文件中,并通过电子邮件发送给自己,以便更方便地管理。为了使事情更简单,你可以将文件放在他们的桌面上。 - Nasreddine
@Nacereddine,这是一个好主意。虽然我认为我只需要在弹出窗口中添加一个按钮,上面写着“复制消息”,并在按下按钮时将其复制到剪贴板中。你能把你的答案添加到答案列表中吗?我很乐意给你提供建议的信用。 - toosweetnitemare
6个回答

41
如果用户在消息框具有焦点时按下Ctrl-C,则消息、消息框标题和MessageBoxButtons标签将复制到剪贴板。
编辑:您可以将消息输出到文本文件中,并通过电子邮件将其发送给自己?为了使事情变得更容易,您可以将文件放在他们的桌面上。

7
一个不太为人知的Windows提示,虽然它非常方便。 - Otiel
如果在UAC下运行,由于用户权限的限制,可能无法在桌面上创建文件。 - mgttlinger

7
我会在用户关闭消息框之前或之后使用以下代码将您的MessageBox文本复制到剪贴板中: ``` 我会在用户关闭消息框之前或之后使用以下代码将您的 MessageBox 文本复制到剪贴板中:
```
var msg = "Hello world!";
MessageBox.Show(msg);
Clipboard.SetText(msg);

这应该对你的用户来说很容易理解。


1
这对我不起作用。String message = "没有可ping的主机,请在字段中输入主机名/ip。"; MessageBox.Show(message); Clipboard.SetText(message); 似乎无法复制到剪贴板。 - toosweetnitemare
@toosweetnitemare 没有人喜欢听到这个,但是你的代码在我的电脑上可以运行。运行后,我能够将你的消息粘贴到记事本中。我确实看到有人说他们在 Windows 7 上遇到了与你相同的问题。他们的解决方法是在调用 SetText() 之前调用此代码:Clipboard.Clear(); - Jay Riggs
非常正确。我讨厌听到“在我的电脑上可以运行”哈哈。感谢您建议使用Clipboard.Clear();。我刚开始尝试使用剪贴板选项。您的建议非常有效,但是作为参考,我也使用了Clipboard.SetDataObject(message, true);。感谢您的帮助! - toosweetnitemare
10
这是一个糟糕的想法。你不应该盲目地覆盖用户剪贴板中的内容,而不事先询问他们;你并不知道它有多重要或不重要。 - Dan Bechard

7
我曾经工作过的所有生产系统上,我们都会创建一个自定义对话框,其中包含友好的用户消息和一个按钮,用于将错误消息、堆栈跟踪、屏幕截图和系统信息发送到支持电子邮件。

1
在本问答的结尾,您可以看到一个实现示例,其中包括用户操作日志在支持电子邮件中:http://stackoverflow.com/questions/30326673/user-activity-logging-telemetry-and-variables-in-global-exception-handlers - Jeremy Thompson

1

MessageBox是一个窗口,也有一个窗口,因此您可以使用Windows API函数来查找它们。看看这些导入:

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

请注意,如果您为MessageBox设置标题,则可以使用FindWindow找到它。将返回的句柄传递到FindWindowEx中可让您找到其子窗口,而GetWindowText则可让您读取该文本。 来源归属 但是,您已经有消息的内容了吗?为了显示它,您必须拥有它,对吧?

1
据我所知,这个问题已经被问了很多次,而我找到的唯一解决方案是您可以选择消息框,复制它(它将被复制),然后您可以粘贴它,它将以某种漂亮的格式粘贴内容...

默认情况下,标准消息框没有选择文本的方法...


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接