是否有程序化的方式来检测过程是否可以与桌面交互

我有一个可以正常运行或作为服务的可执行文件。 在启动时,如果有错误(使用MessageBox API),它可能会显示错误消息。 如果应用程序作为服务运行,但不允许与桌面进行交互,这可能会导致失败。该进程可能会挂起。 是否有编程方式来检测应用程序是否可以与桌面交互? 然后我可以使用其他错误通知机制(日志文件等)

来自MSDN :

要确定服务是否作为交互式服务运行,请调用GetProcessWindowStation函数来检索窗口工作站的句柄,并使用GetUserObjectInformation函数来测试窗口工作站是否具有WSF_VISIBLE属性。

在.NET中,您可以使用Environment.UserInteractive

UserInteractive属性为Windows进程或像没有用户界面运行的IIS这样的服务报告false。 如果此属性为false,则不显示模式对话框或消息框,因为没有供用户交互的图形用户界面。

调用MessageBox() ,您可以指定MB_SERVICE_NOTIFICATION ,它将在当前活动的会话中显示消息。

但是 ,从服务中显示消息框并不是你真正想要的。

服务应该在后台运行,而不是直接与用户交互。 他们的特点之一是,即使没有用户登录,他们也可以(甚至经常)运行。 在Windows Vista中,他们甚至运行在完全不同于其他用户的会话中。 显示MessageBox可能会导致您的服务被阻止,因为该消息是在您的服务自己的会话中调用的,而用户不知道该消息。

写一些日志文件或使用Windows的EventLog是首选的方法。

http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx :

要确定服务是否作为交互式服务运行,请调用GetProcessWindowStation函数来检索窗口工作站的句柄,并使用GetUserObjectInformation函数来测试窗口工作站是否具有WSF_VISIBLE属性。