答案 0 :(得分:27)
我会在这里尝试从关键词解释你的问题。将来,请花更多时间撰写您的问题,以便他们对试图阅读和理解他们的人有意义。
Windows服务的“属性”窗口的“登录”选项卡下有一个复选框,名为“允许服务与桌面交互。”如果您尝试以编程方式检查该框,您需要在使用CreateService
API创建服务时指定SERVICE_INTERACTIVE_PROCESS
标记。 (见MSDN)。
但是,请注意,从Windows Vista开始,严禁将服务直接与用户进行交互:
重要提示:服务无法直接与用户进行互动 Windows Vista。因此, 本节中提到的技术 标题为使用交互式服务 不应该在新代码中使用。
这个“特征”被打破了,传统的智慧决定你不应该依赖它。服务不是为了提供UI或允许任何类型的直接用户交互。微软一直在警告,自Windows NT早期以来,由于可能存在安全风险,因此可以避免此功能。拉里奥斯特曼辩称为什么是always a bad idea。他是not the only one。
某些possible workarounds,但是,如果绝对必须具有此功能。但我强烈建议您仔细考虑其必要性,并为您的服务探索其他设计。
答案 1 :(得分:5)
由于该服务未在用户会话的上下文中运行,因此您需要创建第二个与该服务进行交互的应用程序。
例如,Microsoft SQL Server有一个监视工具。此应用程序在用户会话中运行并连接到服务,为您提供有关服务是否正在运行以及允许您停止和启动数据库服务的信息。
由于该应用程序确实在用户会话中运行,因此您可以通过该应用程序与桌面交互。
答案 2 :(得分:4)
您需要添加serviceinstaller并在serviceinstaller的提交事件中记下以下代码。
using System.Management;
using System.ComponentModel;
using System.Configuration.Install;
private void serviceInstaller1_Committed(object sender, InstallEventArgs e)
{
ConnectionOptions coOptions = new ConnectionOptions();
coOptions.Impersonation = ImpersonationLevel.Impersonate;
ManagementScope mgmtScope = new ManagementScope(@"root\CIMV2", coOptions);
mgmtScope.Connect();
ManagementObject wmiService;
wmiService = new ManagementObject("Win32_Service.Name='" + serviceInstaller1.ServiceName + "'");
ManagementBaseObject InParam = wmiService.GetMethodParameters("Change");
InParam["DesktopInteract"] = true;
ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", InParam, null);
}
答案 3 :(得分:-4)
wmiService = new ManagementObject("
的 win32_service时强>.Name='" + serviceInstaller1.ServiceName + "'");
在64位机器上?