【问题标题】:Windows Service with GUI monitor?带有 GUI 监视器的 Windows 服务?
【发布时间】:2011-03-10 17:10:01
【问题描述】:

我有一个 C++ Win32 应用程序,它是作为 Windows GUI 项目编写的,现在我正试图将它变成一个服务/GUI 混合体。我了解 Windows 服务不能/不应该有用户界面。但请允许我解释一下我目前拥有的东西以及我的目标。

我现在拥有的 是一个 Windows 应用程序。当它运行时,它会在系统托盘中放置一个图标,您可以双击该图标来打开 GUI。此应用程序的目的是每晚处理位于指定目录中的文件。 GUI 由以下部分组成:

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

我的目标是一项将在启动时运行且无需用户登录的服务。这将包括预定的文件处理。但是,当用户登录时,我仍然希望加载托盘图标并允许他们打开我上面描述的 GUI 以监视服务的当前状态、更改设置、手动启动扫描并监视进度扫描。

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

我在想,与其让一个多线程应用程序从处理线程向 GUI 线程发送消息,我需要两个应用程序——一个服务来执行处理,一个 GUI 应用程序来提供来自服务并向服务发送消息(例如,手动启动扫描)。但我是 Windows 服务的新手,不知道这是如何完成的。

也有可能我完全不在基地,服务根本不是我想要的。

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

【问题讨论】:

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


    【解决方案1】:

    你不能把它当作服务来做。

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

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

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

    【讨论】:

    • 感谢您的回复。我从未处理过 IPC,但您的链接看起来会很有帮助。我会看看我学到了什么。
    • +1。另请参阅下面的答案,了解有关将应用程序转换为服务的一些提示:stackoverflow.com/questions/1554047/…
    • 您可以使用配对的 UI 和服务(两个独立的实体)来完成此操作。该服务公开一个 COM 对象或 RPC 服务器,并且 UI 连接到 COM 对象/RPC 服务器来完成工作。
    【解决方案2】:

    有一种简单的方法。

    您不能让服务访问任何用户的会话(会话 1、2、3..),因为服务是隔离的并且只能访问会话 0。这是与 2011 年相比的变化。

    你应该为每个使用https://msdn.microsoft.com/en-us/library/windows/desktop/ms682429(v=vs.85).aspx登录的用户编写一个由你的服务启动的win32程序

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      相关资源
      最近更新 更多