在windowService用Process.Start()启动程序没有界面-记录

时间:2022-08-29 14:40:44
原文: 在windowService用Process.Start()启动程序没有界面-记录

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 可以完美实现所有要求。

在windowService用Process.Start()启动程序没有界面-记录

在服务的属性的登录选项卡中,把允许服务与桌面交互勾选上,再试试。