C# 如何制作仅在系统托盘中运行的.NET Windows窗体应用程序?
我需要做什么才能使应用程序能够在系统托盘中运行 不是一个可以最小化到托盘中的应用程序,而是一个只存在于托盘中的应用程序,除了C# 如何制作仅在系统托盘中运行的.NET Windows窗体应用程序?,c#,.net,winforms,system-tray,C#,.net,Winforms,System 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
菜单项的事件处理程序中,确保调用setNotifyIcon.Visible=False
,然后调用Application.Exit()
。
将所需内容添加到上下文菜单中
,并正确处理:)
使用向导创建新的Windows应用程序
从代码中删除Form1
李>
删除Program.cs中的代码,启动Form1
使用NotifyIcon
类创建系统托盘图标(为其指定一个图标)
添加一个上下文菜单到它
或者对NotifyIcon
的鼠标单击并区分右键和左键做出反应,设置上下文菜单并显示按下哪个按钮(右/左)
Application.Run()
保持应用程序运行,并退出Application.Exit()
退出。或者abool 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);