1

在 Windows Vista 及更高版本中,服务无法再访问 GUI。然而,在编写了一个将消息从我的服务传递到辅助 GUI 应用程序的简单机制之后,我发现了以下重载 for System.Windows.Forms.MessageBox.Show,其中“MessageBoxOptions”参数引起了我的注意:

public static DialogResult Show(
    string text,
    string caption,
    MessageBoxButtons buttons,
    MessageBoxIcon icon,
    MessageBoxDefaultButton defaultButton,
    MessageBoxOptions options
)

更仔细地查看枚举,其中一个有效选项是MessageBoxOptions.ServiceNotification,它在MSDN上指出:

消息框显示在活动桌面上。调用者是通知用户事件的服务。即使没有用户登录到计算机,该功能也会在当前活动桌面上显示一个消息框。

这是否意味着通过传递MessageBox.Show()此选项的方法,我的服务实际上可以处理显示来自服务的简单消息,而无需在 Vista、Windows 7 及更高版本中使用帮助应用程序?

4

3 回答 3

2

MESSAGEBOXOPTIONS ENUM DEMYSTIFIED - 适用于 XP

从 Windows Vista 及更高版本开始,无法看到由 Windows 服务生成的用户界面。更糟糕的是,您的服务可能会卡在等待用户无法提供的某些用户输入,因为她看不到任何内容

这里


要在 Windows 服务中显示 MessageBox,您需要发送 WTSSendMessage消息。它将在Session 0 特殊桌面中显示 DialogBox 。

于 2013-01-11T15:01:42.523 回答
1

是的,你的提议会奏效,但你真的想这样做吗?请记住,默认情况下 MessageBox.Show() 是一个阻塞操作。通常,让服务等待 UI 操作是一种非常糟糕的做法。

你的问题的答案是:“是的,但请不要。”

于 2013-01-11T15:00:34.283 回答
1

仅当您已启动“交互式服务检测”服务时,您的服务才能使用 Show 方法显示 MessageBox。要启动此服务,请在“运行”窗口中键入“services.msc”。

于 2015-03-26T10:45:53.657 回答