首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

Windows服务程序,前台不显示界面,该如何解决

2013-07-01 
Windows服务程序,前台不显示界面本帖最后由 u011235865 于 2013-06-28 13:21:25 编辑用C#写了一个定时监控

Windows服务程序,前台不显示界面
本帖最后由 u011235865 于 2013-06-28 13:21:25 编辑 用C#写了一个定时监控服务,检测某一程序是否运行,如果没有运行,则启动改程序,如果已经运行,则不作任何操作。代码如下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.Threading;

namespace RegularMonitoringProgram
{
    public partial class Service1 : ServiceBase
    {
        
        public Service1()
        {
            InitializeComponent();
            InitService();
        }
        private void InitService()
        {
            base.AutoLog = true;
            base.CanShutdown = true;
            base.CanStop = true;
            base.CanPauseAndContinue = true;
            base.ServiceName = "BMTService";  //这个名字很重要,设置不一致会产生 1083 错误哦!
        }
        protected override void OnStart(string[] args)
        {
            //timeExe 在Service1.Designer.cs 函数private void InitializeComponent()定义
            this.timeExe.Enabled = true;
            this.tCheckExe();
        }

        protected override void OnStop()
        { 
            this.timeExe.Enabled = false;
        }
        //定时执行的事件
        private void timeExe_Elapsed(object sender, System.Timers.ElapsedEventArgs e)


        {
            this.tCheckExe();
        }

        private void tCheckExe()
        {
            Thread t = new Thread(new ThreadStart(OnTimedEvent));
            t.Start();
        }  

       
        private void OnTimedEvent()
        {
            bool InfoFlag = false;
            string StartAppPath = "";
            string ProcessName = "";
            string flag = "";
            string path = @"d:\Setting\setting.xml";

            ProcessName = XMLSettings.getUrl("ProcessName", path);
            StartAppPath = XMLSettings.getUrl("AppLocation", path);
            flag = XMLSettings.getUrl("isUpdating", path);
            Process[] Processes = Process.GetProcesses();
            Process ProcessApp = Processes[0];
            for (int i = 0; i < Processes.Length; i++)
            {
                if (Processes[i].ProcessName.ToLower() == ProcessName)
                {
                    ProcessApp = Processes[i];
                    InfoFlag = true;
                    break;


                }
                else continue;
            }
            if (!InfoFlag)
            {
                if (flag=="0")
                {
                    try
                    {
                        Process AppProcess = new Process();
                        AppProcess.StartInfo.FileName = StartAppPath;
                        //AppProcess.StartInfo.Arguments = "";
                        AppProcess.Start();

                    }
                    catch (Exception)
                    {
                        throw;
                    } 
                }
            }
        }
前台调试的时候可以出来用户程序界面,比如cmd.exe,就可以打开,但是裝到本地电脑服务之中就不显示前台界面了,求高手指点...


[解决办法]



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

热点排行