2013-04-09 44 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)); 
}