【问题标题】:How to show a form in windows service.如何在 Windows 服务中显示表单。
【发布时间】:2011-07-09 20:03:44
【问题描述】:

我想在我的 Windows 服务的 OnStart() 方法中加载一个表单;这是我的代码。它不工作。你能提供任何帮助吗?

protected override void OnStart(string[] args)
{
    Form1 fr = new Form1();
    fr.Show();
}

【问题讨论】:

  • 您不会在服务中加载/显示表单。这就是重点!
  • 你为什么要尝试做这样的事情?
  • @PedroC88:我想获取任何用户的 kogin 和注销的用户名和时间,我在 form1_load 和 form1_closure 中编写我的代码,然后我用我的服务加载我的表单,但它没有根本不工作。
  • 请注意,人们不会登录/退出服务。他们将登录和退出使用该服务的应用程序。这样的应用程序应该提供数据。服务应限制自己接收、处理并可能存储它。
  • @PedroC88: 我可以使用任务计划程序吗???我是新程序员,我可以在用户登录和注销时运行我的任务计划程序吗???

标签: c# .net forms windows-services


【解决方案1】:

您不能那样使用服务。服务不能直接与桌面交互,因为它们在登录用户会话的另一个WindowsStation 中运行。您需要创建另一个将与您的服务通信的应用程序。

如何进行交流,您可以阅读 MSDNin this example。在StackOverflow 上也已经描述了一些想法。

【讨论】:

    【解决方案2】:

    对于任何交互式用户,服务在不同的窗口站和桌面上运行。即使表单加载成功,也没有人可以看到它。

    您可以设置“允许服务与桌面交互”服务选项,允许服务共享控制台的窗口站。然而,这是一个非常糟糕的主意。它打开了安全漏洞和许多其他问题。例如。如果有多个用户登录会怎样?或者,如果您正在运行终端服务?

    更传统的设计是让客户端应用程序处理 UI 并与在后台运行的服务对话。

    【讨论】:

      【解决方案3】:

      GUI 需要单线程单元线程模型。表单需要一个消息泵(就像Application.Run 启动的那个)。

      服务绝对不是为显示 GUI 而设计的(即使是交互式服务也被认为是不好的做法),不过,它可以通过 GUI 进行控制。

      【讨论】:

        【解决方案4】:

        对于显示窗口的服务,必须将其标记为“允许与桌面交互”。这可以由服务安装程序或在该服务的属性页上完成。

        但这还不足以让窗口可靠地显示。在实践中,您必须确定当前是否有用户登录并获取他们的桌面。这不是一件小事,而且可能是安全问题的根源。如果当前没有人登录,那你就倒霉了。

        最好的解决方案是拥有一个单独的 GUI 应用程序,它通过某种 IPC 机制与服务对话。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-07
          相关资源
          最近更新 更多