当用户右键单击系统托盘中的通知图标时,我试图让我的应用程序显示弹出上下文菜单.但这有个转折。
我知道,用于获取系统托盘中的图标的NotifyIcon类具有ContextMenu属性。我不想用它来获得一个右键弹出菜单,因为它总是显示一个右键弹出菜单,并且永远不会做任何其他事情。当我的主窗体显示模态对话框时,我希望右击激活主窗体,而不是显示弹出菜单。
那么,我猜我需要使用NotifyIcon.MouseClick事件,并在该事件中手动弹出菜单?到目前为止,我要说的是:
private NotifyIcon trayIcon;
private ContextMenu iconMenu;
private void frmMain_Load(object sender, EventArgs e) {
// [...]
this.trayIcon.MouseClick += new MouseEventHandler(trayIcon_MouseClick);
iconMenu = new ContextMenu();
// [...]
}
private void trayIcon_MouseClick(object sender, MouseEventArgs ea) {
this.iconMenu.Show(Program.instanceFrmMain, new Point(System.Windows.Forms.Cursor.Position.X - Program.instanceFrmMain.Left, System.Windows.Forms.Cursor.Position.Y - Program.instanceFrmMain.Top));
}注意,在iconMenu.Show中,由于它需要与父控件(我在这里的主要形式)之间的弹出协调,所以我不得不从弹出的协调器中减去父控件的协调,这是我已经不想做的。
除此之外,以下是我遇到的问题:
有什么办法能让这件事更好吗?我知道,很多其他应用程序可以手动处理弹出菜单的显示,而不是使用一些NotifyIcon.ContextMenu属性。
发布于 2009-10-10 18:29:42
好吧,我没有得到我想要的功能,就像我在最初的问题中描述的那样,但是我设法找到了一种方法,用另一种方法来达到预期的效果。
我确实将一个ContextMenu附加到trayIcon.ContextMenu属性,但我将事件处理程序代码附加到上下文菜单本身的Popup属性。如果在该处理程序中,我.Clear ContextMenu实际上根本没有出现,允许我的代码选择有效地阻止Tray图标的弹出菜单显示它是否愿意。这就是我想要达到的效果。如果我在ContextMenu事件处理程序代码中填充Popup,就会像往常一样弹出包含我填充它的内容的菜单。
所以,我设法用不同的方法解决了这个问题。:-)
发布于 2009-10-04 12:24:43
使用ContextMenuStrip属性而不是ContextMenu。ContextMenuStrip类有一个Opening事件,您可以通过设置e.Cancel = true取消该事件。这样,您就不必担心菜单的位置,因为菜单是自动处理的。
https://stackoverflow.com/questions/1516238
复制相似问题