从Windows服务运行Windows应用程序

时间:2015-10-28 07:35:51

标签: c# .net windows windows-services

我创建了一个Windows应用程序,每次都应该在桌面上运行。为此,我们将应用程序置于启动状态。但由于一些例外或用户关闭窗口应用程序越来越近。

为了避免这种情况,我编写了Windows服务,它会每隔一分钟检查应用程序是否正在运行。如果关闭,Windows服务将启动该应用程序。

当我调试Windows服务时,应用程序运行正常。但是当我完成服务的设置。服务每隔一分钟运行一次,但Windows应用程序没有打开。

代码如下:

void serviceTimer_Elapsed(object sender, EventArgs e)
        {
            try
            {
                bool isAppRunning = IsProcessOpen("App"); 
                if (!isAppRunning)
                {                    
                    Process p = new Process();
                    if (Environment.Is64BitOperatingSystem)                        
                        p.StartInfo.FileName = @"C:\Program Files (x86)\Creative Solutions\App\App.exe"; 
                    else                        
                        p.StartInfo.FileName = @"C:\Program Files\Creative Solutions\App\App.exe";
                     p.Start();


                }
            }
            catch (Exception ex)
            {
                WriteErrorLog("Error in service " + ex.Message);
            }
        }

检查实例的方法是否正在运行:

 public bool IsProcessOpen(string name)
        {
            //here we're going to get a list of all running processes on
            //the computer
            foreach (Process clsProcess in Process.GetProcesses())
            {              
                if (clsProcess.ProcessName.Contains(name))
                {
                    //if the process is found to be running then we
                    //return a true
                    return true;
                }
            }
            //otherwise we return a false
            return false;
        }

任何人都可以帮助解决此问题。

2 个答案:

答案 0 :(得分:0)

试着看看这个问题:

How can a Windows service execute a GUI application?

使用P / Invoke

的情况

然而如上所述,这是一个糟糕的设计选择。

必需的代码,应该在使用SCM的服务中运行,并且所需的任何配置或与服务的交互都应放在通过...进行通信的单独客户端应用程序中。

答案 1 :(得分:0)

这可以简单地通过以下方式实现:
1)创建一个控制台应用程序。
2)通过从属性中将输出类型作为Windows应用程序来设置和部署控制台应用程序。

代码如下:

static void Main(string[] args)
        {
            Timer t = new Timer(callback, null, 0, 60000);
            Thread.Sleep(System.Threading.Timeout.Infinite); 
        }

        // This method's signature must match the TimerCallback delegate
        private static void callback(Object state)
        {
            try
            {
                bool isAppRunning = IsProcessOpen("APPName");
                if (!isAppRunning)
                {
                    Process p = new Process();
                    string strAppPath;
                    strAppPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFiles) + @"\FolderName\AppName.exe";                    
                    System.Diagnostics.Process.Start(strAppPath);                    
                }
            }
            catch
            { }
        }

        public static bool IsProcessOpen(string name)
        {
            //here we're going to get a list of all running processes on
            //the computer
            foreach (Process clsProcess in Process.GetProcesses())
            {
                if (clsProcess.ProcessName.Contains(name))
                {
                    //if the process is found to be running then we
                    //return a true
                    return true;
                }
            }
            //otherwise we return a false
            return false;
        }