【问题标题】:How to get system tray functionality WITHOUT using NotifyIcon.ContextMenu?如何在不使用 NotifyIcon.ContextMenu 的情况下获得系统托盘功能?
【发布时间】:2009-10-04 12:03:16
【问题描述】:

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

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

【问题讨论】:

    标签: c# winforms menu popup contextmenu


    【解决方案1】:

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

    【讨论】:

    • 我故意避免使用它,因为它呈现的弹出菜单看起来与所有其他系统托盘程序使用的弹出菜单的默认样式不同。
    • 好吧,在 Windows 7(也可能是 Vista)上,默认的 ContextMenuStrip 渲染看起来与其他上下文菜单非常相似......无论如何,您可以将菜单的 RenderMode 设置为 System,它应该使它看起来更像其他菜单。
    • 不,它看起来仍然不同。显然有一些方法可以使用普通的 ContextMenu 来做到这一点,就像我系统托盘中的所有其他应用程序一样。
    【解决方案2】:

    好的,我没有设法获得我在原始问题中描述的想要的功能,但我设法找到了一种使用不同方法达到预期效果的方法。

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

    太好了,我设法以不同的方式解决了这个问题。 :-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 2017-10-08
      相关资源
      最近更新 更多