在所有表单上显示MessageBox,设置位置和/或颜色

mod*_*irl 5 c# messagebox visual-studio-2010

我有两种形式,我将其中一种形式的TopMost属性设置为true.在某个地方,当程序运行时,我显示一个MessageBox,但由于TopMost设置为true,当MessageBox弹出时,它显示在最顶层的表单下,所以我看不到它.

  1. 有没有什么方法可以让我的一个表单总是在顶部,但是当一个MessageBox弹出时,让消息框显示在该特定表单的顶部?

  2. 是否可以为MessageBox提供一个位置,以便它不显示在中间但例如屏幕上的低位?

  3. 假设我有一个橙色的表单,我可以只为该特定应用程序设置一个粉红色的消息框.我的意思是我不是指播放Windows颜色属性.(我不希望所有消息框都是粉红色的.)

Kim*_*Won 10

我用这个.

MessageBox.Show(
                "message",
                "title",
                MessageBoxButtons.OK,
                messageBoxIcon,
                MessageBoxDefaultButton.Button1,
                (MessageBoxOptions)0x40000); // this set TopMost
Run Code Online (Sandbox Code Playgroud)


que*_*atl 8

1)MessageBox.Show方法有一个重载,它接受Window类型的第一个参数.如果你使用那个重载而不仅仅是Show(字符串),即:

class MyForm : Form {
    void method(){
       MessageBox.Show(this, "blablablablabla");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后MessageBox将以"模态"模式显示,它将完全位于该表单的顶部.现在只需确保您通过最顶层的表格即可完成.副作用是'模态'模式将导致消息框阻塞原始窗口,直到消息被解除.

2)不,这是不可能直接的.但是,您可以使用.Net轻松玩游戏并获取消息框的"句柄",然后通过P/Invoke将窗口移动到某些WinApi函数,但我建议您不要.

3)不,这对MessageBoxes来说是不可能的

您希望在(2)和(3)中实现的目标是不可能的,因为MsgBox意味着简单.为了得到这些东西,你将不得不编写自己的小形式作为消息框,并呈现该形式而不是消息框.该表单将具有任何样式,任何位置和您喜欢的任何行为.


Chr*_*ris 8

MessageBox要在应用程序的所有其他形式(包括带有 set 的形式)之上显示 a,TopMost您可以使用Show()采用 type 参数的方法重载MessageBoxOptions,并将 MessageBoxOptions.ServiceNotification 作为该参数传递。

DialogResult result = MessageBox.Show("Configuration file was corrupted.\n\nDo you want to reset it to default and lose all configurations?", "Config File Corrupted", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2, MessageBoxOptions.ServiceNotification);
Run Code Online (Sandbox Code Playgroud)


Joe*_*oel 5

最顶级的简单方法MessageBox是这样的:

using (var dummy = new Form() { TopMost = true })
{
    MessageBox.Show(dummy, text, title);
}
Run Code Online (Sandbox Code Playgroud)

您不必实际显示虚拟表单.