使用WPF创建任务栏常驻应用程序


用WPF创建任务托盘(通知区域)常驻应用程序花费的时间比我想象的要多,因此这是我的第一篇备忘录。

运行环境

  • Visual Studio 2019
  • .NET Core3.1(也可以使用.NET 5.0)

提前准备

从"创建新项目"创建WPF应用程序(.NET)。

图标准备

首先,创建一个ico文件以在任务栏中显示图标。
我认为使用Inkscape等绘图软件是最简单的。
顺便说一句,您可以通过使用Windows标准格式图标创建之类的站点轻松创建多图标。
创建ico文件后,将其添加为Solution Explorer中的现有项。
既存の項目.png
然后将属性构建操作更改为资源。
icoファイルのプロパティ.png

表格准备

我认为这可能是最容易绊倒的地方。
我认为它以多种方式编写,例如在其他站点上添加引用,但是现在在项目文件的<PropertyGroup>中为

.csproj

1
<UseWindowsForms>true</UseWindowsForms>

您可以通过添加

来处理Form类。

使用WFP

制作任务托盘

现在我们已经做了很多准备,是时候编写任务托盘了。在App.xaml.cs的OnStartup方法中编写以下内容。

App.xaml.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            var icon = GetResourceStream(new Uri("icon.ico", UriKind.Relative)).Stream;
            var notifyIcon = new System.Windows.Forms.NotifyIcon
            {
                Visible = true,
                Icon = new System.Drawing.Icon(icon),
                Text = "タスクトレイ常駐アプリのテストです"
            };
        }
    }

对于

变量图标的icon.ico,使用您准备的ico文件的名称。
文本是当您将鼠标悬停在任务托盘中的图标上时显示的工具提示文本。
タスクトレイのツールチップ.png

添加上下文菜单

App.xaml.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            var icon = GetResourceStream(new Uri("icon.ico", UriKind.Relative)).Stream;
            var menu = new System.Windows.Forms.ContextMenuStrip();
            menu.Items.Add("終了", null, Exit_Click);
            var notifyIcon = new System.Windows.Forms.NotifyIcon
            {
                Visible = true,
                Icon = new System.Drawing.Icon(icon),
                Text = "タスクトレイ常駐アプリのテストです",
                ContextMenuStrip = menu
            };
            notifyIcon.MouseClick += new System.Windows.Forms.MouseEventHandler(NotifyIcon_Click);
        }

        private void NotifyIcon_Click(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                var wnd = new MainWindow();
                wnd.Show();
            }
        }

        private void Exit_Click(object sender, EventArgs e)
        {
            Shutdown();
        }
    }

使用

Items.Add添加上下文菜单。
タスクトレイのコンテキストメニュー.png
您还可以确定MouseClick事件中左键单击的行为。

防止窗口在运行时出现

这样我就可以在任务托盘中显示它了,但是,尽管它是驻留软件,但由于每次执行时都显示该窗口很烦人,所以我将阻止在执行时显示该窗口。
如果您在App.xaml中删除StartupUri,则该窗口将不会显示并且可以使用。
スタートアップの削除.png

摘要

<UseWindowsForms>true</UseWindowsForms>是处理WPF中的任务托盘所必需的。
将过程写入OnStartup方法。
然后在App.xaml中删除StartupUri。

参考文章

创建Windows任务栏常驻应用程序
在.net Core 3.0 Preview9项目中使用System.Windows.Forms类
[WPF]从资源图像创建BITMAP对象
介绍如何制作C#任务栏常驻应用程序!
C#右键单击按钮不会引发mouseclick事件