如何获取MessageBox按钮的标题?

7
我正在制作一个自定义的消息框,可以复制文本,但我希望它看起来完全像标准的消息框,所以我想将按钮文本设置为系统语言所显示的内容(例如MessageBox类)。有人知道如何获取这些文本(如“Yes”,“No”,“Cancel”等)吗?

如果您找不到解决方案,或许可以将消息文本放在剪贴板上,告知用户消息已经复制到了剪贴板上。 - Stormenet
2
如果在显示标准MessageBox时按下Ctrl+C,它将默认将文本复制到剪贴板。 - Dan Walker
谢谢你的建议,但是无论如何我还需要更多的自定义功能,比如为较长的消息添加滚动条。 - rodrigoq
4个回答

8

谢谢你提供的答案和Snarfblam链接,我已经弄清楚了剩下的部分。

class Program {

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int LoadString(IntPtr hInstance, uint uID, StringBuilder lpBuffer, int nBufferMax);
[DllImport("kernel32")]
static extern IntPtr LoadLibrary(string lpFileName);

private const uint OK_CAPTION = 800;
private const uint CANCEL_CAPTION = 801;
private const uint ABORT_CAPTION = 802;
private const uint RETRY_CAPTION = 803;
private const uint IGNORE_CAPTION = 804;
private const uint YES_CAPTION = 805;
private const uint NO_CAPTION = 806;
private const uint CLOSE_CAPTION = 807;
private const uint HELP_CAPTION = 808;
private const uint TRYAGAIN_CAPTION = 809;
private const uint CONTINUE_CAPTION = 810;

static void Main(string[] args) {
    StringBuilder sb = new StringBuilder(256);

    IntPtr user32 = LoadLibrary(Environment.SystemDirectory + "\\User32.dll");

    LoadString(user32, OK_CAPTION, sb, sb.Capacity);
    string ok = sb.ToString();

    LoadString(user32, CANCEL_CAPTION, sb, sb.Capacity);
    string cancel = sb.ToString();

    LoadString(user32, ABORT_CAPTION, sb, sb.Capacity);
    string abort = sb.ToString();

    LoadString(user32, RETRY_CAPTION, sb, sb.Capacity);
    string retry = sb.ToString();

    LoadString(user32, IGNORE_CAPTION, sb, sb.Capacity);
    string ignore = sb.ToString();

    LoadString(user32, YES_CAPTION, sb, sb.Capacity);
    string yes = sb.ToString();

    LoadString(user32, NO_CAPTION, sb, sb.Capacity);
    string no = sb.ToString();

    LoadString(user32, CLOSE_CAPTION, sb, sb.Capacity);
    string close = sb.ToString();

    LoadString(user32, HELP_CAPTION, sb, sb.Capacity);
    string help = sb.ToString();

    LoadString(user32, TRYAGAIN_CAPTION, sb, sb.Capacity);
    string tryAgain = sb.ToString();

    LoadString(user32, CONTINUE_CAPTION, sb, sb.Capacity);
    string cont = sb.ToString();

}

4

这些字符串似乎存储在User32.dll库中。在Pure BASIC论坛的这个讨论中有详细信息,位于底部。


非常感谢,我找到了解决方案,我将在几分钟内发布代码。 - rodrigoq

0

你可以在Reflector中打开System.Windows.Forms.dll,看看它是如何设置按钮文本的。


我已经这样做了,但是消息框调用是在user32.dll中的一个函数,因此文本是在低级别获取的,我相信有一个API可以获取它。 - rodrigoq

-1
在你输入那条消息的时间里,你本可以输入“是”、“否”、“确定”、“取消”……

3
我很确定发布者想要从系统中获取文本,以便使其处于正确的语言环境(系统区域设置)中。 - Adam Pope
没错,Adam,这正是我需要的,这样我就不必耗尽所有语言了。 - rodrigoq

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