有没有办法在Windows 7上从Windows服务启动GUI应用程序?

13

我进行了大量搜索,希望找到一种在Windows 7上从Windows服务启动GUI应用程序的方法。 我发现大多数情况下,由于Windows 7服务现在运行在单独的用户会话中,并且不能向当前用户显示任何图形界面,因此无法实现此功能。 我想知道是否有任何变通方法或不同的方式来实现这样的功能? 服务能否在不同的用户会话中启动进程?


为什么不编写一个Windows应用程序,由Windows计划程序定时启动? - Adeel
3个回答

21

这个更改是有原因的,不仅仅是为了烦扰开发人员。正确的方法是将UI放在一个不同的程序中,并通过管道或其他IPC机制与会话通信。服务不呈现UI的建议已经超过10年了。

即使一开始可能会感觉不方便,你真的应该尝试遵循这些规则。好处是可以保持服务逻辑和UI逻辑分离。

如果你的服务在LOCALSYSTEM帐户下运行,则可以勾选“允许服务与桌面交互”,以便于那些无法显示UI的传统服务。但是它对你也没有帮助,因为UI会显示在从未见过的会话0中!

我建议你阅读官方的Microsoft文档,描述了会话0隔离


@Brian 这对你有帮助吗? - David Heffernan
是的,谢谢。我已经有一个管理应用程序,通过tcp连接与服务进行交互。我只需向管理应用程序发送消息以执行命令行。唯一的问题是,如果用户关闭了管理应用程序,则服务将无法执行命令行命令。 - Brian
2
这是否意味着我们不应该从服务启动UI,因此需要将UI程序放在自动启动中,除了自动启动服务? - Taxel

3

1
CppInteractiveWindowsService示例中的相关代码在SampleService.cpp中。 - Joel V. Earnest-DeYoung

2

Windows 7引入了所谓的“Session 0隔离”,实际上意味着每个服务(除系统服务外)都在单独的非交互式会话中运行。因此,您不能直接从服务中创建GUI,除非通过标记“与桌面交互”选项以传统模式运行,但如果您计划将服务运行几年,则不太好。

正如David Heffernan所说,最好使用客户端服务器架构。 WCF使得使用命名管道进行通信变得容易。

这个页面是阅读Session 0隔离的好起点,这篇白皮书也很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接