【问题标题】:How to achieve modal dialogs from NotifyIcon context menu?如何从 NotifyIcon 上下文菜单中实现模式对话框?
【发布时间】:2009-04-19 06:05:04
【问题描述】:

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

有什么想法吗?提前感谢您的帮助!

【问题讨论】:

    标签: contextmenu modal-dialog notifyicon showdialog


    【解决方案1】:

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

    1. 使图标的所有者窗口可见。
    2. 重点突出。

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

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

    【讨论】:

    • 您可能出于各种原因需要一个由隐藏窗口支持的系统托盘图标 - 我敢打赌,您的系统托盘中不止一个。问题是,这通常由 Windows 为您处理,因为您将窗口(窗体)与 Shell_NotifyIcon API 调用中的外壳图标​​相关联。然后强制执行模态。在 .NET 中,我看不到任何将表单与 NotifyIcon 关联的方法。
    • 模式对话框,只是一个对话框,可以防止焦点从它移动到应用程序中的另一个窗口。如果您的窗口是隐藏的,那没有任何意义。您是否正在尝试制作“系统范围的模式”对话框?阻止用户在处理对话框之前做任何事情的东西?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多