从windows服务运行windows应用程序
本文关键字:windows 应用程序 运行 服务 | 更新日期: 2023-09-27 18:19:44
我创建了一个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;
}
请任何人帮助解决这个问题。
试着看看这个问题:
Windows服务如何执行GUI应用程序?
在您使用p/Invoke 的情况下
然而,如前所述,这是一个糟糕的设计选择。
所需的代码,应使用SCM在服务中运行,所需的任何配置或与服务的交互都应放在通过通信的单独客户端应用程序中。。不管你喜欢什么。
这可以通过以下方式简单实现:
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;
}