Service Vista服务:可以在不可见的桌面上显示表单吗?

Service Vista服务:可以在不可见的桌面上显示表单吗?,service,windows-vista,shutdown,Service,Windows Vista,Shutdown,我试图在Vista上显示服务中的表单(使用.NET winforms) 显然,该表单不会显示给控制台用户,因为服务在会话0中是隔离的 然而,这个实验是为了看看是否有可能“显示”一个不可见的表单并获得一个窗口句柄&消息循环 我已经尝试过了,但是当我发出form.Show()时,只有form.Load事件激发not.Show或.FormClosing 是否有任何方法可以像用户应用程序那样以这种方式捕获windows消息 我没有尝试使服务“交互”,因为我不希望与登录用户交互。是的,您可以在服务桌面上显

我试图在Vista上显示服务中的表单(使用.NET winforms)

显然,该表单不会显示给控制台用户,因为服务在会话0中是隔离的

然而,这个实验是为了看看是否有可能“显示”一个不可见的表单并获得一个窗口句柄&消息循环

我已经尝试过了,但是当我发出form.Show()时,只有form.Load事件激发not.Show或.FormClosing

是否有任何方法可以像用户应用程序那样以这种方式捕获windows消息


我没有尝试使服务“交互”,因为我不希望与登录用户交互。

是的,您可以在服务桌面上显示表单。它不会向任何登录用户显示,事实上,在Vista和更高版本的操作系统中,即使您将服务设置为“交互式”,也无法向用户显示它。由于桌面不是交互式的,窗体接收的windows消息将略有不同,但绝大多数事件在服务中的触发方式应与在交互式桌面上的触发方式相同(我刚刚做了一个快速测试,得到了窗体加载、显示、激活和关闭事件)

要记住的一点是,为了显示表单,您的线程必须是STA线程,并且必须通过调用ShowDialog或Applicaton.Run创建消息循环。另外,请记住,所有与表单的外部交互都需要在表单实例上使用Invoke或BeginInvoke封送到正确的线程


这当然是可行的,但实际上根本不建议这样做。您必须绝对确保表单及其包含的任何组件在任何情况下都不会显示任何意外的UI,例如消息框。只有当您使用质量可疑的遗留工具或第三方工具时,才能真正证明此方法的合理性。

非常感谢。你是怎么开始考试的?我尝试了ShowDialog(),但得到了>>“System.InvalidOperationException”,当应用程序未在UserInteractive模式下运行时,显示模式对话框或窗体不是有效的操作。指定ServiceNotification或DefaultDesktopOnly样式以显示来自服务应用程序的通知。我使用了应用程序。在我的测试中运行,效果很好。ShowDialog过去工作正常,但显然他们在2.0框架中添加了一个复选框来禁止它。就个人而言,我认为取消关闭服务不是一个好主意,但如果你真的想这样做,它应该会起作用。只需调用Application.Run(myFormInstance)而不是myFormInstance.ShowDialog。