如何在不使用NotifyIcon.ContextMenu的情况下获得系统托盘功能?

时间:2009-10-04 12:03:16

标签: c# winforms menu popup contextmenu

当用户右键单击系统托盘中的通知图标时,我正在尝试让我的应用程序显示弹出上下文菜单...但是有一个扭曲。

我知道我用来获取系统托盘中的图标的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属性。

2 个答案:

答案 0 :(得分:3)

使用ContextMenuStrip属性而不是ContextMenuContextMenuStrip课程有Opening个活动,您可以通过设置e.Cancel = true取消该活动。这样您就不必担心菜单的位置,因为它会自动处理

答案 1 :(得分:-1)

好吧,我没有像原来的问题所描述的那样设法获得我想要的功能,但我已经设法找到了一种方法来使用不同的方法来达到预期的效果。

我将ContextMenu附加到trayIcon.ContextMenu属性,但我将事件处理程序代码附加到上下文菜单本身的Popup属性。如果在那个处理程序中,我.Clear ContextMenu,它实际上根本没有出现,允许我的代码选择有效地阻止trayicon的弹出菜单显示是否需要。这是我想要实现的效果。如果我在Popup事件处理程序代码中填充ContextMenu,则会像往常一样弹出包含我填充的内容的菜单。

Sooo,我设法以不同的方式解决问题。 : - )