我制作了一个在屏幕上显示时钟的应用程序,该时钟指示您的工作量。此应用程序通过发送Windows 10通知获取/发布Web服务并在用户工作结束时通知用户。
此应用仅适用于我们公司的员工,并且仅在Windows 10设备中部署。由于员工没有接触Windows服务的特权,因此我制作了Windows服务来检查应用程序是否正在运行,并在未运行时启动该应用程序。这样,即使用户在任务管理器中将其杀死,它也将重新运行。
但是,这没有用。我从中找出原因:
How can I run an EXE program from a Windows Service using C#?
Run windows application from Windows service
How to run console application from Windows Service?
Allow service to interact with desktop in Windows
我也阅读了越来越多的文章。
有人说Windows服务只能运行控制台应用程序,并建议制作Windows应用程序而不是Windows服务。
因此,我已经在Windows服务和该应用之间创建了控制台应用程序。 Windows服务使控制台应用程序保持运行状态,而控制台应用程序使另一个应用程序保持运行。
Windows服务
''Windows Service
protected override void OnStart(string[] args)
{
timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
timer.Interval = 5000;
timer.Enabled = true;
}
private void OnElapsedTime(object source, ElapsedEventArgs e)
{
bool isAppRunning = IsProcessOpen("WorkingTimeAppConsole");
if (!isAppRunning)
{
Process pr = new Process();
pr.StartInfo.FileName = @"C:\Program Files (x86)\Default Company Name\Setup1\WorkingTimeAppConsole.exe";
pr.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
pr.StartInfo.CreateNoWindow = false;
pr.Start();
}
}
控制台应用程序
''Console application
class Program
{
static void Main(string[] args)
{
while (true)
{
bool flg = false;
Process[] processList = Process.GetProcessesByName("WorkingTimeApp");
foreach (Process p in processList)
{
flg = true;
if (p.Responding)
{
Console.WriteLine("OK");
break;
}
else
{
p.Close();
RunApp();
}
}
if (!flg)
{
RunApp();
}
System.Threading.Thread.Sleep(5000);
}
}
static void RunApp()
{
Process myProcess = new Process();
myProcess.StartInfo.FileName = @"C:\Program Files (x86)\Default Company Name\Setup1\WorkingTimeApp.exe";
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
myProcess.Start();
}
}
这也没有用。
另一种解决方案使Windows应用程序变得无法替代,无法阻止用户停止应用程序。所以我没有尝试。
我还需要做些什么其他方式?