Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何制作仅在系统托盘中运行的.NET Windows窗体应用程序?_C#_.net_Winforms_System Tray - Fatal编程技术网

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

C# 如何制作仅在系统托盘中运行的.NET Windows窗体应用程序?,c#,.net,winforms,system-tray,C#,.net,Winforms,System Tray,我需要做什么才能使应用程序能够在系统托盘中运行 不是一个可以最小化到托盘中的应用程序,而是一个只存在于托盘中的应用程序,除了 偶像 工具提示,以及 “右键单击”菜单 据我所知,您仍然必须使用表单编写应用程序,但在表单上没有控件,并且从不将其设置为可见。使用NotifyIcon(可以找到其MSDN示例)编写应用程序。“系统托盘”应用程序只是一个常规的win forms应用程序,唯一的区别是它在windows系统托盘区域创建了一个图标。为了使用NotifyIcon组件创建sys.tray图标,您可

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

不是一个可以最小化到托盘中的应用程序,而是一个只存在于托盘中的应用程序,除了

  • 偶像
  • 工具提示,以及
  • “右键单击”菜单

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

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

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

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

正如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
如果您有表格(无论出于何种原因),则需要以下内容:

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

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

我用.NET 1.1编写了一个traybar应用程序,不需要表单。
首先,将项目的启动对象设置为在模块中定义的子
Main

然后以编程方式创建组件:
NotifyIcon
ContextMenu

确保包含一个
菜单项
“退出”或类似内容。
上下文菜单
绑定到
通知图标

调用
Application.Run()

在Quit
菜单项的事件处理程序中,确保调用set
NotifyIcon.Visible=False
,然后调用
Application.Exit()
。 将所需内容添加到
上下文菜单中
,并正确处理:)

  • 使用向导创建新的Windows应用程序
  • 从代码中删除
    Form1
  • 删除Program.cs中的代码,启动
    Form1
  • 使用
    NotifyIcon
    类创建系统托盘图标(为其指定一个图标)
  • 添加一个上下文菜单到它
  • 或者对
    NotifyIcon
    的鼠标单击并区分右键和左键做出反应,设置上下文菜单并显示按下哪个按钮(右/左)
  • Application.Run()
    保持应用程序运行,并退出
    Application.Exit()
    退出。或者a
    bool bRunning=true;while(bRunning){Application.DoEvents();Thread.Sleep(10);}
    。然后设置
    bRunning=false
    退出应用程序
  • 下面是我如何使用.NET4实现的

  • 创建Windows窗体应用程序,在属性中设置“生成单实例应用程序”
  • 添加一个ContextMenuStrip
  • 向上下文菜单条中添加一些条目,双击它们以获取处理程序,例如,“exit”(双击)->handler->me.Close()
  • 添加一个NotifyIcon,在designer set contextMenuStrip中选择一个图标(您可以在VisualStudio文件夹的“common7…”下找到一些图标)
  • 在设计器中设置窗体的属性:FormBorderStyle:无、ShowIcon:假、ShowInTaskbar:假、不透明度:0%、WindowsState:最小化
  • 在Form1_Load的末尾添加Me.Visible=false,这将在 使用Ctrl+Tab
  • 根据需要运行和调整
  • 代码项目文章给出了一个非常简单的解释和示例,说明如何创建一个只存在于系统托盘中的应用程序

    基本上更改
    应用程序.Run(newform1())Program.cs
    中的code>行启动一个继承自
    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();
        }
    }
    
    静态类程序
    {
    /// 
    ///应用程序的主要入口点。
    /// 
    [状态线程]
    静态void Main()
    {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    运行(新的MyCustomApplicationContext());
    }
    }
    公共类MyCustomApplicationContext:ApplicationContext
    {
    私人运输公司;
    公共MyCustomApplicationContext()
    {
    //初始化托盘图标
    trayIcon=新的NotifyIcon()
    {
    Icon=Resources.AppIcon,
    ContextMenu=新建ContextMenu(新建菜单项[]{
    新菜单项(“退出”,退出)
    }),
    可见=真
    };
    }
    无效退出(对象发送方,事件参数e)
    {
    //隐藏托盘图标,否则它将一直显示,直到用户将鼠标移到其上
    trayIcon.Visible=false;
    Application.Exit();
    }
    }
    
    这是一个非常友好的通知区域应用程序框架。。。将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;
    
    到您的窗体对象。
    您将在系统托盘上只看到一个图标。

    不太清楚。您的表单可以包含控件,但默认情况下应隐藏。您不需要任何表单。创建新窗口应用程序向导后,只需删除Form1并删除打开它的代码。您可以在Program.cs上使用NotifyIcon和ContextMenu编写所有内容。不需要更多了。我知道它可以包含控件,但OP不希望它出现。当你到达Main的末尾并且没有UI线程时,程序停止执行。您如何处理这是您的解决方案?如果你已经解决了这些问题,那么你就得到我的选票:)你得到我的选票。大概
    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);
    
    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);