【问题标题】:c# select text from messagebox.show popupc#从messagebox.show弹出窗口中选择文本
【发布时间】:2011-12-12 00:26:26
【问题描述】:

我已经在 google 和 * 上搜索了 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;

                }

            }

【问题讨论】:

  • 如果用户在 MessageBox 获得焦点时单击 Ctrl-C,则会将消息、消息框标题和按钮标签复制到剪贴板。
  • @Nacereddine 你说得很对。但是,我的用户目前不理解这是一个可能的选项,并希望文本可突出显示和可复制:(
  • 您需要一个自定义消息框。以下答案中提供了一些链接:*.com/questions/4704839/custom-messagebox/…
  • @toosweetnitemare 您可以将消息输出到文本文件并让他们通过电子邮件将其发送给您吗?为方便起见,您可以将文件放在他们的桌面上。
  • @Nacereddine 这是个好主意。虽然我认为我只是在弹出窗口中添加一个按钮,上面写着复制消息,并在按下按钮时将其复制到剪贴板。您能否将您的答案添加到答案列表中,并很高兴为您的建议表示感谢。

标签: c# text messagebox noncopyable


【解决方案1】:

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

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

【讨论】:

  • 一个不为人知的 Windows 提示,但它可能非常方便。
  • 如果在UAC下运行,由于用户权限,可能无法在桌面上创建文件
【解决方案2】:

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

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

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

【讨论】:

  • 这对我不起作用。 String message = "There is no Host to ping. Please enter hostname/ip into Field."; MessageBox.Show(message); Clipboard.SetText(message); 似乎没有复制到剪贴板
  • @toosweetnitemare 没有人喜欢听这个,但你的代码在我的机器上运行。运行后,我可以将您的消息粘贴到记事本中。我确实看到有人说他们在 Windows 7 机器上遇到了同样的问题。他们的解决方法是在调用 SetText() 之前调用此代码:Clipboard.Clear();
  • 非常真实。我讨厌听到“它在我的机器上运行良好”哈哈谢谢Clipboard.Clear(); 的建议我刚刚开始玩剪贴板的选项。您的建议非常有效,但作为参考,我也得到了Clipboard.SetDataObject(message, true); 谢谢您的帮助!
  • 这是个糟糕的主意。你不应该在没有先询问用户的情况下盲目地覆盖用户在剪贴板上的内容;你不知道它有多重要。
【解决方案3】:

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

【讨论】:

【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    来自这篇文章 - Copy Text from MessageBox/Msgbox...

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

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

    【讨论】:

      【解决方案6】:

      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 可以让您读取该文本。 Source Attribution

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

      【讨论】: