有啥方法可以从 Windows 7 上的 Windows 服务启动 GUI 应用程序?
Posted
技术标签:
【中文标题】有啥方法可以从 Windows 7 上的 Windows 服务启动 GUI 应用程序?【英文标题】:Is there any way to start a GUI application from a windows service on Windows 7?有什么方法可以从 Windows 7 上的 Windows 服务启动 GUI 应用程序? 【发布时间】:2011-07-01 03:03:56 【问题描述】:我已经做了大量的搜索以找到一种在 Windows 7 上从 Windows 服务启动 GUI 应用程序的方法。我发现的大部分内容是 Windows 7 服务现在在单独的用户会话中运行并且无法显示当前用户的任何图形界面。我想知道是否有任何解决方法或不同的方式来完成这样的事情?服务可以在不同的用户会话中启动进程吗?
【问题讨论】:
为什么不写一个windows应用程序,由windows scheduler调度 【参考方案1】:进行此更改是有原因的,而不仅仅是为了惹恼开发人员。正确的做法是将你的 UI 放在不同的程序中,并通过管道或其他 IPC 机制与会话进行通信。服务不呈现 UI 的建议已经有 10 多年的历史了。
您确实应该尝试遵循这些规则,即使一开始可能看起来不方便。从好的方面来说,您将享受将服务逻辑和 UI 逻辑分开的好处
如果您的服务在 LOCALSYSTEM 帐户下运行,那么您可以选中“允许服务与桌面交互”,以确保旧服务在无法显示 UI 时会失败。但无论如何它对您没有帮助,因为 UI 将在会话 0 中显示,而它永远不会出现!
我建议你阅读官方Microsoft document describing session 0 isolation。
【讨论】:
@Brian 这对您有帮助吗? 好的,谢谢。我已经有一个通过 tcp 连接与服务交互的管理应用程序。我可以只向管理应用程序发送一条消息以执行命令行。唯一的问题是用户关闭管理应用程序,服务将无法执行命令行命令。 那么这是否意味着不应从服务启动UI,因此除了自动启动服务外,还需要将UI程序置于自动启动中?【参考方案2】:有办法做到这一点。 如果您需要显示一个简单的消息框,您可以使用 WTSSendMessage 例程。 如果你需要一个复杂的 UI 元素,你可以把它放在一个单独的程序中,你需要使用 CreateProcessAsUser 例程。 在微软提供的这个示例中,您可以看到该过程。
http://blogs.msdn.com/b/codefx/archive/2010/11/26/all-in-one-windows-service-code-samples.aspx
【讨论】:
CppInteractiveWindowsService sample在SampleService.cpp中有相关代码。【参考方案3】:Windows 7 引入了所谓的“会话 0 隔离”,这实际上意味着每个服务(系统服务除外)都在单独的非交互式会话中运行。由于这个原因,您不能直接从服务中创建 GUI,除非您通过标记 Interact With Destop 选项以旧模式运行,如果您计划运行服务几年,这并不好未来。
正如 David Heffernan 所说,最好的方法是使用客户端-服务器架构。 WCF 使与命名管道的通信变得容易。
This page 是阅读 Session 0 Isolation 的一个很好的起点,this white paper 也非常好。
【讨论】:
以上是关于有啥方法可以从 Windows 7 上的 Windows 服务启动 GUI 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
有啥方法可以从 Windows 10 中的 c# 桌面应用程序使用蓝牙 LE?
有啥方法可以覆盖 iOS 7 中的 titleView 褪色?