C# WPF 应用程序在由使用 topshelf 创建的 Windows 服务启动时不显示表单

标签 c# wpf windows worker topshelf

我有:

  1. 简单的 WPF 应用,包含 1 个由 Visual studio 创建的窗口
  2. 启动该应用的 Windows 服务(使用 topshelf 创建)

如果我手动启动应用程序,它会出现在任务管理器中并按应有的方式显示表单。

但是当它由Windows服务启动时,应用程序出现在任务管理器中,但不显示表单。应该是什么原因呢?

win 服务中的应用程序启动代码

                    System.Diagnostics.Process process = new System.Diagnostics.Process();
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                startInfo.FileName = _app.MainAppDirectory;
                startInfo.Arguments = "";
                process.StartInfo = startInfo;
                process.Start();

最佳答案

你做不到。 Windows 服务 未在当前用户 session 下运行。当您登录 Windows 时,您将获得一个事件 session ,包括(桌面、环境变量等),并且每当您运行应用程序(例如简单的 WindowsForm 或 WPF)时,您都会获得一个事件 session 。 ,...)它将在您的事件 session 下运行。您可以打开任务管理器并导航到详细信息选项卡以查看有关运行每个进程的用户的信息(针对WPF应用程序检查此信息当它由您的 Windows 服务运行时)。

您可以在开始菜单上输入Services并打开Services窗口并找到您安装的服务。您可以在那里检查名为登录身份的列。它是运行您的 Windows 服务 的用户帐户(可能是本地系统本地服务)。

这是一个有趣的事实,您可以编写一个即使没有登录用户也可以运行的应用程序。

我有同样的任务,5年前,我试图窃取用户 session 。使用模拟,您可以窃取用户 token 并以特定用户身份运行您的应用程序。但您仍然无法在桌面上看到您的应用程序。

寻找不同的项目类型来满足您的要求。也许将您的应用程序标记为启动应用程序并向用户隐藏其表单

关于C# WPF 应用程序在由使用 topshelf 创建的 Windows 服务启动时不显示表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76033338/

相关文章:

c# - 占用高 CPU 的非托管方法调用

c# - IsDirty 对 EF 实体使用 INotifyPropertyChanged

python - 如何从 Windows 注册表中删除多个版本的 Python

c# - 该进程无法访问该文件,因为它正被另一个进程使用

wpf - WPF KeyBinding Key 可以有多个替代值吗?

c++ - Qt 5.1.1 和 OpenGL - 渲染速度

c# - .Net 控制台应用程序在后台运行

c# - TCP 包发送错误

c# - viewbag 没有将 `id` 保存到后期操作中

wpf - ViewModel 每个 View 还是每个模型?