ChatGPT解决这个技术问题 Extra ChatGPT

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

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

不是可以最小化到托盘的应用程序,而是只会存在于托盘中的应用程序,无非就是

一个图标

工具提示,以及

“右键单击”菜单。

大多数答案都缺少一些东西 - 不要忘记设置 icon.Visible = false,然后在退出应用程序时设置 Dispose() 图标。否则,程序退出后您仍会看到该图标。经过几次测试,您将不再知道哪个图标是真实的。
如果您追求更现代的 WPF 方法 - 您可以试试这个:codeproject.com/Articles/36788/…
只是为了记录,这里有一个关于托盘应用程序的非常综合文章的链接(来自已删除的答案):simple-talk.com/dotnet/.net-framework/…

S
Sap

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

基本上将 Program.cs 中的 Application.Run(new Form1()); 行改为启动从 ApplicationContext 继承的类,并让该类的构造函数初始化 NotifyIcon

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();
    }
}

这是一个很好的起点。请注意,“AppIcon”必须是您使用“项目->属性->资源->添加资源”添加的资源的名称,然后重新编译该项目。
我做了属性..资源..添加资源..图标..重新编译,仍然得到“错误CS0103当前上下文中不存在名称'资源'”
@barlop 我不得不这样写:Properites.Resources.AppIcon
@SimonPerepelitsa 谢谢,我不确定我在实验中做了什么,我的意思是评论什么有效,但我一定忘记了我所做的一些有效的事情。但最终我使用的方法是从你可以拖动的东西的调色板中拖动一个通知图标。然后在表格上点击它,点击一个小箭头,它会弹出一个菜单来为它选择一个图标!
任何想要将此用于 .NET Core 的人请注意:它仍然有效,但您必须替换已弃用的类 like this
C
ChrisF

正如 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;
        }
    }

b
bluish

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


n
natiiix

使用向导创建一个新的 Windows 应用程序。从代码中删除 Form1。删除 Program.cs 中启动 Form1 的代码。使用 NotifyIcon 类创建您的系统托盘图标(为其分配一个图标)。向其添加上下文菜单。或者对 NotifyIcon 的鼠标点击做出反应并区分右击和左击,设置您的上下文菜单并显示按下哪个按钮(右/左)。 Application.Run() 保持应用程序运行,Application.Exit() 退出。或者一个 bool bRunning = true; while(bRunning){Application.DoEvents();线程.睡眠(10);}。然后设置 bRunning = false;退出应用程序。


当您到达 Main 的末尾并且没有 UI 线程时,程序停止执行。你如何照顾这是你的解决方案?如果您解决了这些问题,那么您将获得我的投票:)
你得到我的投票。也许只是提到您仍然需要在没有任何参数的情况下调用 Application.Run ?
更新为 App.Run 的替代品。
我知道 thread.sleep 是矫枉过正,但如果你有一个更好的“睡眠”循环替代 Application.Run 做发布它:)
Thread.Sleep 是个坏主意:你最终会使用更多的 CPU 和电池,而不是像你想要的那样执行 Application.Run。
G
Gordon Freeman

“系统托盘”应用程序只是一个普通的win表单应用程序,唯一的区别是它在windows系统托盘区域创建一个图标。使用 NotifyIcon 组件创建 sys.tray 图标,您可以在工具箱(公共控件)中找到它,并修改它的属性:图标,工具提示。它还使您能够处理鼠标单击和双击消息。

还有一件事,以实现外观或标准托盘应用程序。在主窗体显示事件中添加以下行:

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

M
Matthew Steeples

据我所知,您仍然必须使用表单编写应用程序,但在表单上没有控件并且永远不会将其设置为可见。使用 NotifyIcon(可以找到 here 的 MSDN 示例)来编写您的应用程序。


不完全的。您的表单可以包含控件,但默认情况下它应该是隐藏的。
您不需要任何表格。在一个新的 Window App 创建向导之后,只需删除 Form1 并删除打开它的代码。您可以在 Program.cs 中使用 NotifyIcon 和 ContextMenu 编写所有内容。没有更多的要求。
我知道它可以包含控件,但 OP 不希望它包含
P
Peter Mortensen

以下是我使用 Visual Studio 2010、.NET 4 的方法

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


S
Sebastian Xawery Wiśniowiecki

它是通知区域应用程序非常友好的框架......将 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;
        }
    }
}

M
MarredCheese

我将 the accepted answer 改编为 .NET Core,将 recommended replacements 用于已弃用的类:

上下文菜单 -> 上下文菜单条

菜单项 -> 工具条菜单项

程序.cs

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

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();
        }
    }
}

M
MeerArtefakt
notifyIcon1->ContextMenu = gcnew

System::Windows::Forms::ContextMenu();
System::Windows::Forms::MenuItem^ nIItem = gcnew
System::Windows::Forms::MenuItem("Open");

nIItem->Click += gcnew System::EventHandler(this, &your_class::Open_NotifyIcon);

notifyIcon1->ContextMenu->MenuItems->Add(nIItem);

您好,欢迎来到 Stack Overflow!请拿走tour。感谢您提供答案,但您还可以添加关于您的代码如何解决问题的解释吗?
R
Ronny Alfonso

您可以创建表单,对其进行修改,然后将其作为参数传递给 Application.Run。 :

    internal static class Program
    {
        /// <summary>
        ///  The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            ApplicationConfiguration.Initialize();
            var form = new Form1();
            form.Hide();
            form.Opacity = 0;
            form.ShowInTaskbar = false;
            Application.Run(form);
        }
    }

在设计时将您的 NotifyIconContextMenu(如果需要)作为常规应用程序添加到表单中。确保您的 NotifyiconVisible 并且关联了一个图标。这还可以让您使用以后出于任何原因可能需要的表格


Y
YTerle

只需添加

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

到您的表单对象。您只会在系统托盘上看到一个图标。


这会将表单放在任务栏上方。不是一回事。您是否正在尝试回复另一个帖子?
任务栏上没有图标,我们看不到表格。视觉程序仅存在于系统托盘中。上面是什么意思?
您的答案不包含任何上下文。你在使用 NotifyIcon 类吗?如果没有,您的表单将最小化到任务栏上方的左下角。
如果您不忙,请尝试编写并运行它。
this.ShowInTaskbar = false 导致表单不显示在任务栏中(即使已最小化),而 this.WindowState = FormWindowState.Minimized 导致表单启动时在屏幕上不可见。所以表格不会出现在任何地方。无法集中注意力或恢复它,应用程序在后台愉快地运行。如果您将托盘图标添加到您的应用程序,那么您的应用程序将仅显示为托盘图标,没有其他任何内容。您可以将 ContextMenuStrip 添加到通知图标以允许交互(和关闭应用程序)。