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