带GUI监控的Windows服务?

时间:2010-07-01 15:38:03

标签: c++ windows user-interface winapi service

我有一个C ++ Win32应用程序,它是作为Windows GUI项目编写的,现在我正在试图将其变成一个服务/ GUI混合。我知道Windows服务不能/不应该有用户界面。但请允许我解释一下到目前为止我所拥有的内容以及我正在拍摄的内容。

我现在有什么是一个Windows应用程序。运行时,它会在系统托盘中放置一个图标,您可以双击该图标以打开GUI。此应用程序的目的是按夜间计划处理位于指定目录中的文件。 GUI包含以下内容:

  • 用于手动启动计划外扫描/处理的按钮。
  • 用于打开用于修改设置的对话框的按钮。
  • 用于显示处理线程发送的状态消息的列表框。
  • 用于显示图像数据的自定义绘制窗口(文件处理包括创建和保存图像)。
  • 状态栏 - 当进程未运行时,它会显示下一个计划扫描的倒计时。在扫描期间,它还提供一些状态反馈,包括进度条。

我正在拍摄的内容是一种在启动时运行但不需要用户登录的服务。这将包括计划的文件处理。但是,当用户登录时,我仍然希望加载托盘图标,并允许他们打开如上所述的GUI,以监控服务的当前状态,更改设置,手动启动扫描以及监控进度扫描。

我确信我已经看过这样的应用程序 - 即使我没有登录也可以作为服务运行,但是在我登录后仍然可以给我一个用户界面。

我在想,不是只有一个多线程应用程序从处理线程向GUI线程发送消息,我需要两个应用程序 - 一个执行处理的服务和一个GUI应用程序来提供来自处理线程的视觉反馈服务并向服务发送消息(例如,手动启动扫描)。但我是Windows服务的新手,并不知道如何做到这一点。

我也可能完全脱离基础而且服务不是我正在寻找的。

任何帮助/想法/建议将不胜感激!谢谢。

2 个答案:

答案 0 :(得分:6)

您不能将此作为服务。

您需要将Windows服务作为普通服务应用程序。这将在系统启动时启动,并在系统启动的整个时间内运行。

然后,您将创建一个完全独立的GUI应用程序,该应用程序与服务“对话”。这可以设置为在用户登录时在用户帐户中运行。

为了让它们彼此“交谈”,您需要使用某种形式的IPC。由于它们在同一系统上运行(但通常在不同的帐户中),因此命名管道或套接字都能很好地工作。

答案 1 :(得分:1)

有一种简单的方法。

您无法让服务访问任何用户的会话(会话1,2,3 ..),因为服务是隔离的,只能访问会话0。这是2011年的变化。

您应该为每位使用https://msdn.microsoft.com/en-us/library/windows/desktop/ms682429(v=vs.85).aspx

登录的用户编写一个由您的服务启动的win32程序

该服务可以继续执行任何非特定于用户的任务。