如何从NotifyIcon上下文菜单中获得模态对话框?

时间:2009-04-19 06:05:05

标签: contextmenu modal-dialog notifyicon showdialog

我有一个带有附加上下文菜单的shell托盘图标。我遇到的问题是从上下文菜单Clicked handler调用ShowDialog()不会产生模态对话框。

使用默认的C#项目很容易重现这一点。只需将以下代码添加到Form1.cs文件中:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    ToolStripMenuItem contextMenuShowMsg = new System.Windows.Forms.ToolStripMenuItem();
    contextMenuShowMsg.Name = "contextMenuShowMsg";
    contextMenuShowMsg.Text = "Show MessageBox...";
    contextMenuShowMsg.Click += new System.EventHandler(this.contextMenuShowMsg_Click);

    ContextMenuStrip contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
    contextMenuStrip.Items.Add(contextMenuShowMsg);

    NotifyIcon notifyIcon = new NotifyIcon();
    notifyIcon.Text = "DlgTest";
    notifyIcon.Icon = SystemIcons.Application;
    notifyIcon.Visible = true;
    notifyIcon.ContextMenuStrip = contextMenuStrip;
}

private void contextMenuShowMsg_Click(object sender, EventArgs e)
{
    MessageBox.Show(this, "Test MessageBox");
}

如果您构建并运行它,只需选择上下文菜单项两次,就可以在屏幕上显示两个消息框。这不应该是模态的吗?通过调用另一个表单的ShowDialog()来替换它会导致相同的非模态行为。

我最好的猜测是,NotifyIcon并没有特别依赖于Form,就像在典型的Windows应用程序中一样。但我认为没有办法做到这一点。

有什么想法吗?在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

在您尝试显示模式消息框之前,我建议您做两件事:

  1. 让您的图标所有者窗口可见。
  2. 重点关注。
  3. 完成后,MessageBox.Show中的this将成为合法的“模态父级”。

    哎呀,甚至更有意义的是,消息框将显示在生成它的任何程序之上,对吧?这样,用户就消息框的内容有了一些上下文!

答案 1 :(得分:0)

您需要跟踪系统托盘菜单的激活,并在对话框打开时将其禁用。