c++ - Windows 服务如何执行 GUI 应用程序?

标签 c++ winapi windows-services

我编写了一个 Windows 服务,允许我远程运行和停止应用程序。这些应用程序使用 CreateProcess 运行,这对我有用,因为它们中的大多数只执行后端处理。最近,我需要运行将 GUI 呈现给当前登录用户的应用程序。如何使用 C++ 编写代码以允许我的服务定位当前事件的桌面并在其上运行 GUI?

最佳答案

Roger Lipscombe 的回答,使用 WTSEnumerateSessions找到合适的桌面,然后CreateProcessAsUser在该桌面上启动应用程序(您将桌面句柄作为 STARTUPINFO 结构的一部分传递给它)是正确的。

但是,我会强烈建议不要这样做。在某些环境中,例如具有许多事件用户的终端服务器主机,确定哪个桌面是“事件”桌面并不容易,甚至不可能。

但最重要的是,如果一个应用程序突然出现在用户的桌面上,这很可能发生在一个糟糕的时间(或者因为用户根本没想到它,或者因为您试图启动该应用程序时 session 尚未完全初始化,正在关闭或其他任何过程中)。

更传统的方法是在全局启动组中为您的服务放置一个小型客户端应用程序的快捷方式。然后,此应用程序将与每个用户 session 一起启动,并可用于启动其他应用程序(如果需要),无需对用户凭据、 session 和/或桌面进行任何处理。

此外,管理员可以根据需要移动/禁用此快捷方式,这将使您的应用程序部署更加容易,因为它不会偏离其他 Windows 应用程序使用的标准...

关于c++ - Windows 服务如何执行 GUI 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/267838/

相关文章:

c++ - 移动链表中的第一项以结束 C++

C-win32 : AttachThreadInput & SetFocus, 64 位:无线索

c++ - 如何在 Metro 应用程序中打印到 C++ 中的 Visual Studio 11 控制台/日志?

c++ - C++ 中的 Windows 服务

f# - 编写轮询 Windows 服务

c++ - AppCode - 在 Objective-C 项目中调试 C++ 程序?

c++ - 指向二维数组的指针

c++ - 非绘图 Mozilla 插件

c++ - 我可以依靠TCHAR的定义对我使用的字符集做出正确的假设吗?

sql-server - 如何在工作组环境中为 MS SQL Server 创建 Windows 服务帐户?