我创建了一个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;
}
任何人都可以帮助解决此问题。
答案 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;
}