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

时间:2011-02-21 08:28:19

标签: c# windows windows-services

我已经做了很多搜索,以便从Windows 7上的Windows服务中找到一种启动GUI应用程序的方法。我发现的大部分内容都是Windows 7服务现在在单独的用户会话中运行而无法显示当前用户的任何图形界面。我想知道是否有任何一种解决方法或不同的方式来完成这样的事情?服务可以在不同的用户会话中启动进程吗?

3 个答案:

答案 0 :(得分:18)

这种改变是出于某种原因而不仅仅是为了惹恼开发者。正确的方法是将您的UI放在不同的程序中,并通过管道或其他IPC机制与会话进行通信。服务不提供UI的建议现已超过10年。

您应该尝试遵循这些规则,即使开始时看起来不方便。从好的方面来说,您将享受保持服务逻辑和UI逻辑分离的好处

如果您的服务在LOCALSYSTEM帐户下运行,那么您可以选中“允许服务与桌面交互”,以便在遗留服务无法显示UI时失败。但无论如何它都无济于事,因为UI会在会话0中显示,从未见过它!

我建议您阅读官方Microsoft document describing session 0 isolation

答案 1 :(得分:2)

有一种方法可以做到这一点。 如果需要显示一个简单的消息框,可以使用WTSSendMessage例程。 如果您需要复杂的UI元素,可以将其放在单独的程序中,并且需要使用CreateProcessAsUser Routine。 在microsoft提供的这个示例中,您可以看到该过程。

http://blogs.msdn.com/b/codefx/archive/2010/11/26/all-in-one-windows-service-code-samples.aspx

答案 2 :(得分:1)

Windows 7引入了所谓的“会话0隔离”,实际上意味着每个服务(系统服务除外)都在一个单独的非交互式会话中运行。因此,您无法直接在服务中创建GUI,除非您通过标记 Interact With Destop 选项在传统模式下运行,如果您计划运行服务多年,那就不好了在将来。

David Heffernan说,最好是使用客户端 - 服务器架构。 WCF使得与命名管道的通信变得容易。

This page是阅读第0节隔离的好起点,this white paper也非常好。