2010-07-29 33 views
0

我想讓消息框在所有窗口前彈出,以便用戶看到它。我有以下代碼,但它似乎把消息框放在後面。控制檯應用程序中所有窗口前的消息框?

DialogResult dlgResult = MessageBox.Show(new Form() { TopMost = true }, "Do you want to continue?", "Continue?", 
      MessageBoxButtons.YesNo, MessageBoxIcon.Question); 
     if (dlgResult == DialogResult.Yes) 
     { 
      Console.WriteLine("YES"); 
     } 
     else if (dlgResult == DialogResult.No) 
     { 
      Console.WriteLine("NO"); 
     } 

上述代碼在一個線程中運行是我的問題,我將如何解決這個問題?

謝謝

+1

[嘆息]不要。重要的是你的特定消息框可能是,這不是更重要,那麼用戶決定什麼是此刻最重要的應用程序。此外,如果用戶正在輸入電子郵件並且彈出消息框並竊取了鍵盤焦點,則用戶有50%的機會可以做出他們後悔的事。 – 2010-07-29 16:29:20

+0

這是重點。當用戶從另一個應用程序調用它時,用戶會期望彈出消息。無論如何,謝謝你的建議。 – arbme 2010-07-29 16:33:35

+0

使用FlashWindowEx(http://msdn.microsoft.com/en-us/library/ms679347(VS.85).aspx)而不是將消息框推到頂部並竊取鍵盤焦點。 – 2010-07-29 16:37:39

回答

3

最好的選擇,在這樣的情況下,可能是使用P/Invoke來調用MessageBox直接起作用。然後您可以包含MB_TOPMOST標誌,這將強制它成爲最頂層的消息框。 (這不是管理API暴露)

這將被宣佈爲(從pinvoke.net):

[DllImport("coredll.dll", SetLastError=true)] 
public static extern int MessageBoxW(int hWnd, String text, String caption, uint type); 

然後稱爲:

MessageBoxW(0, "Topmost Window", "Hello world", 0x00000040L /*MB_ICONINFORMATION*/ | 0x00040000L /*MB_TOPMOST*/); 
3

是的,這是你的問題。你創建的表單將作爲一個門圖死掉,你的線程不會抽出一個消息循環。即使你能使它工作,你仍然有一個重大的問題。在用戶的臉上推送消息框不能可靠地工作。當用戶將彈出一個Word文檔並按下空格鍵時,彈出消息框。立即消失。用戶注意到的所有內容都略微閃爍,並且文檔中有一個神祕的空間。

你真的應該使用NotifyIcon來彈出這樣的通知。它的ShowBalloonTip方法是提供背景信息的標準方式。

您可以創建自己的Form類來顯示自定義的東西。重要的是,它不會竊取重點,以避免上述閃光消失的問題。您需要創建專用線程以避免消息循環問題。事情是這樣的:

public static void ShowNotification(string msg) { 
     var t = new Thread(() => { 
      var frm = new frmNotify(msg); 
      frm.TopMost = true; 
      var rc = Screen.PrimaryScreen.WorkingArea; 
      frm.StartPosition = FormStartPosition.Manual; 
      frm.CreateControl(); 
      frm.Location = new Point(rc.Right - frm.Width, rc.Bottom - frm.Height); 
      Application.Run(frm); 
     }); 
     t.SetApartmentState(ApartmentState.STA); 
     t.IsBackground = true; 
     t.Start(); 
    } 

哪裏frmNotify是通知的形式,這樣的事情:

public partial class frmNotify : Form { 
    public frmNotify(string msg) { 
     InitializeComponent(); 
     frm.TopMost = true; 
     label1.Text = msg; 
     this.ShowWithoutActivation = true; 
    } 
} 
相關問題