我有一个带有附加上下文菜单的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应用程序中一样。但我认为没有办法做到这一点。
有什么想法吗?在此先感谢您的帮助!
答案 0 :(得分:0)
在您尝试显示模式消息框之前,我建议您做两件事:
完成后,MessageBox.Show中的this
将成为合法的“模态父级”。
哎呀,甚至更有意义的是,消息框将显示在生成它的任何程序之上,对吧?这样,用户就消息框的内容有了一些上下文!
答案 1 :(得分:0)
您需要跟踪系统托盘菜单的激活,并在对话框打开时将其禁用。