首先,我知道一些适当的方式进行真正的交互式Windows服务的。
的情况是,我有一个工具, 不与用户的互动等。 但是,它不会显示 无阻塞都通过弹出窗口,并通过Windows通知区域(也称为系统托盘)的通知。 它也写它显示通知的日志文件。
此工具通常由主用户应用催生了只要主要的应用是一个正常的应用程序,因为预期这些通知做的工作。
当这个工具被Windows服务催生,不显示任何通知,自然。 (该桌面会话的服务是不可见的),但是这将是美好的,我们有日志文件和这些通知都只是 - 通知,没有任何用户绝对必须在所有情况下看到的。
现在的问题就变成了: 是一个过程中的服务 (服务本身或启动任何程序) 的上下文中运行 “允许”,以使该显示可见GUI Windows API调用?
- 将大多数Windows API调用(如创建和显示一个窗口,使用Shell_NotifyIcon等)表现在服务的无形会议一样吗?
- 或者我会在整个源代码确保,没有GUI显示/修改的东西是所谓的服务的情况下?
是的,调用:: MessageBox的是一个坏主意,因为它会阻止。 但我可以处理这些电话。
是的,这可能是更好的设计,但它是我目前所面对的,如果我没有到撕碎整个工具,以确保没有图形用户界面相关的代码是在服务运行这将是很好。
从Windows服务GUI元素显示在会话0在Windows XP和2003中,用户被允许登录到会话0,通常由一个服务创建的窗口进行交互,但微软在把刀架在的互动服务的心脏Vista的(外)通过隔离会话0 。
因此,要回答你的具体问题:
是一个过程中的服务(服务本身或启动任何程序)的上下文中运行“允许”,以使该显示可见GUI Windows API调用? 将大多数Windows API调用(如创建和显示一个窗口,使用Shell_NotifyIcon等)表现在服务的无形会议一样吗?
是的,GUI调用是允许的,正常应该会成功。 唯一明显的例外,我知道的是那些因为提供的任务栏(explorer.exe的)过程中未在隔离会话0运行的托盘图标有关。
或者我会在整个源代码确保,没有GUI显示/修改的东西是所谓的服务的情况下?
这不应该是必要的,但你应该从你的服务的任何GUI交互谨慎行事 。 测试彻底!
我想提供一些信息WRT。 Raymonds陈对对方的回答评论
你应该避免在服务呈现UI,因为你可以触发UI检测服务,将用户切换到您的服务UI暂时的。 - 雷蒙德陈
我发现这些优秀的文章:
- 什么是互动服务检测和为什么我闪烁?
- 内部会话0隔离和UI检测服务, 第一部分 , 第2部分
在那里可以找到什么UI检测服务 (解释UI0Detect
)是和不和它如何工作。
交互式服务检测(任务栏上的闪烁按钮)可以检测,如果服务试图与桌面交互的遗留应用程序缓解。 这是由交互式服务检测(UI0Detect)服务处理。
然而,我们必须注意,这只能工作,如果正试图查看GUI的服务具有标志“允许服务与桌面交互”设置,因为只有这样的服务过程将在运行WinSta0
的Session0
甚至允许其显示在所有的东西。
亚历克斯·约内斯库提到了这一点:
如果UI0Detect.exe ...单片机已经在窗口挂钩DLL的要求开始了。 该服务将继续...服务第一做一些验证,以确保它在正确的运行WinSta0\Default
windowstation和桌面,然后通知成功或失败的SCM。
所以,回过头来雷蒙德的评论:据我所看到的,只要服务不打勾的type= interact
选项( 见SC.EXE ),通常你不选择这个,则UI0Detect服务没有按“吨做任何事情,不应该有任何触发它的‘危险’。
注:以上信息是根据我有限的研究,只有一个单一的Windows 7 PC上测试。
文章来源: Are Windows-GUI calls (creating visible windows, etc.) allowed in a Windows-Service?