我有:
- 简单的 WPF 应用,包含 1 个由 Visual studio 创建的窗口
- 启动该应用的 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/