从服务启动TrayIcon

时间:2019-03-05 17:05:14

标签: c# user-interface service

我有一个轮询在线API的C#服务(.NET 4.6.2)。与此相关的还有一个托盘图标。该服务应该使托盘图标保持运行状态,而该图标应该使服务保持运行状态。

如果该服务由于某种原因必须重新启动任务栏图标,则可以,但是该图标不会返回。我正在尝试解决此问题,因为用户认为如果图标不存在,则说明它不起作用。当他们重新启动应用程序并取回图标时,它将通过以下方式运行:

 Process process = Process.GetCurrentProcess();
        var dupl = (Process.GetProcessesByName(process.ProcessName));
        if (dupl.Length > 1)
        {
            foreach (var p in dupl)
            {
                if (p.Id != process.Id)
                    p.Kill();
            }
        }

确保在任何时候都只有一个副本。我意识到服务不应该直接访问UI,但是不存在间接方法吗?我可以通过另一个DLL或其他东西传递呼叫来做到这一点吗?

我对此进行了相当多的研究,发现了太多的资源,这些资源最终都已经过时了。即使是去年的这个看起来很有希望的方法也不起作用。 How to create process as user with arguments

此服务已部署在Windows 32位到Windows 10的计算机上。并非总是有用户登录,但为简单起见,我们假设存在该用户,以后我可以对其余的错误进行处理。

1 个答案:

答案 0 :(得分:1)

实际上,您的服务不应该与用户交互,如果您发现一篇有关如何反其道而行之的文章,那么它早晚会失败的。

正确的方法是拥有两个应用程序。服务和用户界面。该服务作为服务运行。用户界面应用程序将以用户身份启动(可能从其自动启动)。然后,这两个应用程序通过某种IPC(可能是套接字或管道)进行通信。用户界面可以显示托盘图标并显示其从服务获取的状态消息,也可以通过例如托盘图标上下文菜单将命令发送给从用户获取的服务。

因此,请勿尝试伪造解决方案。它不能正常工作,因为它不应该正常工作。构建两个应用程序。