首先,我知道一些制作真正交互式 Windows 服务的正确方法。
情况是,我确实有一个不与用户交互的工具。但是,它确实 通过弹出窗口和 Windows 通知区域(又名系统托盘)显示非阻塞通知。它还写入它显示的通知的日志文件。
此工具通常由主用户应用程序生成,只要主应用程序是普通应用程序,这些通知就会按预期工作。
当此工具由 Windows 服务生成时,自然不会显示任何通知。(服务的桌面会话不可见。)但这没关系,我们有日志文件,这些通知只是 - 通知,用户在任何情况下都必须看到的任何内容。
现在的问题变成了:在服务(服务本身或它启动的任何进程)的上下文中运行的进程是否“允许”进行显示可见 GUI 的 Windows API 调用?
- 大多数 Windows API 调用(例如创建和显示窗口、使用Shell_NotifyIcon等)在服务的不可见会话中是否表现相同?
- 或者我是否必须确保在整个源代码中,在服务的上下文中没有调用 GUI 显示/修改内容?
是的,调用::MessageBox是个坏主意,因为它会阻塞。但我可以处理这些电话。
是的,这可以设计得更好,但这是我目前所拥有的,如果我不必将整个工具拆开以确保服务中没有运行与 GUI 相关的代码,那就太好了。