windows - 在 Windows 服务中,Windows 调用是否允许( 创建可见的Windows,等等 )?

  显示原文与译文双语对照的内容
0 0

首先,我知道一些正确的方法来实现真正的交互式服务。

事实上,我有一个工具不能与用户进行交互,如。 不过,它通过弹出式 Windows 和通过 Windows 通知区域( 又名系统托盘) 来显示 notifications 。 它还将写入所显示通知的日志文件。

这里工具通常由主用户应用程序产生,只要主应用程序是普通应用程序,这些通知就像预期的那样工作。

当 Windows 服务生成这里工具时,不会显示任何通知,自然。 ( 服务的桌面会话不可以见) 但这将是可以行的,我们有日志文件,这些通知只能在所有情况下。

现在的问题是:是在服务 ( 服务本身或者它所启动的任何进程)的上下文中运行的过程,"允许"调用来显示可视的GUI 。

当然,调用 :: messagebox 是一个坏主意,因为它会阻止。 但我可以处理这些电话。

是的,这可以能是更好的设计,但是当我不能把整个工具拆开以确保没有GUI相关的代码。

时间: 原作者:

0 0

来自 Windows 服务的GUI元素在会话 0中显示。 用户可以使用 Windows XP & 2003登录到会话 0,并正常与服务创建交互,但微软在 Vista ( 等等) 中使用隔离会话 0的功能将刀片置于交互服务的中心。

要回答你的特定问题:

是运行在服务( 服务本身或者它所启动的任何进程)"that"上下文中的进程,使 Windows API调用显示可以见的GUI? 大多数 Windows API调用( 比如 。 使用 Shell_NotifyIcon 。等等 创建和显示窗口在服务的不可见会话中行为相同?

是,允许使用调用,并且应该在正常情况下成功。 我知道的唯一的异常是那些与托盘图标相关的,因为提供任务栏( explorer.exe )的过程没有在独立会话 0中运行。

或者我必须确保在源代码中,没有在服务上下文中调用GUI显示/修改内容。

虽然你应该谨慎地从服务服务器进行任何GUI交互,但这不应该是必需的。 彻底测试 !

0 0

我想提供一些信息。 Raymonds评论对其他答案的回答。

你应该避免在服务中呈现 UI,因为你可以能会触发将用户临时使用的UI检测服务。 - –

我找到了这些好文章:

用户可以在其中找到关于 UI检测服务的解释,以及它的工作原理和工作方式。

交互式服务检测( 任务栏上的闪烁按钮) 对于遗留应用程序是否正在试图与桌面交互的消息是一个缓解。 这是由交互式服务检测( UI0Detect ) 服务处理的。

,必须注意,只有尝试查看GUI的服务才会工作,因为只有的服务进程才会在 Session0 上运行,甚至允许显示任何内容。

Alex Ionescu提到了这一点:

如果 UI0Detect.exe 。配置管理器在窗口钩子DLL的请求下启动了它。 服务将继续。 服务首先进行一些验证以确保它在正确的WinSta0Default WindowStation和桌面上运行,然后通知SCM成功或者失败。

因此,回到raymond的评论: 只要你不勾 type= interact 选项,通常你不会做任何事情,服务不会做任何事情,而且不应该有任何触发它的"危险"。


注:上信息仅基于单个 Windows 7 PC的有限研究和测试。

原作者:
...