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

时间:2009-06-15 09:26:51

标签: c# .net winforms system-tray

如何在系统托盘中运行Windows Forms应用程序?

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

11 个答案:

答案 0 :(得分:149)

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

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

我刚刚在Simple-Talk.com上发表了一篇文章,详细介绍了这些要点,提供了一个托盘应用程序框架,您可以立即使用它,还有一个完整的,真实的示例应用程序来显示所有内容在实践中。见Creating Tray Applications in .NET: A Practical Guide,发布于2010年11月。

答案 1 :(得分:68)

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

基本上更改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();
    }
}

答案 2 :(得分: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)));

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

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 :(得分:15)

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

答案 4 :(得分:10)

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

答案 5 :(得分:8)

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

还有一件事,为了获得外观和感觉或标准托盘应用程序。在主表单show event上添加followinf行:

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

答案 6 :(得分:6)

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

答案 7 :(得分:2)

以下是我使用Visual Studio 2010,.NET 4

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

答案 8 :(得分:1)

这是Notification Area Application非常友好的框架......将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 :(得分:0)

只需添加

MiddleConsumer

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

答案 10 :(得分:0)

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