从Windows服务中显示消息框

19

你能否在Windows服务中显示消息框(或任何形式的通知)?我尝试过但无法实现。我使用了以下代码:

            global::System.Windows.Forms.MessageBox.Show("A fatal error occurred. " +
                ServiceName + " is now terminating.");

但是它没有起作用,只是产生了一个错误。


告诉错误是什么以及你检查了哪些可能的原因是一个好的实践,例如:你是否添加了对 System.Windows.Forms 的引用? - SNBS
7个回答

22

不可以在服务中显示消息框。如果您想要报告错误,标准做法是使用事件日志

对于更高级的UI(不仅限于错误报告),通常的做法是创建一个普通的Windows应用程序,将其放置在用户的启动文件夹中(或者注册表的Run键),并通过某种IPC机制(.NET remoting、WCF、常规套接字、命名管道等)与服务进行通信。


哦...我希望有一个通用的异常处理程序,当服务出现错误时通知用户。在某些情况下,它会默默地崩溃,用户不会意识到服务已经崩溃了。 - Jonn
我在调试时经常使用消息框。这是一种快速简便的方式,可以找出可能发生的问题。但在发布版本中绝不要使用消息框!建议在构建发布版本时始终使用事件日志!为了进行调试,只需将System.Windows.Forms引用添加到您的项目中即可使用消息框。 - Arvo Bowen
我想告知用户我无法进行事件记录。但唯一的方法是通过记录事件吗?这很尴尬。 - user922020

21

0

来自维基百科

虽然通常服务没有用户界面,但开发人员可以添加表单和其他UI组件。在这种情况下,在服务属性对话框的登录选项卡中应该勾选“允许服务与桌面交互”(尽管应该注意这种方法可能会导致安全风险,因为任何已登录的用户都可以与服务交互)。

启用此选项后,您应该能够从服务中显示消息框。


@Jonn:我猜在代码中有一些API可以改变这个,但通常不应该依赖这个选项。 - Gart

0

允许服务与桌面交互将帮助您从Services.msc控制台执行此操作。

但是,这是一个非常糟糕的想法。特别是如果您忘记稍后删除此消息框。由于没有人能够单击该消息框,所以服务将挂起。


0

在WinXP中,服务只有一个交互式进程标志,所有的工作都很好。在10/11上不要尝试这个。


-1

操作系统:XP 启用Windows服务的交互模式

步骤

  1. 打开服务控制面板。例如:开始 > 控制面板 > 管理工具 > 服务。
  2. 选择Cast Iron Secure Connector服务。
  3. 右键单击服务名称,选择属性。将显示服务属性窗口。
  4. 选择登录选项卡。
  5. 选择本地系统帐户,然后选择允许服务与桌面交互。
  6. 单击确定。
  7. 单击重新启动。

1
这已经不起作用超过10年了。它在Windows Vista及更高版本中不受支持。 - Cody Gray

-3

不可以。Windows服务没有GUI界面。但是你可以显示一个小的系统托盘通知。


1
我认为你做不到这一点,因为它们与桌面没有交互。 - SqlRyan
1
你能给我展示一个这方面的例子吗?我还没有考虑过这种可能性。 - Jonn
@Jonn:我自己没有做过这个,但是这篇文章可能会对你有所帮助:http://msdn.microsoft.com/en-us/magazine/cc188923.aspx。使用P/Invoke与操作系统进行通信。重要的是不要直接调用任何GUI组件,因为Windows服务在设计上不能拥有GUI界面。 - Marcel

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