1

我有一个带有上下文菜单的外壳托盘图标。我遇到的问题是从上下文菜单 Clicked 处理程序调用 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 并不像在典型的 Windows 应用程序中那样专门绑定到表单。但我看不出有什么办法。

有任何想法吗?提前感谢您的帮助!

4

2 回答 2

0

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

  1. 使您的图标的所有者窗口可见。
  2. 给它重点。

完成此操作后,thisMessageBox.Show 中的 将成为合法的“模态父级”。

哎呀,消息框将显示在生成它的任何程序之上更有意义,对吧?这样,用户就可以了解消息框的内容!

于 2009-04-19T07:41:56.793 回答
0

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

于 2009-04-19T08:49:10.843 回答