是否有一种编程方式来检测进程是否可以与桌面交互

时间:2011-09-13 05:10:28

标签: windows winapi service

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

3 个答案:

答案 0 :(得分:2)

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

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

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

写入某种日志文件或使用Windows的EventLog是首选方法。

答案 1 :(得分:1)

来自MSDN

  

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

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

  

对于Windows进程或a,UserInteractive属性报告为false   IIS之类的服务,无需用户界面即可运行。如果这个属性   是假的,不要显示模态对话框或消息框,因为那里   没有用户与之交互的图形用户界面。

答案 2 :(得分:1)

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

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