Windows services 为什么窗体在Windows服务中失败

Windows services 为什么窗体在Windows服务中失败,windows-services,Windows Services,我知道Window的服务没有桌面,不能直接访问用户的任何桌面(事实上,它们可以在没有加载桌面的情况下运行)。为什么在窗口服务中启动表单会导致错误 因为如果没有人会看到表单,也没有人会拒绝它-运行模式对话框是一个挂起的秘诀-所以您希望它在发生这种情况时大声抱怨,而不是静静地坐在那里,直到您终止进程(或查看堆栈跟踪以确定发生了什么)。(另一个明显的问题是,如果存在不止一种可能性,谁来选择DialogResult?)您想知道这是什么时候发生的。(如果对话框不能显示任何内容,则断言对话框不会抛出,这是一

我知道Window的服务没有桌面,不能直接访问用户的任何桌面(事实上,它们可以在没有加载桌面的情况下运行)。为什么在窗口服务中启动表单会导致错误

因为如果没有人会看到表单,也没有人会拒绝它-运行模式对话框是一个挂起的秘诀-所以您希望它在发生这种情况时大声抱怨,而不是静静地坐在那里,直到您终止进程(或查看堆栈跟踪以确定发生了什么)。(另一个明显的问题是,如果存在不止一种可能性,谁来选择DialogResult?)您想知道这是什么时候发生的。(如果对话框不能显示任何内容,则断言对话框不会抛出,这是一种让人发疯的有趣方式。)

换句话说,因为您想知道什么时候代码中的事情变得足够混乱,以至于在服务上下文中显示了一个对话框

(我假设您正在.NET上使用Windows窗体,尽管您没有这样标记它)


(如果您正确地配置了服务,允许该服务与桌面交互,则不会出现异常)

嗯。。。这个表单将出现在什么桌面上,以及谁的桌面上?“桌面”是一种操作系统概念:每个窗口句柄都由属于单个(交互)用户的窗口站中的特定桌面拥有。服务正在执行的进程在其窗口站中找不到用户的可见桌面。对于一个相当枯燥的参考,请看


其实。您可以为服务配置权限,使其能够创建桌面,但是没有人会看到它!或者,您可以授予进程切换桌面的权限,并将用户搞糊涂

服务应该在没有任何用户交互的情况下运行,因此不需要表单。如果服务必须等待用户反馈,那么它可能不会做它应该做的事情。

因为在操作系统需要绘制窗口时,没有任何东西可以绘制表单。

您必须了解三个相关概念:会话、windows工作站和桌面。但是,由于会话和电台之间存在一对一的关系,我们可以在讨论中广泛忽略电台。会话包含一个工作站(winSta0是唯一的交互式工作站),工作站包含一个或多个桌面


现在,会话体系结构因Windows版本而异。对于NT,您必须启用一个设置,以允许Windows服务直接访问某些文件夹(如桌面)或显示表单(包括MessageBox弹出窗口):“允许服务与桌面交互”

要查看此内容,请右键单击我的计算机=>Manage=>Services和Applications=>Services。双击服务以访问其属性。在“登录”选项卡上,有一个用于此设置的复选框

一篇关于如何在C中以编程方式设置它的文章#


[编辑]正如Stephen Martin在评论中指出的那样:这是仅对Vista之前版本的Windows有效的建议。

当Windows服务启动时,它会根据有据可查的规则分配给窗口站和桌面,尽管有些模糊。正如其他地方提到的,它没有分配给交互式桌面(除非它被设置为在Vista之前的操作系统上与桌面交互),但它肯定在桌面上运行

服务不能使用UI元素是一种常见的误解。事实上,许多服务(如SQL Server)过去都使用隐藏窗口和windows消息进行线程同步和工作分配。没有理由不能在服务中显示表单。如果您遇到错误,这是由于您对表单或表单上的某个组件所做的操作造成的。最有可能的问题与表单是否需要STA线程有关,或者是否为表单创建消息泵或类似的东西


虽然您当然可以在Windows服务中使用表单,但您几乎肯定不应该这样做。将出现线程问题、跨单元调用问题、可能的阻塞UI问题等。在少数情况下,在服务中使用窗口是一个不错的选择,但在99.99%的情况下,没有UI的情况下,有更好的方法。

它将出现在创建它的线程的桌面上。基于Windows NT的操作系统中的所有线程都与桌面关联。好的,对,但为非交互式窗口站。纠正。更正。即使没有交互用户,也可以通过编程方式与表单交互。从未想过这一点-非常好的一点![总的来说,我试图理解当前的impl是一个很好的服务默认值这一点。(这是第一个答案,如果其他的在我写的时候已经提交了,我会写一个不同的答案)]我的想法主要是基于旧的服务:数据允许服务与桌面设置交互与文件夹访问无关,它不再适用于Vista和更高版本的操作系统,并且存在严重的安全风险,在Vista之前的任何操作系统中都不应使用。这很公平。但“Vista之前的任何操作系统”都有点误导。截至今天(2009年3月23日),这意味着只有Vista或Windows7的测试版。一、 我认识的大多数人仍然使用XP,所以我仍然认为这是一个非常有效的建议。我将更新我的帖子,让它更清楚。重点是,尽管你可以在XP和W2K3中使用它,但微软和几乎所有了解服务的人都建议不要使用此设置已有10多年了。此设置是为调试目的引入的,不应在现场使用。