【问题标题】:Launch an exe application from windows service从 Windows 服务启动 exe 应用程序
【发布时间】:2014-12-01 16:26:57
【问题描述】:

我有一项服务应该根据某些条件打开一个 exe 应用程序 (C# Application)。当服务以调试模式 (Visual Studio) 启动时,它会打开应用程序。但是当它作为服务安装时,它不会这样做。它无法打开应用程序。为什么会这样?

【问题讨论】:

  • 用户必须查看应用程序吗?这是不可能的。您的服务是否在会话中运行?这可能是必需的。
  • 服务默认运行在一个不允许用户交互的隔离会话中。 Windows 服务并非旨在进行交互,因此您在此处尝试执行的操作并不是服务应执行的操作。您可能需要考虑将代码重构为用户模式应用程序。明确您需要 exe 应用程序做什么,以及该服务做什么?
  • 是的,用户必须看到应用程序。不,不是的。有什么解决方法吗?
  • 您好Kenneth,该应用程序是一个每周考勤系统(多用户)。它需要每周一启动,用户可以通过选择exe应用程序中的提醒我选项来推迟此操作。时间记录在文本文件中。这里的服务读取文本文件并与系统日期进行比较,如果更大应该启动应用程序。它还写入下周一的日期。它在调试模式下工作正常,安装时失败。
  • 我理解的问题是错的,还是你只需要使用Process.Start?这甚至可以很好地启动 GUI 应用程序......

标签: c# windows-services


【解决方案1】:

在正常情况下,您尝试执行的操作无法直接实现 - 只需从您的 Windows 服务代码在新进程中启动应用程序,恐怕不会与当前登录用户的 GUI 进行交互.

不过,服务和 GUI 之间有多种通信方式。

This discussion might point you in the right direction.

【讨论】:

  • 嗨@olitee 感谢您的回复。我尝试使用“与桌面交互”选项。这成功地启动了应用程序,但要求用户获得读取消息或丢弃消息的权限。申请的目的是强制填写出勤,而不是延期。是否有可能覆盖用户权限并直接启动应用程序?
  • 我不知道有什么方法可以解决这个问题——默认行为是有原因的。首选方法是让您的服务通过命名管道与桌面应用程序进行通信。您可以创建一个在用户会话中静默运行的帮助应用程序,并监视该管道中的消息。该应用程序可以在收到消息时向用户显示其 GUI,或者以您已经描述的方式启动另一个应用程序。
【解决方案2】:

根据您的 cmets,我认为您在这里真正寻找的是一个普通的用户空间应用程序和一个调度程序。您可能希望使用 Windows 自己的调度程序在每个星期一运行应用程序,如果它是一个永远在线的盒子,或者将应用程序放在启动中。当应用程序运行时,它应该检查当前的星期几,如果是星期一并且应用程序之前没有在这一天运行,则应用程序应该启动。如果没有,您可以安全地完全终止应用程序。

【讨论】:

  • 调度程序部分可以由我为我的计算机配置对吗?但是这个应用程序有多个用户群,它必须预先配置这个逻辑。服务完成了我的工作,但我意识到它只是在安装后才失败。
【解决方案3】:

感谢您的回答!我找到了解决方案并将其发布在这里。 我创建了一个在启动时隐藏的虚拟应用程序,它执行的功能与该服务的预期功能完全相同。

1.创建一个虚拟应用程序(将粘贴代码从服务复制到表单应用程序) 启动后隐藏。 2.安装后立即启动应用程序。 3.添加注册表项,使其在系统重启后启动。

简单来说,就是克隆服务行为。

【讨论】:

    猜你喜欢
    • 2011-05-22
    • 2011-04-04
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多