如何在Windows服务中做事?

时间:2010-03-18 17:38:59

标签: c# windows-services

我有一个应用程序,由我在C#.net 2.0中编写 - 当应用程序打开时,计时器将每3秒检查一次x。如果x发生,它会以窗体形式显示警告。

是否有可能在Windows服务中安装此计时器和Windows窗体调用?因此,每次系统启动时计时器都会打勾并显示消息吗?

4 个答案:

答案 0 :(得分:3)

  1. 不,服务显示表单是不可能的。这是按设计,因为服务应该在没有用户界面的情况下运行
  2. 您可以拥有一个与您的服务进行通信的常规应用程序并显示警告,但我不知道这是如何完成的。
  3. IMO,您不需要服务,只需创建一个没有在后台运行的主表单的常规应用程序,执行检查,并在必要时显示警告。您可以将该应用程序添加到RunHKLM的{​​{1}}部分,以便在用户登录系统时始终启动它。

答案 1 :(得分:2)

无法从Windows服务显示Windows窗体。服务仅在后台运行。

您可以拥有一个与Windows服务通信的单独Windows应用程序,并显示警告,信息等。

为此,该服务在LocalSystem帐户上运行,您必须启用该服务的属性才能与桌面交互。

答案 2 :(得分:0)

禁止服务与桌面交互,包括显示窗口或表单。在Windows 2003和XP中,您可以通过将服务标记为“交互式”来解决此问题,这将允许服务在用户会话上显示,但从Windows 2008和Vista开始,这将被强制执行,服务无法以任何方式进行交互与用户。

当服务需要显示任何内容时,解决方案是将逻辑拆分为两个独立的进程,一个是服务,另一个是普通用户进程。用户进程在其会话中启动(它可以在会话启动时自动启动),并通过某个IPC通道(共享内存,命名管道,套接字等)连接到服务。然后,该服务可以通过询问用户进程的一半来显示它需要显示的内容,从而向用户显示它想要的任何内容。

答案 3 :(得分:0)

正如其他人所说,请记住,Windows服务应该是一个背景,永远不会与用户程序进行交互。许多服务即使在用户未登录时也会运行 - 当没有桌面显示表单时,他们将如何显示表单?

那就是说,这听起来像是在试图将某些东西塞进一项不属于服务的服务中。如果您想要在后台运行并仍然与用户交互的内容,请考虑制作轻量级系统试用应用程序。事实上......这是一个有用的教程:

Lightweight System Tray Application (NotifyIcon Based)