繁体   English   中英

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

[英]How can I make a .NET Windows Forms application that only runs in the System Tray?

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

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

  • 一个图标
  • 工具提示,以及
  • 一个“右键单击”菜单。

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

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

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

代码项目文章创建任务托盘应用程序给出了创建只存在于系统托盘中的应用程序的非常简单的解释和示例。

基本上改变Application.Run(new Form1()); Program.cs行改为启动一个继承自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();
    }
}

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

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

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

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

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

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

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

这是我如何使用Visual Studio 2010 、 .NET 4

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

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

您可以创建表单,对其进行修改,然后将其作为参数传递给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 (如果需要)作为常规应用添加到您的表单中。 确保您的Notifyicon Visible并且有一个关联的图标。 这还可以让您使用稍后出于任何原因可能需要的表单

只需添加

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM