我有:

  1. 简单的WPF应用程序,带有一个由Visual Studio创建的窗口
  2. 启动该应用程序的Windows服务(使用TopShelter创建)

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

但当它由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 services未在current user会话下运行.当您登录到Windows时,您将获得一个活动会话,包括(桌面、环境变量等),并且每当您运行应用程序(如简单的WindowsFormWPF等)时,它都会在您的活动会话下运行.你可以打开Task manager并导航到Detail选项卡,以查看运行每个进程的用户的信息(当WPF应用程序由你的Windows服务运行时,请勾选此项).

您可以在Start menu上输入Services,然后打开Services窗口,找到您已安装的服务.您可以在那里判断名为Log on As的列.它是运行您的Windows service的用户帐户(可能是Local SystemLocal Service).

It's an interesting fact,您可以编写即使在没有登录用户的情况下也可以运行的应用程序.

我也有同样的任务,5年前,我试图窃取用户会话.使用Impersonation,您可以窃取用户令牌并以特定用户身份运行应用程序.但您仍然无法在桌面上看到您的应用程序.

寻找不同的项目类型来满足您的需求.也许可以将您的应用程序标记为启动应用程序,并对用户隐藏它的Forms.

Csharp相关问答推荐

O(N)测试失败

将修剪声明放入LINQ中

如何循环遍历XML文档 node 以使用XSLT存储值

如何阻止注释被包含在C#release build. exe中

. NET在上一个操作完成之前,在此上下文实例上启动了第二个操作

如何忽略API JSON响应中的空字符串?

当前代码Cosmos DB 3.37.1:PartitionKey key key mismatch exception

异步任务导致内存泄漏

未在数据流块之间传播完成

如何将MemberInitExpression添加到绑定中其他Lambda MemberInitExpression

TagHelpers在新区域不起作用

Lambda表达式如何与隐式强制转换一起工作?

将内置的OrderedEumable&Quot;类设置为内部类有什么好处?

对于PowerShell中的ConvertTo-SecureString方法,Microsoft如何将初始化向量添加到AES加密中的安全字符串?

在C#.NET项目中启动时,如何等待提升的PowerShell进程退出?

如何将默认区域性更改为fr-FR而不是en-US?

如何在C#中从MongoDB IPipelineStageDefinition中获取聚合命令的字段/选项?

Foreach非常慢的C#

多个参数的最小API删除

带有类约束的C#泛型