【问题标题】:Simple Tray Application in c#c#中的简单托盘应用程序
【发布时间】:2018-05-13 22:54:13
【问题描述】:

我在 c# 中有一个简单的托盘应用程序。我想要做的是在左键单击时打开上下文菜单。目前它只在右键单击时打开。这似乎是标准行为。

我设法在左键单击时做出反应,但我不知道如何以编程方式打开 contextMenu。有什么想法吗?

  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Threading.Tasks;
  using System.Windows.Forms;
  using System.Threading;
  using System.Drawing;


  namespace trackingCore
  {
  static class Program
  {
      /// <summary>
      /// Der Haupteinstiegspunkt für die Anwendung.
      /// </summary>
      [STAThread]
      static void Main()
      {
          Application.EnableVisualStyles();
          Application.SetCompatibleTextRenderingDefault(false);
          NotifyIcon notifyIcon1 = new NotifyIcon();
          ContextMenu contextMenu1 = new ContextMenu();
          MenuItem menuItem0 = new MenuItem();
          MenuItem menuItem1 = new MenuItem();
          MenuItem menuItem2 = new MenuItem();
          contextMenu1.MenuItems.AddRange(new MenuItem[] { menuItem0 });
          contextMenu1.MenuItems.AddRange(new MenuItem[] { menuItem1 });
          contextMenu1.MenuItems.AddRange(new MenuItem[] { menuItem2 });
          menuItem0.Index = 0;
          menuItem0.Text = "open test";
          menuItem0.Click += new EventHandler(menuItem1_Click);
          menuItem1.Index = 1;
          menuItem1.Text = "stop test";
          menuItem1.Click += new EventHandler(menuItem1_Click);
          menuItem2.Index = 2;
          menuItem2.Text = "close test";
          menuItem2.Click += new EventHandler(menuItem1_Click);
          notifyIcon1.Icon = new Icon("test.ico");
          notifyIcon1.Text = "testitest";
          notifyIcon1.ContextMenu = contextMenu1;
          notifyIcon1.Click += new EventHandler(menuItem1_Click);
          notifyIcon1.Visible = true;
          Application.Run();
          notifyIcon1.Visible = false;
      }
      private static void menuItem1_Click(object Sender, EventArgs e)
      {
          Application.Exit();
      }

      private static void iconClick(object Sender, EventArgs e)
      {
          Console.Write("open context menu with left click");
      }
  }
}

有些解决方案表示 contextMenu1.Show 将是解决方案。但是显示功能需要两个参数,我不知道哪些是正确的。它曾经只有一个参数。有任何想法吗?

【问题讨论】:

  • 不是重复的。您所指的帖子是 2010 年的。解决方案在 2017 年不起作用
  • 你是说在ContextMenuStrip 上调用Show 没有显示出来?
  • 显示需要不同的参数。我说不清是哪几个。以前需要一个参数,现在需要两个。
  • 你说你不知道它需要哪两个参数。它在文档中。

标签: c# .net visual-studio visual-studio-2017


【解决方案1】:

至少一些旧答案应该有效。刚刚在 Windows 10 上测试了我的旧应用。针对答案稍微调整了代码。

public class ProcessIcon : IDisposable
{
    public NotifyIcon Icon { get; set; }

    public ProcessIcon()
    {
        Icon = new NotifyIcon();
    }

    public void Display()
    {
        Icon.MouseClick += OnIconMouseClick;
        Icon.Text = "Some text";
        Icon.Icon = new Icon(SystemIcons.Application, 40, 40);
        Icon.Visible = true;

        // Here you insert all your items like you did with ContextMenu
        // I am not even sure what's the diffrence
        var contenxtMenu = new ContextMenuStrip();
        Icon.ContextMenuStrip = contenxtMenu;
    }

    public void Dispose()
    {
        Icon.Dispose();
    }

    private void OnIconMouseClick(object sender, MouseEventArgs e)
    {
        // Works for me
        Icon.ContextMenuStrip.Show(Cursor.Position.X, Cursor.Position.Y);
    }
}

【讨论】:

  • 感谢您的回答。它正在工作,但我想使用 ContextMenu,而不是 ContextMenuStrip。 Icon.ContextMenuStrip.Show(Cursor.Position); 也可以在没有 X 和 Y 的情况下工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
相关资源
最近更新 更多