【发布时间】:2013-06-26 05:46:01
【问题描述】:
首先,我知道some proper ways 可以制作真正交互式的 Windows 服务。
情况是,我确实有一个不与用户交互的工具。但是,它确实会通过弹出窗口和 Windows 通知区域(又名系统托盘)显示 非阻塞通知。它还会写入它显示的通知的日志文件。
此工具通常由主用户应用程序生成,只要主应用程序是普通应用程序,这些通知就会按预期工作。
当此工具由 Windows 服务生成时,自然不会显示任何通知。 (服务的桌面会话不可见。)但这没关系,我们有日志文件,这些通知只是 - 通知,用户在任何情况下都绝对必须看到。
现在的问题变成了:进程是否在服务的上下文中运行(服务本身或它启动的任何进程)“允许”进行显示可见的 Windows API 调用图形用户界面?
- 大多数 Windows API 调用(例如,创建和显示窗口、使用 Shell_NotifyIcon 等)在服务的不可见会话中的行为是否相同?
- 或者我是否必须确保在整个源代码中,在服务上下文中没有调用 GUI 显示/修改内容?
是的,调用::MessageBox 是个坏主意,因为它会阻塞。但我可以处理这些电话。
是的,这可以设计得更好,但这是我目前所拥有的,如果我不必将整个工具拆开以确保服务中没有运行与 GUI 相关的代码,那就太好了。
【问题讨论】:
-
唯一的方法似乎是使用 WTSEnumerateSessions 和 CreateProcessAsUser——见SO article
-
@EdwardClements:感谢您的链接。但是请注意,在服务上下文中运行时,我确实不需要 需要显示 GUI 元素。我只是想知道 trying 显示非阻塞 GUI 元素是否会导致服务出现问题。
-
对不起,我的错误——我认为任何 GDI 调用都不会失败(我有一个旧服务,它在对话框窗口中显示进度消息,它仍然在 Win7/WinServer2008R2 上运行而没有错误,当然不显示任何东西)
标签: windows winapi user-interface windows-services notification-area