c# - 我如何制作只能在系统托盘中运行的.NET Windows窗体应用程序?



winforms system-tray (9)

我用.NET 1.1编写了一个traybar应用程序,我不需要表单。
首先,将项目的启动对象设置为在模块中定义的Sub Main
然后以编程方式创建组件: NotifyIconContextMenu
一定要包含一个MenuItem “退出”或类似的。
ContextMenu绑定到NotifyIcon
调用Application.Run()
在Quit MenuItem的事件处理程序中,一定要调用set NotifyIcon.Visible = False ,然后调用Application.Exit() 。 将所需的内容添加到ContextMenu并正确处理:)

在系统托盘中运行Windows Forms应用程序需要做什么?

不是可以最小化托盘的应用程序,而是仅存在于托盘中的应用程序,只有图标,工具提示和“右键单击”菜单。


  1. 使用向导创建一个新的Windows应用程序。
  2. 从代码中删除Form1
  3. 删除Program.cs中启动Form1的代码。
  4. 使用NotifyIcon类创建系统托盘图标(为其分配一个图标)。
  5. 向它添加一个contextmenu。
  6. 或者对NotifyIcon的鼠标点击和鼠标点击进行反应,设置你的上下文菜单并显示它的按钮(右/左)被按下。
  7. Application.Run()使应用程序与Application.Exit()一起运行退出。 或者一段while(bRunning){Application.DoEvents;Thread.Sleep(10);} 。 然后设置bRunning = false以退出该应用程序。

正如mat1t所说 - 您需要将NotifyIcon添加到您的应用程序中,然后使用类似下面的代码来设置工具提示和上下文菜单:

this.notifyIcon.Text = "This is the tooltip";
this.notifyIcon.ContextMenu = new ContextMenu();
this.notifyIcon.ContextMenu.MenuItems.Add(new MenuItem("Option 1", new EventHandler(handler_method)));

此代码仅在系统托盘中显示图标:

this.notifyIcon.Visible = true;  // Shows the notify icon in the system tray

如果您有表格(无论出于何种原因),则需要以下内容:

this.ShowInTaskbar = false;  // Removes the application from the taskbar
Hide();

右键单击以获取上下文菜单是自动处理的,但是如果您想在左键单击时执行一些操作,则需要添加Click处理程序:

    private void notifyIcon_Click(object sender, EventArgs e)
    {
        var eventArgs = e as MouseEventArgs;
        switch (eventArgs.Button)
        {
            // Left click to reactivate
            case MouseButtons.Left:
                // Do your stuff
                break;
        }
    }

这是非常友好的通知区域应用程序框架...它足以将NotificationIcon添加到基础表单并将自动生成的代码更改为以下代码:

public partial class Form1 : Form
{
    private bool hidden = false;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.ShowInTaskbar = false;
        //this.WindowState = FormWindowState.Minimized;
        this.Hide();
        hidden = true;
    }

    private void notifyIcon1_Click(object sender, EventArgs e)
    {
        if (hidden) // this.WindowState == FormWindowState.Minimized)
        {
            // this.WindowState = FormWindowState.Normal;
            this.Show();
            hidden = false;
        }
        else
        {
            // this.WindowState = FormWindowState.Minimized;
            this.Hide();
            hidden = true;
        }
    }
}

只需添加

this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;

到你的表单对象。 系统托盘上只会显示一个图标。


这是我用Visual Studio 2010 ,.NET 4做的

  1. 创建一个Windows窗体应用程序,在属性中设置“制作单个实例应用程序”
  2. 添加一个ContextMenuStrip
  3. 将一些条目添加到上下文菜单条中,双击它们以获得处理程序,例如'exit'(双击) - > handler - > me.Close()
  4. 在设计器中添加一个NotifyIcon,将contextMenuStrip设置为刚刚创建的那个,选择一个图标(可以在'common7 ...'下的VisualStudio文件夹中找到一些图标)
  5. 在设计器中设置表单的属性:FormBorderStyle:none,ShowIcon:false,ShowInTaskbar:false,Opacity:0%,WindowState:Minimized
  6. 在Form1_Load的末尾添加Me.Visible = false,这将在使用Ctrl + Tab时隐藏图标
  7. 根据需要运行和调整。

“系统托盘”应用程序只是一个常规的获胜表格应用程序,唯一不同的是它在Windows系统托盘区域创建了一个图标。 为了创建sys.tray图标使用NotifyIcon组件,您可以在Toolbox(通用控件)中找到它,并修改它的属性:图标,工具提示。 此外,它使您能够处理鼠标点击和双击消息。

还有一件事,为了达到外观和感觉或标准托盘应用程序。 在你的主要表单上添加followinf行显示事件:

private void MainForm_Shown(object sender, EventArgs e)
{
    WindowState = FormWindowState.Minimized;
    Hide();
} 

使用NotifyIcon的基本答案是正确的,但像.NET的许多事情一样,在做正确的事情时有许多微妙之处。 Brad提到的教程提供了很好的基础知识,但没有解决以下任何问题:

  • 从系统托盘中关闭应用程序是否能够正确关闭任何打开的子表单?
  • 应用程序是否强制只能运行其中一个实例(适用于大多数(但不是全部)托盘应用程序)?
  • 如果需要,如何打开WPF子窗口以及WinForms子窗口。
  • 如何支持动态上下文菜单。
  • 标准的NotifyIcon存在于WinForms空间中; 我可以做一个纯粹的WPF解决方案吗? (是的你可以!)

我刚刚在Simple-Talk.com上发表了一篇文章,详细阐述了这些要点,并提供了一个可立即使用的托盘应用程序框架,以及一个完整的实际示例应用程序,用于在实践中展示所有内容。 请参阅在.NET中创建托盘应用程序:实用指南 ,2010年11月发布。


class FootballTeam : List<FootballPlayer> 
{ 
    public string TeamName; 
    public int RunningTotal;
}

以前的代码意味着:一群来自街头踢球的球员,他们恰好有一个名字。 就像是:

无论如何,这个代码(从我的答案)

public class FootballTeam
{
    // Football team rosters are generally 53 total players.
    private readonly List<T> _roster = new List<T>(53);

    public IList<T> Roster
    {
        get { return _roster; }
    }

    public int PlayerCount
    {
    get { return _roster.Count(); }
    }

    // Any additional members you want to expose/wrap.
}

意思是:这是一个拥有管理,球员,管理员等的足球队。例如:

这是你的逻辑如何呈现在图片中......





c# .net winforms system-tray