如何制作仅在系统托盘中运行的 .NET Windows 窗体应用程序?
-
13-09-2019 - |
题
我需要做什么才能制作 Windows 窗体 应用程序在系统托盘中运行?
不是一个可以最小化到托盘的应用程序,而是一个只存在于托盘中的应用程序,只有图标、工具提示和“右键单击”菜单。
解决方案
使用 NotifyIcon 的基本答案是正确的,但与 .NET 的许多事情一样,执行此操作时涉及许多微妙之处 正确的. 。Brad 提到的教程很好地介绍了基础知识,但没有解决以下任何问题:
- 从系统托盘关闭应用程序是否可以正确关闭所有打开的子窗体?
- 应用程序是否强制只能运行其自身的一个实例(适用于大多数(但不是全部)托盘应用程序)?
- 如果需要,如何打开 WPF 子窗口以及 WinForms 子窗口。
- 如何支持动态上下文菜单。
- 标准NotifyIcon存在于WinForms空间中;我可以做一个纯WPF解决方案吗?(是的你可以!)
我刚刚在 Simple-Talk.com 上发表了一篇文章,详细阐述了这些要点,提供了一个可以立即使用的托盘应用程序框架,以及一个完整的、真实的示例应用程序来展示实践中的所有内容。看 在 .NET 中创建托盘应用程序:实用指南, ,2010 年 11 月出版。
其他提示
代码项目文章创建任务托盘应用程序给出了一个非常简单的解释和例子的创建系统托盘只有永远存在的应用程序。
基本上改变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 traybar应用程序,我并不需要一个形式。结果
首先,设置项目作为子Main
,一个模块中定义的启动对象。结果
然后以编程方式创建组件:在NotifyIcon
和ContextMenu
结果
一定要包括MenuItem
“退出”或类似的。结果
绑定ContextMenu
到NotifyIcon
。结果
调用Application.Run()
。结果
在为退出MenuItem
事件处理程序,确保调用设置NotifyIcon.Visible = False
,然后Application.Exit()
。
添加你需要的ContextMenu
什么,妥善处理:)
- 使用向导创建一个新的 Windows 应用程序。
- 删除
Form1
从代码中。 - 删除 Program.cs 中启动的代码
Form1
. - 使用
NotifyIcon
类来创建系统托盘图标(为其分配一个图标)。 - 添加一个上下文菜单。
- 或者做出反应
NotifyIcon
的鼠标单击并区分右键单击和左键单击,设置上下文菜单并显示按下的按钮(右/左)。 Application.Run()
保持应用程序运行Application.Exit()
退出。或者一个bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}
. 。然后设置bRunning = false;
退出应用程序。
“系统托盘”应用只是一个普通的胜利窗体应用程序,唯一的区别是,它会在Windows系统托盘区图标。为了创建sys.tray图标使用NotifyIcon组件,你可以找到它在工具箱(通用控件),并修改它的属性:图标,工具提示。此外,它使您可以处理鼠标单击和双击消息。
还有一两件事,以达到外观和感觉或标准托盘的应用程序。在您的主要形式显示事件添加followinf行:
private void MainForm_Shown(object sender, EventArgs e)
{
WindowState = FormWindowState.Minimized;
Hide();
}
据我所知,你必须写还是使用形式的应用程序,但有窗体上没有控件,绝不设置可见。使用NotifyIcon的(MSDN的样品,其中可以在这里找到 )至编写应用程序。
这是我的做法 Visual Studio 2010, .NET 4
- 创建 Windows 窗体应用程序,在属性中设置“创建单实例应用程序”
- 添加 ContextMenuStrip
- 在上下文菜单条中添加一些条目,双击它们以获取处理程序,例如,“退出”(双击)->处理程序->me.Close()
- 添加一个 NotifyIcon,在设计器中将 contextMenuStrip 设置为您刚刚创建的图标,选择一个图标(您可以在 VisualStudio 文件夹中的“common7...”下找到一些图标)
- 在设计器中设置表单的属性:FormBorderStyle:无,ShowIcon:假,ShowInTaskbar:假,不透明度:0%,WindowState:最小化
- 添加me.visible = false在form1_load结束时,使用时将隐藏图标 控制键 + 标签
- 根据需要运行并调整。
有用于通知区域应用非常友好的框架...它足以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;
到表单对象。 你会看到在系统托盘只有一个图标。