25

我已经在 google 和 stackoverflow 上搜索了 2 个小时。必须有一些我只是简单地忽略的东西。有没有一种简单的方法可以在消息框中选择文本?截至目前,当我调用 MessageBox.Show() 时,我无法复制显示的文本。为什么不?我将如何将文本设置为可复制?

我的代码:

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

我希望能够选择出现的错误消息,以便用户可以将其发送给我,我可以解决他们的问题。任何帮助是极大的赞赏。

编辑:不能使用 crtl-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;

                }

            }
4

6 回答 6

40

如果用户Ctrl-C在 MessageBox 具有焦点时按下,则消息、MessageBox 标题和 MessageBoxButtons 标签将复制到剪贴板。

编辑:您可以将消息输出到文本文件并让他们通过电子邮件将其发送给您?为方便起见,您可以将文件放在他们的桌面上

于 2011-10-20T18:17:29.883 回答
7

我会在用户使用如下代码关闭 MessageBox 之后或之前将 MessageBox 的文本复制到剪贴板:

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

这应该很容易让您的用户理解。

于 2011-10-20T18:27:14.130 回答
7

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

于 2011-10-20T18:27:29.813 回答
1

据我所知,这已经被问了很多时间,我发现的唯一解决方案是你可以选择消息框,复制它(它会得到复制),然后你可以粘贴它,它会粘贴内容类似于一个不错的格式...

默认情况下,标准消息框无法选择文本。

于 2011-10-20T18:16:29.463 回答
1

从这篇文章 -从 MessageBox/Msgbox 复制文本...

您可以使用 Ctrl-C 从消息框中复制消息。

How to allow copying message on MessageBox 开始,您无法以编程方式访问默认 Windows 操作系统消息框中的文本。为此,您需要一个自定义控件。

于 2011-10-20T18:17:15.973 回答
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 可以让您读取该文本。 来源归属

但是你不是已经有了消息的内容吗?您必须这样做才能显示它,对吗?

于 2016-08-11T14:50:36.360 回答