gpt4 book ai didi

c# - 如何在Windows服务安装程序中设置 "interact with desktop"

转载 作者:行者123 更新时间:2023-12-02 01:31:27 26 4
gpt4 key购买 nike

我有一个 Windows 服务,它在系统帐户下运行,并时不时执行一些程序(是的,是的,我知道这是一个不好的做法,但这不是我的决定)。我需要设置“与桌面交互”检查,以在安装服务后查看所执行程序的 GUI。我尝试了多种方法,将下面的代码放入服务安装程序的 AfterInstall 或 OnCommited 事件处理程序中:

ConnectionOptions coOptions = new ConnectionOptions();
coOptions.Impersonation = ImpersonationLevel.Impersonate;

ManagementScope mgmtScope = new System.Management.ManagementScope(@"root\CIMV2", coOptions);
mgmtScope.Connect();

ManagementObject wmiService = new ManagementObject("Win32_Service.Name='" + ServiceMonitorInstaller.ServiceName + "'");

ManagementBaseObject InParam = wmiService.GetMethodParameters("Change");
InParam["DesktopInteract"] = true;
ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", InParam, null);

 RegistryKey ckey = Registry.LocalMachine.OpenSubKey(
@"SYSTEM\CurrentControlSet\Services\WindowsService1", true);

if(ckey != null)
{
if(ckey.GetValue("Type") != null)
{
ckey.SetValue("Type", ((int)ckey.GetValue("Type") | 256));
}
}

这两种方法都“有效”。他们设置了检查,但是在我启动服务后,它启动了 exe - 并且没有显示 gui!因此,如果我停止服务,请重新检查并重新启动 - 宾果!一切都开始并显示。实现结果的第二种方法是重新启动 - 之后 GUI 也会显示。

所以问题是:是否有正确的方法来设置“与桌面交互”检查,以便它无需重新检查和重新启动即可开始工作?

操作系统:Windows XP(尚未尝试过 Vista 和 7...)

最佳答案

private static void SetInterActWithDeskTop()
{
var service = new System.Management.ManagementObject(
String.Format("WIN32_Service.Name='{0}'", "YourServiceName"));
try
{
var paramList = new object[11];
paramList[5] = true;
service.InvokeMethod("Change", paramList);
}
finally
{
service.Dispose();
}


}

关于c# - 如何在Windows服务安装程序中设置 "interact with desktop",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3351531/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com