我需要做什么才能使 Windows Forms 应用程序能够在系统托盘中运行?
不是可以最小化到托盘的应用程序,而是只会存在于托盘中的应用程序,无非就是
一个图标
工具提示,以及
“右键单击”菜单。
icon.Visible = false
,然后在退出应用程序时设置 Dispose()
图标。否则,程序退出后您仍会看到该图标。经过几次测试,您将不再知道哪个图标是真实的。
代码项目文章 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();
}
}
正如 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
,在模块中定义。
然后以编程方式创建组件:NotifyIcon
和 ContextMenu
。
确保包含 MenuItem
“退出”或类似内容。
将 ContextMenu
绑定到 NotifyIcon
。
调用 { 7}.
在 Quit MenuItem
的事件处理程序中,确保调用 set NotifyIcon.Visible = False
,然后调用 Application.Exit()
。将您需要的内容添加到 ContextMenu
并正确处理:)
使用向导创建一个新的 Windows 应用程序。从代码中删除 Form1。删除 Program.cs 中启动 Form1 的代码。使用 NotifyIcon 类创建您的系统托盘图标(为其分配一个图标)。向其添加上下文菜单。或者对 NotifyIcon 的鼠标点击做出反应并区分右击和左击,设置您的上下文菜单并显示按下哪个按钮(右/左)。 Application.Run() 保持应用程序运行,Application.Exit() 退出。或者一个 bool bRunning = true; while(bRunning){Application.DoEvents();线程.睡眠(10);}。然后设置 bRunning = false;退出应用程序。
“系统托盘”应用程序只是一个普通的win表单应用程序,唯一的区别是它在windows系统托盘区域创建一个图标。使用 NotifyIcon 组件创建 sys.tray 图标,您可以在工具箱(公共控件)中找到它,并修改它的属性:图标,工具提示。它还使您能够处理鼠标单击和双击消息。
还有一件事,以实现外观或标准托盘应用程序。在主窗体显示事件中添加以下行:
private void MainForm_Shown(object sender, EventArgs e)
{
WindowState = FormWindowState.Minimized;
Hide();
}
据我所知,您仍然必须使用表单编写应用程序,但在表单上没有控件并且永远不会将其设置为可见。使用 NotifyIcon(可以找到 here 的 MSDN 示例)来编写您的应用程序。
以下是我使用 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运行时隐藏图标,并根据需要进行调整。
它是通知区域应用程序非常友好的框架......将 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;
}
}
}
我将 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();
}
}
}
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);
}
}
在设计时将您的 NotifyIcon
和 ContextMenu
(如果需要)作为常规应用程序添加到表单中。确保您的 Notifyicon
是 Visible
并且关联了一个图标。这还可以让您使用以后出于任何原因可能需要的表格
只需添加
this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;
到您的表单对象。您只会在系统托盘上看到一个图标。
this.ShowInTaskbar = false
导致表单不显示在任务栏中(即使已最小化),而 this.WindowState = FormWindowState.Minimized
导致表单启动时在屏幕上不可见。所以表格不会出现在任何地方。无法集中注意力或恢复它,应用程序在后台愉快地运行。如果您将托盘图标添加到您的应用程序,那么您的应用程序将仅显示为托盘图标,没有其他任何内容。您可以将 ContextMenuStrip 添加到通知图标以允许交互(和关闭应用程序)。