代码之家  ›  专栏  ›  技术社区  ›  Jez

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

  •  0
  • Jez  · 技术社区  · 15 年前

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

    我知道我用来在系统托盘中获取图标的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.s how中是如何显示的,因为它需要相对于父控件(这里是我的主窗体)的弹出坐标,所以我很恼人地不得不从弹出坐标中减去父控件的坐标,这是我已经不想做的。

    除此之外,我还有以下问题:

    • 虽然右键单击时菜单会弹出,但如果我单击菜单外屏幕上的其他位置,它不会关闭,而且应该关闭。
    • 菜单不会在正确的位置弹出;对于其他系统托盘应用程序,它会弹出,因此其右下角或左下角位于鼠标光标的顶端。对于我的,弹出菜单位于屏幕的底部,鼠标光标的一侧。

    我有什么办法让这个更好的工作吗?我知道这是可能的,许多其他应用程序手动处理弹出菜单的显示,而不是使用一些notifyicon.contextmenu属性。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Thomas Levesque    15 年前

    使用 ContextMenuStrip 财产而不是 ContextMenu . 这个 右键菜单 类有一个 Opening 事件,可以通过设置取消 e.Cancel = true . 这样你就不用担心菜单的位置了,因为它是自动处理的

        2
  •  -1
  •   Jez    15 年前

    好吧,我没有像我在最初的问题中描述的那样获得我想要的功能,但是我设法找到了一种方法,使用不同的方法来达到期望的效果。

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

    Sooo,我设法用不同的方法解决了这个问题。-)