2010-07-29 28 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; 
    } 
} 
相关问题