【WinUI 3】用H.NotifyIcon显示系统任务栏(托盘)图标,实现程序后台运行

这篇具有很好参考价值的文章主要介绍了【WinUI 3】用H.NotifyIcon显示系统任务栏(托盘)图标,实现程序后台运行。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言&问题背景

Windows平台上很多需要持续后台运行的程序,都有显示任务栏图标的需求,主要来显示状态信息、提供功能菜单栏。但UWP或Windows App SDK并没有提供对应的API,相反可能是在有意的抑制此项功能,我有理由怀疑是微软的战略布局。

但很显然,这项功能目前并不能有其它完美的替代解决方案,所以需要借助其它手段调用Win32 API实现。确实如此,GitHub中H.NotifyIcon库就帮助我们在WPF和WinUI平台上实现了。我们只需使用其NuGet包即可显示自己的任务栏图标。

但请注意,UWP程序强调生命周期管理,在后台期间会自动挂起。在官方的文档中,UWP确实有“在后台无限期运行”的解决方案,但一经使用则不能发布到Microsoft Store。为了响应其设计理念、也因为作者确实此方面涉足不深,本篇文章不探讨UWP平台的任务栏图标功能或后台运行功能。

解决方案

在NuGet源中,找到H.NotifyIcon包,根据你的需要选择H.NotifyIcon.WinUIH.NotifyIcon.Uno等包并安装。
注意,根据项目实例和自述文件,可以有多种声明与使用方法

  1. 直接全部在MainWindow内声明
<Window 
	...
	xmlns:tb="using:H.NotifyIcon"
	>
	<Grid>
		<Grid.Resources>
	        <MenuFlyout x:Key="TrayContextFlyout">
	            <MenuFlyoutItem Command="{StaticResource XamlUICommand类指令}" />
	            <MenuFlyoutSeparator />
	            <MenuFlyoutItem Command="{StaticResource XamlUICommand类指令}" />
	        </MenuFlyout>
	    </Grid.Resources>
	    <tb:TaskbarIcon
	    	x:Name="TrayIconView"
	        ToolTipText="悬停时显示的提示语文字,如ToolTip"
	        IconSource="图标文件路径,如/Images/TrayIcons/Logo.ico"
	        ContextMenu="ContextMenu资源,如{StaticResource TrayMenu}"
	        MenuActivation="显示菜单栏的行为,如LeftOrRightClick"
	        TrayPopup="弹出窗口资源,如{StaticResource TrayStatusPopup}"
	        PopupActivation="显示弹出窗口的行为,如DoubleClick"
	        LeftClickCommand="左键单击执行的命令,如{StaticResource Command}"
	        ContextMenuMode="SecondWindow"
	        NoLeftClickDelay="True"
	        />
	</Grid>
</Window>
  1. 定义一个UserControl,再在MainWindow使用
<Window 
   ...
   xmlns:views="using:UserControl所在命名空间"
   >
   <Grid>
   		...
   		<views:TrayIconView x:Name="TrayIconView" />
   </Grid>
</Window>
<UserControl ... >
    <UserControl.Resources>
       <MenuFlyout x:Key="TrayContextFlyout">
	        <MenuFlyoutItem Command="{StaticResource XamlUICommand类指令}" />
	        <MenuFlyoutSeparator />
	        <MenuFlyoutItem Command="{StaticResource XamlUICommand类指令}" />
	    </MenuFlyout>
    </UserControl.Resources>

    <tb:TaskbarIcon
	        ToolTipText="悬停时显示的提示语文字,如ToolTip"
	        IconSource="图标文件路径,如/Images/TrayIcons/Logo.ico"
	        ContextMenu="ContextMenu资源,如{StaticResource TrayMenu}"
	        MenuActivation="显示菜单栏的行为,如LeftOrRightClick"
	        TrayPopup="弹出窗口资源,如{StaticResource TrayStatusPopup}"
	        PopupActivation="显示弹出窗口的行为,如DoubleClick"
	        LeftClickCommand="左键单击执行的命令,如{StaticResource Command}"
	        ContextMenuMode="SecondWindow"
	        NoLeftClickDelay="True"
	        />
</UserControl>

个人更推荐第二种方法,这样不让主窗口文件显得臃肿,方便维护。
注意替换以上文字部分,要自行在Resources部分定义XamlUICommand指令并在MenuFlyoutItem中使用。

注意:在退出(Window Closed或自定义退出命令中)程序时,要调用TrayIconView.Dispose()方法。
注意:在退出(Window Closed或自定义退出命令中)程序时,要调用TrayIconView.Dispose()方法。
注意:在退出(Window Closed或自定义退出命令中)程序时,要调用TrayIconView.Dispose()方法。

这里补充说明一下以上文字部分的注释:

  • XamlUICommand类指令,直接定义在菜单栏中显示的图标、标签内容等的自定义命令,可在WinUI示例代码找到说明。
  • ContextMenuMode="SecondWindow"指定了菜单栏显示模式。“SecondWindow”指创建新的窗口覆盖Win32菜单栏,以使用WinUI风格设计的菜单栏。
    注意:作者在指定到本模式时,在Window代码中注册Activated等事件会产生运行时错误,因为H.NotifyIcon也会对UI元素事件进行注册,见issue #37。因此你需要将注册到这些事件的代码移动到App.xaml.cs或删除本项属性,则会默认仅使用Win32风格菜单栏(不自动再创建窗口)。
    【WinUI 3】用H.NotifyIcon显示系统任务栏(托盘)图标,实现程序后台运行

至此,题目的问题已经得到解决。
本篇博客有待更新,H.NotifyIcon提供了更多实用方法和属性,包括XAML生成托盘图标、以效率模式隐藏窗口到后台等,读者可以自行从文首的GitHub链接到仓库探索。

总结&反思

WinUI没有提供系统托盘图标的API,所以要调用H.NotifyIcon这类库来实现。
我本人十分欣赏这个项目,它可以用窗口覆盖的形式,应用WinUI风格的菜单栏到托盘图标,看起来符合Fluent Design设计语言,而不是老式的Win32风格。

非常感谢H.NotifyIcon的作者,从本项目可以看见很多可以让项目更符合Windows 11语言的新奇点子,暂时介绍不完了。文章来源地址https://www.toymoban.com/news/detail-459744.html

到了这里,关于【WinUI 3】用H.NotifyIcon显示系统任务栏(托盘)图标,实现程序后台运行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Windows 10桌面右下角时间图标添加秒钟显示&右下角系统时间添加星期几

    1.在桌面上按 “Win+R” 打开运行窗口,输入 “ regedit ” 点确定; 2.在注册表中进入 “ HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsCurrentVersionExplorerAdvanced ” 这个目录下; 3.在空白处单击鼠标右键新建 “ DWORD(32位)值 \\\"; 4.把新建的数值名称修改为 ” ShowSecondsInSystemClock “ ,并且数值

    2024年02月16日
    浏览(47)
  • Django实战项目-学习任务系统-查询列表分页显示

    接着上期代码框架,6个主要功能基本实现,剩下的就是细节点的完善优化了。 接着优化查询列表分页显示功能,有很多菜单功能都有查询列表显示页面情况,如果数据量多,不分页显示的话,页面展示效果就不太好。 本次增加查询列表分页显示功能,对一个查询列表功能进

    2024年02月05日
    浏览(47)
  • win10系统任务栏不显示已开启的软件-解决办法

    首先我们要排除是否是任务栏属性被关闭: 如果不是设置问题,那我们需要去任务管理器里看看: 查看explorer.exe是否开启,要求应该是关闭状态。 之后应该是不能通过win+R来启动“运行”来输入cmd了,我们可以通过任务管理器: 来唤醒dos窗口在里面直接输入: reg add HKCUS

    2024年02月11日
    浏览(41)
  • 如何在Windows系统中检测和结束运行中的程序(任务管理器显示运行程序可能有bug)

    在Windows系统的日常使用和管理过程中,我们经常需要检测某个程序是否正在运行,并在必要时结束它。本文将详细介绍如何在Windows系统中检测运行中的程序,并提供多种方法来结束这些程序。 1. 任务管理器 最直观的方法是使用任务管理器。通过按下 Ctrl + Shift + Esc 快捷键,

    2024年02月21日
    浏览(55)
  • Win10系统更新后【开机黑屏/白屏,不显示桌面,但是鼠标和任务管理器都好使】问题的解决

    如题,这个问题我碰到好几次了。解决方法就是启动explorer.exe。可以参考如下网址: win10启动后黑屏只有鼠标是什么原因_windows10开机后黑屏只有鼠标如何解决-windows系统之家   最近更新之后发现刚开机杀毒软件(火绒)跳出一个拦截,然后就没有桌面了。查看安全日志: 问题原

    2024年02月22日
    浏览(52)
  • wpf增加系统托盘图标

    使用系统托盘,可以为用户提供一个简便快捷的操作习惯。 wpf中增加系统托盘图标有2种 第一种,使用Hardcodet.NotifyIcon.Wpf开源组件 1.建立一个wpf程序 2.安装Hardcodet.NotifyIcon.Wpf 3.增加图片 图片选择资源,否则获取不到路径 4.界面前台代码 其中此处可以重写MenuItem的样式,以及其

    2024年02月10日
    浏览(37)
  • Electron 系统托盘图标

    一、在入口文件electron.js中引入 Tray , Menu , nativeImage 二、在初始化完成后添加图片

    2024年02月12日
    浏览(38)
  • Win11其他系统托盘图标清除无效项

    【问题描述】 “个性化任务栏其他系统托盘图标”中存在无效的应用项 图片来源 【解决方案】 win+R ,输入 regedit 打开注册表编辑器 进入路径: HKEY_CLASSES_ROOTLocal SettingsSoftwareMicrosoftWindowsCurrentVersionTrayNotify 删除其中的 IconStream 和 PastIconStream 两项 打开任务管理器,找到

    2024年02月11日
    浏览(71)
  • [ Windows 10 ] 任务栏按钮不显示正在打开的窗口了(打开任何程序任务栏图标按钮都不显示)

    系统是Windows 10 professional版本,在一次突然开机后,发现点开程序后,在任务栏什么都不显示,任务栏按钮和图标状态均不显示了,但是程序在运行。 当时兄弟们我心态直接蹦了啊,100万个草泥马根本停不下来,口里不断重复学习英文单词: what\\\'s the f**king going on? 异常情况如

    2024年02月04日
    浏览(51)
  • EditText不显示系统键盘,可用来显示自定义的键盘

    系统键盘 包含普通键盘和现在很多ROM定制的密码安全键盘 调用已下方法即可解决: https://developer.android.google.cn/reference/android/widget/TextView#setShowSoftInputOnFocus(boolean) 但是,此方法是API 21Android 5.0加入的, 所以为了兼容低版本, 建议使用已下方法:  public static final boolean notShowSoftInput

    2024年04月10日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包