当用户右键单击系统托盘中的通知图标时,我正在尝试让我的应用程序显示弹出上下文菜单...但是有一个扭曲。
我知道我用来获取系统托盘中的图标的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属性。
答案 0 :(得分:3)
使用ContextMenuStrip
属性而不是ContextMenu
。 ContextMenuStrip
课程有Opening
个活动,您可以通过设置e.Cancel = true
取消该活动。这样您就不必担心菜单的位置,因为它会自动处理
答案 1 :(得分:-1)
好吧,我没有像原来的问题所描述的那样设法获得我想要的功能,但我已经设法找到了一种方法来使用不同的方法来达到预期的效果。
我将ContextMenu附加到trayIcon.ContextMenu
属性,但我将事件处理程序代码附加到上下文菜单本身的Popup
属性。如果在那个处理程序中,我.Clear
ContextMenu,它实际上根本没有出现,允许我的代码选择有效地阻止trayicon的弹出菜单显示是否需要。这是我想要实现的效果。如果我在Popup
事件处理程序代码中填充ContextMenu,则会像往常一样弹出包含我填充的内容的菜单。
Sooo,我设法以不同的方式解决问题。 : - )