C# 带有ServiceNotification选项的服务

C# 带有ServiceNotification选项的服务,c#,.net-4.0,windows-services,messagebox,C#,.net 4.0,Windows Services,Messagebox,在Windows Vista及更高版本中,服务无法再访问GUI。但是,在编写了一个简单的机制将消息从我的服务传递到helper GUI应用程序之后,我发现System.Windows.Forms.MessageBox.Show,其中“MessageBoxOptions”参数引起了我的注意: public static DialogResult Show( string text, string caption, MessageBoxButtons buttons,

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

public static DialogResult Show(
    string text,
    string caption,
    MessageBoxButtons buttons,
    MessageBoxIcon icon,
    MessageBoxDefaultButton defaultButton,
    MessageBoxOptions options
)
更仔细地查看枚举,其中一个有效选项是
MessageBoxOptions.ServiceNotification
,其中说明:

消息框显示在active desktop上。打电话的人是一个 通知用户事件的服务。该函数显示一个 当前active desktop上的消息框,即使没有用户 登录到计算机


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

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


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

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

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

从Windows Vista及以上版本开始,无法看到Windows服务生成的用户界面。甚至最糟糕的是,您的服务可能会被卡住,等待用户无法提供的某些用户输入,因为用户看不到任何东西


要在windows服务中显示MessageBox,您需要发送消息。它将显示在对话框中。

从Windows Vista及以上版本开始,无法看到Windows服务生成的用户界面。甚至最糟糕的是,您的服务可能会被卡住,等待用户无法提供的某些用户输入,因为用户看不到任何东西



要在windows服务中显示MessageBox,您需要发送消息。它将在对话框中显示。

只有在您启动“交互式服务检测”服务时,您的服务才能使用show方法显示消息框。要启动此服务,请在“运行”窗口中键入“services.msc”。

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

为什么要在服务中使用messagebox?我们希望最终用户在发生某些致命异常时了解这些异常,因此,他们不必深入查看日志文件。为什么您甚至希望在服务中使用messagebox?我们希望最终用户在发生某些致命异常时了解这些异常,这样他们就不必深入查看日志文件。如果我将对messagebox.Show()的调用抛出到另一个只运行该调用的线程中,然后它不会阻塞主线程。我们只想为一些关键消息显示一条消息,这些消息源于可能导致服务崩溃的操作或阻止服务启动的问题。此外,我刚刚测试了这一点,它似乎在Windows 7上不起作用。如果我将对MessageBox.Show()的调用抛出到另一个只运行该调用的线程中,然后它不会阻塞主线程。我们只想显示一条关键消息,这些消息源于可能导致服务崩溃或阻止服务启动的问题的操作。此外,我刚刚测试了这一点,它似乎在Windows 7上不起作用。对XP执行“net send”或对Vista/Windows 7执行“msg”怎么样?这些不是阻塞命令,可以很容易地用来通知所有用户服务有问题。尽管我讨厌在代码中使用终端命令…谢谢你的回答。我尝试使用WTSSendMessage,但如果服务运行在一个可能有多人登录的服务器上,这不是一个理想的方案。我最终只是使用了我的助手,因为它已经完成了。对XP执行“net send”或对Vista/Windows7执行“msg”怎么样?这些不是阻塞命令,可以很容易地用来通知所有用户服务有问题。尽管我讨厌在代码中使用终端命令…谢谢你的回答。我尝试使用WTSSendMessage,但如果服务运行在一个可能有多人登录的服务器上,这不是一个理想的方案。我最终只是使用了我的助手,因为它已经完成了。