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

7
我有一个服务,用于跟踪计算机上是否运行着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应用程序。

3
默认情况下,Windows服务(让我简化一下)在不交互的会话下运行。如果您希望运行可见应用程序,则需要在用户会话中启动服务。请注意,这将导致您的服务有多个实例(每个已登录用户一个)。 - Adriano Repetti
谢谢你的提示。它真的很有用 :) - Fka
2个回答

5
感谢@adriano-repetti,我找到了一种解决方案,可以从Windows服务中运行WPF应用程序并将其放置在屏幕上可见。解决方案在这里:https://github.com/murrayju/CreateProcessAsUser。这个人创建了ProcessExtensions静态类,它以当前用户身份启动新进程。
我的几句话:如果你在循环中检查进程的状态(活动/非活动),请考虑由于此“特殊”打开应用程序的方法而导致的延迟。与传统方式相比,它真的非常耗时。我设置了3500毫秒,我的应用程序简直在闪烁。将其更改为5000毫秒后,一切都很好。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接