65.9K
CodeProject 正在变化。 阅读更多。
Home

创建任务托盘应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (34投票s)

2007年5月7日

CPOL

2分钟阅读

viewsIcon

168346

downloadIcon

8683

如何创建一个主要由任务托盘图标组成的应用程序

Screenshot - TaskTrayApp.png

引言

人们经常发现自己编写一些主要以任务栏图标形式存在的应用程序。这些应用程序可以监视某些内容、更新某些内容,或者是一些在后台运行但希望告知用户其正在运行的应用程序。

到目前为止,我所见过的在互联网上实现此目的的方法是创建配置窗体(其中包含 NotifyIcon),然后隐藏配置窗体。

然而,这有几个缺点,主要的是配置窗体会在您启动应用程序时闪烁。让它隐藏启动可能有点麻烦。

幸运的是,有一种更好的方法可以将应用程序作为 NotifyIcon 启动:使用 ApplicationContext

Using the Code

首先创建一个 WinForms 项目并编辑配置窗体以满足您的需求。完成此操作后,打开 Program.cs。您应该会发现最后一行看起来像这样

Application.Run(new Form1());

这告诉 Application 加载并显示 Form1,并且只要 Form1 处于活动状态,就保持 Application 处于活动状态。但请看看 Run 的重载。它不仅接受 Form,还接受 ApplicationContext

创建一个新的类,该类继承自 ApplicationContext(我们将它称为 MyApplicationContext)。然后用以下内容替换上一行

Application.Run(new MyApplicationContext());

MyApplicationContex 的构造函数中,您可以插入代码来初始化 NotifyIcon。我的代码看起来像这样

MenuItem configMenuItem = new MenuItem("Configuration", new EventHandler(ShowConfig));
MenuItem exitMenuItem = new MenuItem("Exit", new EventHandler(Exit));

NotifyIcon notifyIcon = new NotifyIcon();
notifyIcon.Icon = TaskTrayApplication.Properties.Resources.AppIcon;
notifyIcon.ContextMenu = new ContextMenu(new MenuItem[] 
    { configMenuItem, exitMenuItem });
notifyIcon.Visible = true;

然后,您可以创建一个 ShowConfig 方法来显示配置窗口。我的代码看起来像这样

Configuration configWindow = new Configuration();
void ShowConfig(object sender, EventArgs e)
{
    // If we are already showing the window, merely focus it.
    if (configWindow.Visible)
    {
        configWindow.Activate();
    }
    else
    {
        configWindow.ShowDialog();
    }
}

为了完整起见,我的 Exit 方法看起来像这样

void Exit(object sender, EventArgs e)
{
    // We must manually tidy up and remove the icon before we exit.
    // Otherwise it will be left behind until the user mouses over.
    notifyIcon.Visible = false;
    Application.Exit();
}

因此,您现在应该能够创建在任务栏中启动、存在和关闭的应用程序,而无需编写一个用于托管 NotifyIcon 的窗体。

历史

  • 07/05/2007
    • 提交的文章
  • 09/23/2007
    • 修复格式
    • configWindow.Focus(); 更改为 configWindow.Activate();
© . All rights reserved.