Windows服务 + 在系统托盘中运行应用程序

5
我有一个 Delphi 应用程序在服务器上运行。此应用程序与我的数据库进行一些关键性的工作,该数据库在其他应用程序中使用,并且在用户登录 Windows 时执行。一切都很正常,但事实证明,服务器管理员有时会重新启动服务器并且不会登录 Windows。服务器停留在 Windows 登录界面,我的应用程序就没有启动。
经过一番小小的调查,我决定创建一个 Windows 服务,以便在用户登录 Windows 之前即可启动我的应用程序。但是,我有两个窗体。一个窗体显示当前正在执行的应用程序进程,另一个窗体编辑一个用于配置第一个窗体的 .ini 文件。
我需要做的是创建一个服务,在用户登录 Windows 之前启动我的应用程序,在登录后,显示或打开我的窗体,但将其最小化到系统托盘中。是否可能使用具有此行为的 Windows 服务,并将我的窗体最小化到系统托盘中?

1
最终,你将会按照这个问题中的建议,将GUI与数据库工作分离,并相互交互。 - Sertac Akyuz
2个回答

16

从Vista开始,服务不能显示任何UI(包括系统托盘图标),在早期版本中也不鼓励这样做。在所有版本的Windows中,您应该将UI分离到自己的非服务应用程序中,该应用程序可以由登录用户运行,管理该用户托盘中的系统托盘图标,并根据需要使用任何可用的IPC机制(管道、套接字、COM、RPC、WCF等)与后端服务通信。


1
好建议!请参阅Windows Services FAQ中的“Windows服务是否应该有GUI?”了解更多相关信息。链接 - CoreTech
我已经知道服务中不能使用UI了,我只是想确认一下。我将我的应用程序拆分成两个应用程序:一个作为服务,另一个作为一个具有表单的简单配置程序。在Windows中,有没有任何特定的配置使得服务可以在用户登录之前启动?感谢回答,这将对我很有帮助。 - Daniel
假设您正在使用Delphi的TService类,它的StartType属性控制服务启动的时间。默认情况下,它设置为stAuto,这意味着服务将在操作系统启动时自动启动。 - Remy Lebeau
我解决了这个问题。有一个服务在后台执行繁重的工作,还有一个简单的可视化应用程序来配置服务中使用的文件。感谢大家的帮助。 - Daniel

1

你可以在一个服务中添加表单,但是它必须以管理员身份运行,并且必须被设置为交互式服务。

我使用SVCOM创建了具有托盘图标的漂亮服务和可以最小化到系统托盘的表单。

请点击此处查看:http://www.aldyn.ru/products/index.html

希望这能帮到你。


1
SvCom看起来是一个很方便的工具,但从技术上讲,它不能直接在Windows服务应用程序里使用一个窗体。它仍然会生成两个独立的应用程序并将它们集成在一起。你可以调整你的回答来提到这样的工具可以帮助实现这种连接,而不是说某事是可能的,而实际上并不是(用新技术)。 - Jerry Dodge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接