c#从消息框中选择文本.显示弹出

本文关键字:文本 显示 选择 消息 | 更新日期: 2023-09-27 18:11:58

我已经在Google和stackoverflow上搜索了2个小时了。肯定有什么是我忽略了的。是否有一种简单的方法使文本在消息框中可选择?到目前为止,当我调用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;
                }
            }

c#从消息框中选择文本.显示弹出

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

编辑:你可以把消息输出到一个文本文件,让他们用电子邮件发给你?为了方便起见,您可以将文件放在他们的桌面上

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

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

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

据我所知,这个问题已经被问了很多次了,我发现的唯一解决方案是,你可以选择消息框,复制它(它会得到复制),然后你可以粘贴它,它会以一种很好的格式粘贴内容…

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

From this post - Copy Text From MessageBox/Msgbox…

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

以及如何允许在MessageBox上复制消息,您不能以编程方式访问默认Windows操作系统消息框中的文本。你需要一个自定义控件

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来找到它。将句柄返回给findwindowwex让你找到它的子窗口,GetWindowText让你读取那个文本。源归因

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