2010-07-01 62 views
4

我有一个C++ Win32应用程序被编写为一个Windows GUI项目,现在我试图找出它成为一个服务/ GUI混合。我知道一个Windows服务不能/不应该有一个用户界面。但请允许我解释我到目前为止以及我所拍摄的内容。Windows服务与GUI监视器?

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

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

就是我拍摄的是将在系统启动时运行,而不需要用户登录的服务。这将由计划的文件处理组成。但是,当用户登录时,我仍然希望加载托盘图标,并允许他们打开一个GUI,如上所述监视服务的当前状态,更改设置,手动启动扫描并监视进度扫描。

我敢肯定,我已经看到了这样的应用程序 - 这功能,即使我没有登录服务,但还是给我一个用户界面,一次我登录到工作

我在想,不是让一个多线程应用程序从处理线程向GUI线程发送消息,而是需要两个应用程序 - 一个执行处理的服务和一个GUI应用程序,以提供服务的可视反馈,还有将消息发送到服务(例如,手动启动扫描)。但我是Windows服务新手,不知道如何完成这项工作。

这也可能是我完全脱离基地和服务不是我所期待的。

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

回答

5

你不能这样做的服务。

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

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

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

+0

谢谢你的回应。我从来没有处理IPC,但你的链接看起来会非常有帮助。我会看到我学到的东西。 – 2010-07-01 15:50:55

+0

+1。另请参阅下面的答案,了解如何设置将应用程序转换为服务的一些提示:http://stackoverflow.com/questions/1554047/convert-ac-program-to-a-windows-service/1554405#1554405 – 2010-07-01 15:51:59

+0

您可以通过配对的用户界面和服务(两个独立的实体)来实现。该服务公开COM对象或RPC服务器,并且UI连接到COM对象/ RPC服务器以完成工作。 – 2010-07-02 04:08:10

0

有一个简单的方法。

您不能让服务访问任何用户的会话(会话1,2,3 ..),因为服务是孤立的,只能访问会话0。这是自2011年

改变你应该写于每谁在使用https://msdn.microsoft.com/en-us/library/windows/desktop/ms682429(v=vs.85).aspx

该服务可以继续执行,是不是特定于用户的任何任务记录每个用户的服务启动一个Win32程序。