1.在服务程序安装时编程实现,ProjectInstaller.cs
using
System;
using
System.Collections;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Configuration.Install;
//using System.Linq;
using
Microsoft.Win32;
//对注册表操作一定要引用这个命名空间
namespace
MonitorService
{
[RunInstaller(
true
)]
public
partial
class
ProjectInstaller : Installer
{
public
ProjectInstaller()
{
InitializeComponent();
//this.Context.Parameters["ServerCode"].ToString(); // 读取安装时输入的服务器编号
}
private
void
ProjectInstaller_AfterInstall(
object
sender, InstallEventArgs e)
{
//设置允许服务与桌面交互
SetServiceTable(
"MonitorService"
);
}
/// <summary>
/// 设置允许服务与桌面交互 ,修改了注册表,要重启系统才能生效
/// </summary>
/// <param name="ServiceName">服务程序名称</param>
private
void
SetServiceTable(
string
ServiceName)
{
RegistryKey rk = Registry.LocalMachine;
string
key =
@"SYSTEM\CurrentControlSet\Services\"
+ ServiceName;
RegistryKey sub = rk.OpenSubKey(key,
true
);
int
value = (
int
)sub.GetValue(
"Type"
);
sub.SetValue(
"Type"
, value | 256);
}
}
}
2.注册表修改
onstart的时候修改注册表
[HKEY_LOCAL_MACHINE
"SYSTEM"
CurrentControlSet
"Services"
你的服务名]
"Type"
=dword:00000010
key value+256
比如现在00000010是16+256=272
16精制就是00000110
3.SC程序修改, 允许与桌面进行交互
在dos命令提示符下输入:
sc config MonitorService type= interact type= own
回车即可。
可以用批处理的方式实现,把下面代码保存为 myservice.bat 即可:
rem 配置服务程序为允许与桌面进行交互方式
@echo
"准备停止服务程序..."
sc stop MyService
@echo
"设置允许与桌面进行交互方式允许"
sc config MyService type= interact type= own
@echo
"正在重新启动服务..."
sc start MyService
@echo
"启动服务成功!"
取消“允许与桌面进行交互”
DOS命令提示符下运行下面语句即可:
sc config MyService type= own
经测试:1,2 可以选中“允许与桌面进行交互”,但启动服务的时候,不能弹出应用程序的界面。
3 可以完美实现所有要求。
在服务的属性的登录选项卡中,把允许服务与桌面交互勾选上,再试试。