如何创建仅在系统托盘中运行的.NET Windows窗体应用程序?

xyz*_*xyz 209 .net c# system-tray winforms

要使Windows窗体应用程序在系统托盘中运行,我需要做什么?

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

Mic*_*ens 153

使用NotifyIcon的基本答案是正确的,但是,像许多.NET一样,正确地执行它有许多细微之处.Brad提到的教程给出了很好的基础知识,但没有解决这些问题:

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

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

  • 尽管有大量的投票,但这个答案并不构成一个有用的,合法的Stack Overflow答案.它实际上是一个[仅链接答案](https://meta.stackexchange.com/questions/225370/your-answer-is-in-another-castle-when-is-an-answer-not-an-answer ),与Stack Overflow标准相反.请通过在答案中提供具体的材料信息来改进这个答案.这将确保无论外部站点的状态如何都可以获得信息,并且还将确保读者不必仅仅为了完成这个简单的任务而筛选小说. (37认同)

Faw*_*Izy 73

代码项目文章Creating a Tasktray Application提供了一个非常简单的解释和创建仅在系统托盘中存在的应用程序的示例.

基本上改变Application.Run(new Form1());行,Program.cs而不是启动一个继承自的类ApplicationContext,并让该类的构造函数初始化aNotifyIcon

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Application.Run(new MyCustomApplicationContext());
    }
}


public class MyCustomApplicationContext : ApplicationContext
{
    private NotifyIcon trayIcon;

    public MyCustomApplicationContext ()
    {
        // Initialize Tray Icon
        trayIcon = new NotifyIcon()
        {
            Icon = Resources.AppIcon,
            ContextMenu = new ContextMenu(new MenuItem[] {
                new MenuItem("Exit", Exit)
            }),
            Visible = true
        };
    }

    void Exit(object sender, EventArgs e)
    {
        // Hide tray icon, otherwise it will remain shown until user mouses over it
        trayIcon.Visible = false;

        Application.Exit();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的起点.请注意,"AppIcon"必须是使用"项目 - >属性 - >资源 - >添加资源"添加的资源的名称,然后重新编译项目. (11认同)
  • 任何想要将其用于 .NET Core 的人请注意:它仍然有效,但您必须替换已弃用的类,[像这样](/sf/answers/5019082911/)。 (3认同)

Mar*_*ese 19

.NET核心

我采用了.NET Core已接受的答案,使用建议的替代品来替换已弃用的类:

  • 上下文菜单 -> 上下文菜单条
  • 菜单项 -> ToolStripMenuItem

程序.cs

namespace TrayOnlyWinFormsDemo
{
    internal static class Program
    {
        [STAThread]
        static void Main()
        {
            ApplicationConfiguration.Initialize();
            Application.Run(new MyCustomApplicationContext());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

MyCustomApplicationContext.cs

using TrayOnlyWinFormsDemo.Properties;  // Needed for Resources.AppIcon

namespace TrayOnlyWinFormsDemo
{
    public class MyCustomApplicationContext : ApplicationContext
    {
        private NotifyIcon trayIcon;

        public MyCustomApplicationContext()
        {
            trayIcon = new NotifyIcon()
            {
                Icon = Resources.AppIcon,
                ContextMenuStrip = new ContextMenuStrip()
                {
                    Items = { new ToolStripMenuItem("Exit", null, Exit) }
                },
                Visible = true
            };
        }

        void Exit(object? sender, EventArgs e)
        {
            trayIcon.Visible = false;
            Application.Exit();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*isF 17

正如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)));
Run Code Online (Sandbox Code Playgroud)

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

this.notifyIcon.Visible = true;  // Shows the notify icon in the system tray
Run Code Online (Sandbox Code Playgroud)

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

this.ShowInTaskbar = false;  // Removes the application from the taskbar
Hide();
Run Code Online (Sandbox Code Playgroud)

右键单击以获取上下文菜单是自动处理的,但如果要在左键单击上执行某些操作,则需要添加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;
        }
    }
Run Code Online (Sandbox Code Playgroud)


M.T*_*ini 15

我用.NET 1.1编写了一个托盘栏应用程序,我不需要表格.
首先,将项目的启动对象设置为Sub Main,在模块中定义.
然后以编程方式创建组件:NotifyIconContextMenu.
一定要包括MenuItem"退出"或类似.
绑定ContextMenuNotifyIcon.
调用Application.Run().
在Quit的事件处理程序MenuItem中确保调用set NotifyIcon.Visible = False,然后Application.Exit().添加你需要的ContextMenu和正确处理:)


Wol*_*lf5 10

  1. 使用向导创建新的Windows应用程序.
  2. Form1从代码中删除.
  3. 删除Program.cs中启动的代码Form1.
  4. 使用NotifyIcon该类创建系统托盘图标(为其指定一个图标).
  5. 添加上下文菜单.
  6. 或者对NotifyIcon鼠标点击做出反应,并在右键和左键单击之间进行区分,设置上下文菜单并显示按下了哪个按钮(右/左).
  7. Application.Run()保持应用程序运行Application.Exit()以退出.或者a bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}.然后设置bRunning = false;退出应用程序.


Gor*_*man 8

"系统托盘"应用程序只是一个常规的win表单应用程序,唯一的区别是它在Windows系统托盘区域中创建了一个图标.为了使用NotifyIcon组件创建sys.tray图标,您可以在Toolbox(公共控件)中找到它,并修改它的属性:Icon,tool tip.它还使您能够处理鼠标单击和双击消息.

还有一件事,为了实现外观和感觉或标准托盘应用程序.在主窗体show事件中添加followinf行:

private void MainForm_Shown(object sender, EventArgs e)
{
    WindowState = FormWindowState.Minimized;
    Hide();
} 
Run Code Online (Sandbox Code Playgroud)


Mat*_*les 6

据我所知,您仍然必须使用表单编写应用程序,但在表单上没有控件,也从不将其设置为可见.使用NotifyIcon(可在此处找到MSDN示例)编写应用程序.

  • 你不需要任何表格.在新的Window App创建向导之后,只需删除Form1并删除打开它的代码.您可以使用NotifyIcon和ContextMenu从Program.cs中编写所有内容.没有更多要求. (5认同)