如何从 Windows 服务显示通知区域气球和图标?

Posted

技术标签:

【中文标题】如何从 Windows 服务显示通知区域气球和图标?【英文标题】:How can I show a Notification Area Balloon and Icon from a Windows Service? 【发布时间】:2011-06-01 16:35:46 【问题描述】:

当用户启动他们的工作站时,我有一个始终在运行的 Windows 服务。此 Windows 服务至关重要,我想在发生某些事情(例如服务停止、启动、重新启动等)时在通知区域显示气球通知。

例如:

另外,有没有办法为我的 Windows 服务显示通知区域图标?

【问题讨论】:

这篇文章可能会有所帮助:***.com/questions/2652254/… 服务不能直接拥有 SysTray 图标。 【参考方案1】:

Windows 服务直接与桌面交互的时代已经结束,因此您必须另谋出路。

我所做的是创建一个包含 NotifyIcon 的普通 WinForms 应用程序。此应用程序的行为模仿了任务管理器的行为,因此它可以从任务栏中隐藏,并且仅在系统托盘中可见。如果我右键单击系统托盘图标,我会得到一个菜单。如果我双击该图标,则会显示应用程序窗口。

为了方便 WinForms 应用程序和 Windows 服务之间的通信,我使用了 WCF。具体来说,我使用Juval Lowy 的Publish-Subscribe Framework,它非常适合这种场景。请参阅我的回答 here 了解更多详情。

希望这会有所帮助。

【讨论】:

【参考方案2】:

如果您只想向您的 Windows 服务发送一个简单的命令,您可以通过以下方式从您的用户应用程序向它发送一条消息。

ServiceController myService = new ServiceController("YOUR Service Name");
myService.ExecuteCommand(123); // do something;

如果您在类中重写 OnCustomCommand 方法,则扩展 ServiceBase。 然后,您可以使用此命令触发服务执行诸如重新加载配置文件或切换到某个状态之类的操作。

【讨论】:

您的回答与问题并不相符。 Ryan 正在尝试使用系统托盘图标,而不是向服务发送命令。 我和马特的意思是,与其配置你的服务来检测用户登录并在他们的任务栏上添加一个图标。有一个单独运行的应用程序,在任务栏中放置一个图标。此应用程序可以访问状态并向服务发送简单的命令,方法如上所示。这样,如果服务终止,图标就不会消失。如果您希望它在用户登录时出现,则将应用程序的快捷方式添加到启动文件夹。【参考方案3】:

我们的新(免费)ServiceTray utility 将让您通过托盘图标控制您的服务。当它检测到您的服务已更改状态(已启动->已停止等)时,它还会显示弹出/气球通知。

【讨论】:

我建议将其从纯垃圾邮件/仅限链接的帖子重写为一些真正的答案,以解释应该做什么来实现此类功能......或者只是删除。

以上是关于如何从 Windows 服务显示通知区域气球和图标?的主要内容,如果未能解决你的问题,请参考以下文章

从cmd调用Windows 7中的通知气球消息?

如何在Windows 10中发送通知(电子最佳实践)?

如何获取通知区域图标列表?

如何在应用启动器图标中显示通知计数[重复]

如何删除通知栏无效图标(重置任务栏通知区域)

在 Windows 10 中,如何翻译托盘通知气球的页脚?