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

     2023-02-22     65

关键词:

【中文标题】如何制作仅在系统托盘中运行的 .NET Windows 窗体应用程序?【英文标题】:How can I make a .NET Windows Forms application that only runs in the System Tray? 【发布时间】:2010-11-02 23:18:22 【问题描述】:

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

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

一个图标 工具提示和 “右键单击”菜单。

【问题讨论】:

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

代码项目文章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”必须是你用“Project -> Properties -> Resources -> Add Resource”添加的资源的名称,然后重新编译项目。 我做了 properties..resources..add resource..icon.. 重新编译,仍然得到“错误 CS0103 The name 'Resources' does not exist in the current context” @barlop 我不得不这样写:Properites.Resources.AppIcon @SimonPerepelitsa 谢谢,我不确定我在实验中做了什么,我的意思是评论什么有效,但我一定忘记了我所做的一些有效的事情。但最终我使用的方法是从你可以拖动的东西的调色板中拖动一个通知图标。然后在表单上点击它,点击一个小箭头,它会弹出一个菜单来为它选择一个图标!【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

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

【讨论】:

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

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

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

private void MainForm_Shown(object sender, EventArgs e)

    WindowState = FormWindowState.Minimized;
    Hide();
 

【讨论】:

【参考方案6】:

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

【讨论】:

不完全。您的表单可以包含控件,但默认情况下应该隐藏。 您不需要任何表格。在一个新的 Window App 创建向导之后,只需删除 Form1 并删除打开它的代码。您可以在 Program.cs 中使用 NotifyIcon 和 ContextMenu 编写所有内容。没有其他要求了。 我知道它可以包含控件,但 OP 不想要它【参考方案7】:

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

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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:
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。感谢您提供答案,但您能否添加关于您的代码如何解决问题的说明?【参考方案10】:

您可以创建表单,对其进行修改,然后将其作为参数传递给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 并且有关联的图标。这还可以让您使用以后出于任何原因可能需要的表单

【讨论】:

【参考方案11】:

简单添加

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

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

【讨论】:

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

系统托盘进度指示器仅在全景页面上不可见

】系统托盘进度指示器仅在全景页面上不可见【英文标题】:Systemtrayprogressindicatornotvisibleonlyonpanoramapage【发布时间】:2012-03-1320:33:26【问题描述】:我将JeffWilcox的解决方案用于globalprogressindicator。除了我拥有的全景页面外,所... 查看详情

如何在 VB.NET 中制作自己的组件?

】如何在VB.NET中制作自己的组件?【英文标题】:HowcanImakemyowncomponentsinVB.NET?【发布时间】:2011-03-3113:02:16【问题描述】:如何制作一个像计时器一样驻留在组件托盘中的组件?这样您就可以从工具箱中放置它们,但它们在表单... 查看详情

如何仅在一个国家和操作系统中运行 javascript 功能?

】如何仅在一个国家和操作系统中运行javascript功能?【英文标题】:HowtorunjavascriptfunctiononlyinoneCountryandOS?【发布时间】:2017-09-2705:02:34【问题描述】:我见过类似的问题,如下所示。但它们都不适合我。请帮忙。Findthethreeletterco... 查看详情

如何把程序最小化到托盘图标

参数及返回值说明:dwMessage:[输入参数]说明要执行的动作。动作的可选值如下:NIM_ADD增加一个图标到托盘区NIM_DELETE从托盘区删除一个图标NIM_MODIFY修改图标NIM_SETFOCUS将焦点(Focus)返回托盘区。这个消息通常在托盘区图标完成... 查看详情

如何将delphi程序图标放入系统托盘中?

参考技术A去下载一个Delphi下的系统托盘控件,TrayIcon,安装后,将该控件拖到窗体上,稍稍设置一下就好。随便下载一个ForDelphi版本的就好了,然后下载下来的安装文件中应该有扩展名为.dpk的文件,双击该文件,在随后画面中... 查看详情

开发一个简单的 Windows 系统托盘桌面应用程序来使用 .NET Web 服务

】开发一个简单的Windows系统托盘桌面应用程序来使用.NETWeb服务【英文标题】:DevelopingasimpleWindowssystemtraydesktopapptoconsumea.NETwebservice【发布时间】:2012-11-1814:00:32【问题描述】:我需要,但我精通PHP,并且我在桌面应用程序方面... 查看详情

FCM 仅在应用程序被终止时在托盘中发送消息,但我需要有声音的通知

】FCM仅在应用程序被终止时在托盘中发送消息,但我需要有声音的通知【英文标题】:FCMonlysendsmessageintraywhenappiskilledbutineednotificationswithsound【发布时间】:2020-12-0622:58:46【问题描述】:我正在使用从firebase_messaging包的示例部分... 查看详情

如何仅在 iOS 中制作一个 ViewController 肖像 [重复]

】如何仅在iOS中制作一个ViewController肖像[重复]【英文标题】:HowtomakeoneViewControllerportraitonlyiniOS[duplicate]【发布时间】:2016-10-2410:05:17【问题描述】:我有一个应用程序支持iPad的机器人纵向和横向以及仅iPhone的纵向。我喜欢将一... 查看详情

Shell_NotifyIcon 在系统托盘中创建空白、无响应的图标

...【发布时间】:2018-06-2920:52:32【问题描述】:我正在尝试制作一个简单的系统托盘图标应用程序。这是代码的核心。WNDCLASSEXwx=;wx.cbSize=sizeof(WNDCLASSEX);wx.lpfnWndProc=W 查看详情

如何仅在 ruby​​ 中制作大写字母?

】如何仅在ruby​​中制作大写字母?【英文标题】:HowdoImakeauppercaseletteronlyinruby?【发布时间】:2021-09-1910:01:49【问题描述】:所以这是我现在的方法。:christmas=>["Lights","Wreath"],:new_years=>["PartyHats"]我有这个来获得“圣诞节:... 查看详情

qt开发实现系统托盘,托盘菜单,托盘消息(代码片段)

...序系统托盘功能,是比较普遍的功能,本篇将详细的介绍如何实现该功能。 演示Demo实现功能:1.应用启动后,任务栏,系统托盘可以看到该程序。2.点击右上角×关闭窗口,自动隐藏窗口,托盘可以看到该程序。3.鼠标在... 查看详情

如何将我的桌面 Flutter 应用最小化到系统托盘?

】如何将我的桌面Flutter应用最小化到系统托盘?【英文标题】:HowtominimizemydesktopFlutterapptosystemtray?【发布时间】:2019-10-3008:49:33【问题描述】:我正在构建一个Flutter桌面应用程序,我希望让应用程序在系统托盘上继续运行,而... 查看详情

javafx:系统托盘

JavaFX:系统托盘JavaFX视频教程第211课,制作系统托盘GITHUB:dustinkredmond/FXTrayIconSystemTray系统托盘jdk中java.awt.SystemTraySystemTraysystemTray=SystemTray.getSystemTray();TrayIcon这里使用javaawt组件,注意I 查看详情

如何在仅在前台运行的后台命令中运行?

】如何在仅在前台运行的后台命令中运行?【英文标题】:HowcanIruninbackgroundcommand,whichrunsonlyinforeground?【发布时间】:2021-07-0423:45:46【问题描述】:我有命令,其工作方式类似于phpartisanqueue:listen。而且它不能在后台共同工作,但... 查看详情

如何在 Qt 中打开和最小化外部应用程序到系统托盘

】如何在Qt中打开和最小化外部应用程序到系统托盘【英文标题】:HowtoopenandminimizeexternalapptosystemtrayinQt【发布时间】:2019-04-0606:59:58【问题描述】:QProcess可以用来打开外部程序,但它总是会在所有其他窗口的前面打开一个应用... 查看详情

在windows10中使用trayitem时有多个托盘图标(代码片段)

...应用程序中有一个独立的基于Java的SWT。我使用SWT托盘为系统托盘菜单提供了一个自定义图标trayItem.setImage(image);现在,只要我的申请被关闭,我就会丢弃托盘物品。但是当我的系统进入休眠状态并再次返回时,应用程序正在运行... 查看详情

如何使用系统托盘/任务栏图标制作跨平台 Kivy 应用程序,即使应用程序没有聚焦/处于任务栏模式,它也会检测键盘输入

】如何使用系统托盘/任务栏图标制作跨平台Kivy应用程序,即使应用程序没有聚焦/处于任务栏模式,它也会检测键盘输入【英文标题】:HowcanImakecross-platformKivyappwithsystem-tray/taskbariconwhichwoulddetectkeyboardinputevenwhenappisnotfocused/intaskba... 查看详情

如何在 C# 中使用 TaskScheduler 设置“仅在登录时运行”和“运行方式”?

】如何在C#中使用TaskScheduler设置“仅在登录时运行”和“运行方式”?【英文标题】:Howtoset“runonlyifloggedin”and“runas”withTaskSchedulerinC#?【发布时间】:2017-09-2119:04:50【问题描述】:我正在尝试使用c#TaskSchedulerManagedWrapper在Window... 查看详情