2013-04-09 42 views
5

我有一些消息框,我这样的代码:C#,Windows窗体,消息框顶部不工作

MessageBox.Show(new Form(){TopMost=true, TopLevel=True}, "Message","Title", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); 

对于一个更好的例子,我这​​样做对的FormClosing事件:

private void Example_FormClosing(object sender, FormClosingEventArgs e){ 
MessageBox.Show(new Form(){TopMost=true, TopLevel=True}, "Really close?"," Program", MessageBoxButtons.OKCancel, MessageBoxIcon.Information); 
} 

但是,几乎每次我在看到我的消息箱之前都要更改我的计算机上的Window(比如返回Visual Studio),并且它不便于用户使用并且非常烦人。

我证实我的主体形式不是TopMost = true,我只是尝试了TopMost或者只是TopLevel,StartPosition = FormStartPosition.CenterScreen,但没有任何工作。

[更新]

我想:

private void Example_FormClosing(object sender, FormClosingEventArgs e){ 
    MessageBox.Show(this.Owner, "Really close?"," Program", MessageBoxButtons.OKCancel, MessageBoxIcon.Information); 
    } 

我想对我的窗前我的消息框,并没有改变窗口看到它,因为它是就像当前窗口后面一样。

你有想法解决这个问题吗?

+0

请更清楚,不知道你在问什么。 – Harish 2013-04-09 11:51:43

+0

你想实现什么?业主需要先显示 – Max 2013-04-09 11:51:59

+0

。 – JSJ 2013-04-09 11:53:58

回答

3

鉴于你Form的实例,你可以调用一个MessageBox这样的:
MessageBox.show(form, "Message", "Title");Check the doc for other parameters.

但是,如果你想从后台线程调用这个(例如:BackgroundWorker),你必须使用Form.Invoke()这样的:

form.Invoke((MethodInvoker)delegate 
{ 
    MessageBox.show(form, "Message", "Title"); 
}); 
0

您正在将MessageBox所有者设置为未显示的新表单。而不是new Form(){TopMost=true, TopLevel=True},请参阅您希望MessageBox顶部的现有表单的实例。

+0

我在所有者窗口的视图中使用了我的消息框。你的意思是这样的:MessageBox.Show(this.owner,.....)? – Alice 2013-04-09 12:07:03

+0

如果你从一个表单调用它,只需要'MessageBox.Show(this,...'是正确的。也就是说,如果你是从表单调用它,我相信所有者是隐含的,所以你可以忽略它 – MrBlue 2013-04-09 12:18:11

+0

这不是一个问题,看到消息箱后面的所有者,这是重点,但在这里,我必须改变程序(去视觉工作室或办公室......),然后当我回来时看到我的消息箱在我的应用程序 – Alice 2013-04-09 12:21:41

8

做这样的:

MessageBox.Show(
    "Message", 
    "Title", 
    MessageBoxButtons.YesNo, 
    MessageBoxIcon.Warning, 
    MessageBoxDefaultButton.Button1, 
    MessageBoxOptions.DefaultDesktopOnly); 

它将把它放在所有其他窗口,包括来自其他进程(这是我想你问的)的前面。

关键参数是MessageBoxOptions.DefaultDesktopOnly。请注意,这会将消息框放在默认桌面上,导致应用程序调用MessageBox.Show()失去焦点。

(你真的应该保留这一行为的关键信息。)

另外,如果您的应用程序有一个窗口,显示与设置为this第一个参数调用MessageBox.Show()消息框之前调用this.BringToFront() 。 (你可以从窗体窗体类中调用它)。

+0

感谢您的提示,但是,有点过于激烈 – Alice 2013-04-09 12:06:03

+0

好吧,它不会比其他方式更激进(例如,把窗口放在系统上所有其他窗口的前面)另外,你可能想把你的应用程序本身放在前台。 – 2013-04-09 12:14:00

+0

是的,但是我用很多东西使用了messagebox,不幸的是,所有这些都很重要,但是我也可以将焦点放在主窗口上......但是在某些情况下,您的解决方案非常棒,我很快就可以使用它! – Alice 2013-04-09 12:19:40

-1

只是这样做的(MessageBox.Show(Message);)它已经是最顶层了。

查看herehere的信息。

+0

我在第一次尝试..没有工作 – Alice 2013-04-09 12:05:20

0

而且拉尔斯的回答,我有同样的问题和Lars'方法的工作,但如果我再从别的地方突然出现一条消息,是不是顶部,切换到它,然后再次使用拉尔斯的方法调用该消息,它将不再处于顶端。

这是我想出了变化很适合我,希望你能有所帮助:

这是从一个单独的线程,拥有应用程序的主窗体实例的引用运行

//Show message on top of all other forms 
MainFormInstance.Invoke((MethodInvoker)delegate 
{ 
    Form popup = new Form() { TopMost = true, TopLevel = true }; 
    MessageBox.Show(popup, "Message", "Title"); 
}); 
2

我已经回答了这个here(但因为它是一个相当小的答案,我会复制它):

using (var dummy = new Form() { TopMost = true }) 
{ 
    MessageBox.Show(dummy, text, title); 
} 
0

尝试写概括逻辑如下: -

public static DialogResult ShowMessage(Form Parent, string Text, string Caption, MessageBoxButtons Buttons, MessageBoxIcon Icon, MessageBoxDefaultButton DefaultButton) 
{ 
    if (Parent != null && Parent.InvokeRequired) 
     return (DialogResult) Parent.Invoke(((Func<DialogResult>))(() => MessageBox.Show(Text, Caption, Buttons, Icon, DefaultButton))); 
    else 
     return (MessageBox.Show(Text, Caption, Buttons, Icon, DefaultButton)); 
}