【问题标题】:Start TrayIcon from service从服务启动 TrayIcon
【发布时间】:2019-03-06 01:11:05
【问题描述】:

我有一个轮询在线 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 的计算机上。并不总是有用户登录,但为了简单起见,我们假设有,我可以稍后处理其余的错误。

【问题讨论】:

    标签: c# user-interface service


    【解决方案1】:

    确实,您的服务不应该与用户交互,如果您发现一篇文章展示了如何操作的技巧,那么它迟早会失败。

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

    所以不要试图伪造解决方案。它不会正常工作,因为它不应该正常工作。构建两个应用程序。

    【讨论】:

    • 我应该有一个监控两者的第三个应用程序吗?我还需要能够从服务启动 TightVNC 以启动传出远程会话以响应 API 调用
    • 或者更简单地说,TightVNC、Teamviewer、LogMeIn 都是服务。当它们运行时,它们有权响应传入的 TCP 请求,这使它们能够访问桌面并更改托盘图标颜色、提供通知等。即使在启动时加载的唯一内容是服务,它们也会完成所有这些。
    • 如果我在 Windows 10 中打开 3 个桌面,VNC 服务如何知道要显示的桌面?我很确定您会发现一段代码在所有用户会话中运行。老实说,我不知道它是什么样子,因为我不知道这三个程序的内部结构,但会有的。没有什么神奇的方法可以确定选择哪个桌面。
    • 但是你是说如果我知道我可以把它发送到那里的桌面吗?这不是可以使用 WMI 编写脚本的吗?
    • 说实话,我不知道。官方解读是你不应该直接从 Windows 服务访问用户的桌面,所以我从来没有费心去检查是否有黑客可以绕过官方指南。
    猜你喜欢
    • 2021-09-18
    • 1970-01-01
    • 2011-01-21
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多