C# 从服务运行 Windows 窗体应用程序(在 Vista 中)

标签 c# winforms windows-services windows-vista

我正在用 C# 编写一个应用程序,它需要作为服务运行,但也需要用户交互。我知道服务没有 UI 等,所以我将我的程序分为一个 Windows 窗体应用程序和一个可以相互通信的服务。

我遇到的问题是我需要该服务来确保 Windows 窗体应用程序始终在运行并在未运行时重新启动它。我能够检测它是否正在运行,并在 Windows 2000/XP 上使用以下代码重新启动它:

System.Diagnostics.Process.Start("ExePath");

但在 Vista 上,它将新进程作为用户不可见的本地/系统进程运行。有人解决这个问题吗?有什么方法可以检测当前登录的用户并以该用户身份运行新进程吗?此时我不需要考虑快速用户切换。一些 - 任何 - 基本的就足够了。

如果您就此主题提供任何帮助或提示,我将不胜感激。

我需要澄清一下,我在安装服务时设置了“允许服务与桌面交互”选项。这是允许它在 2000/XP 上工作的原因。然而,Vista仍然存在上述问题。

最佳答案

这类事情的总体思路是,如果用户需要与服务交互,他们应该启动一个单独的应用程序。如果您想帮助他们,您可以通过在启动菜单中放置一个快捷方式来配置该单独的应用程序以使用 Windows 启动。您还可以在您的应用程序中构建崩溃恢复功能,以便它可以自动重启。

您不应该真正依赖于监视表单应用程序,如果没有人登录怎么办?如果多人登录怎么办?以这种方式做事只会变得一团糟。

让服务只是坐在那里并向听众广播是可行的方法。当表单应用程序启动时,它可以通知它想要监听事件的服务。

关于C# 从服务运行 Windows 窗体应用程序(在 Vista 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/418119/

相关文章:

c# - 用于 DataGridView (Windows.Forms) 和过滤的数组、列表或数据表

c# - 使用 WebAuthenticationCoreManager 进行 Facebook 身份验证的 url 是什么

c# - 防止复制/粘贴和右键单击文本框(电子邮件地址)

c# - 从 DataGridView 获取对象列表?

wcf - 关闭具有线程的 Windows 服务

c# - 为windows服务添加描述

configuration - 为 Windows 服务保留用户可编辑设置的最佳方式是什么?

c# - WPF OpenFileDialog 在 c# 中使用 MVVM (Model-View-ViewModel)

c# - 如何在 MyClass :Hub 中存储数据

c# - 从包含树状数据的 DataTable 或 List 填充 TreeView