C# - 从Windows服务运行WPF应用程序

时间:2015-08-03 17:16:17

标签: c# wpf windows-services

我有一个服务,它跟踪WPF应用程序是否在计算机上运行。如果它发现,这样的应用程序已经关闭,那么它再次打开它。它是在一个循环中完成的。

是的,我知道这对大多数用户来说都是不好的做法,但有些情况是必要的。

我所做的是一项确保运行WPF应用程序的服务。结果是,我可以在任务资源管理器中看到此应用程序,但不能在屏幕上看到。我也知道,App.xaml.cs中的构造函数被触发了,因为我在那里创建了一个测试代码,它创建了一个空文件。

这是服务源代码:

private Timer timer;
protected override void OnStart(string[] args)
{
    timer = new Timer();
    timer.Interval = 3000;
    timer.Elapsed += this.Timer_Elapsed;
    timer.Enabled = true;
}

private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
    if (!this.CheckIfRunning("Application"))
    {
        ProcessStartInfo psi = new ProcessStartInfo();
        psi.CreateNoWindow = false;
        psi.FileName = @"D:\Application.exe";
        psi.WindowStyle = ProcessWindowStyle.Normal;
        Process proc = new Process();
        proc.StartInfo = psi;
        proc.Start();
    }
}

protected override void OnStop()
{
    timer.Enabled = false;
}

我想做的只是打开带有可见窗口的WPF应用程序。

2 个答案:

答案 0 :(得分:3)

感谢@ adriano-repetti我找到了如何从Windows服务运行WPF应用程序并将其显示在屏幕上的解决方案。解决方案在这里:https://github.com/murrayju/CreateProcessAsUser。这个人做了ProcessExtensions静态类,它以当前用户的身份启动新进程。

我的几句话:如果你在循环中检查进程的状态(活动/非活动),请考虑由此引起的延迟"特殊"开放申请的方法。与传统方式相比,这非常耗费时间。我设置了3500毫秒,我的应用程序实际上是闪烁的。将它改为5000毫秒后,一切都很好。

答案 1 :(得分:0)

从Windows服务,您可以运行启动WPF应用程序的控制台应用程序。这很棘手,但应该有用。