Vista服务:可以在隐形桌面上显示表格吗?
Posted
技术标签:
【中文标题】Vista服务:可以在隐形桌面上显示表格吗?【英文标题】:Vista services: Can show form on invisible desktop? 【发布时间】:2009-10-28 17:22:13 【问题描述】:我正在尝试在 Vista 上显示来自服务的表单(使用 .NET winforms)
显然表单不会显示给控制台用户,因为服务在会话 0 中被隔离。
不过实验是看是否有可能“显示”一个不可见的窗体并获得一个窗口句柄和消息循环
我试过了,但是当我发出 form.Show() 时,只有 form.Load 事件不会触发 .Shown 或 .FormClosing
有没有办法像用户应用程序那样以这种方式捕获 Windows 消息?
我没有尝试让服务“互动”,因为我不希望与登录用户互动。
【问题讨论】:
【参考方案1】:是的,您可以在服务的桌面上显示表单。它不会显示给任何登录的用户,事实上,在 Vista 和更高版本的操作系统中,即使您将服务设置为“交互式”,您也无法向用户显示它。由于桌面不是交互式的,表单接收到的 windows 消息会略有不同,但绝大多数事件应该在服务中触发,就像在交互式桌面上一样(我只是做了一个快速测试并得到了表单加载、显示、激活和关闭事件)。
要记住的一点是,为了显示表单,您的线程必须是 STA 线程,并且必须通过调用 ShowDialog 或 Applicaton.Run 创建消息循环。另外,请记住,与表单的所有外部交互都需要在表单实例上使用 Invoke 或 BeginInvoke 编组到正确的线程。
这当然非常可行,但根本不推荐。您必须绝对确保表单及其包含的任何组件在任何情况下都不会显示任何意外的 UI,例如消息框。只有当您使用质量有问题的遗留工具或需要创建句柄才能正常运行的第 3 方工具时,才能真正证明这种方法是合理的。
【讨论】:
非常感谢。您是如何在测试中开始填写表格的?我尝试了 ShowDialog() 但得到 >> 'System.InvalidOperationException' 当应用程序未在 UserInteractive 模式下运行时显示模式对话框或表单不是有效操作。指定 ServiceNotification 或 DefaultDesktopOnly 样式以显示来自服务应用程序的通知。 我在测试中使用了 Application.Run 并且效果很好。 ShowDialog 过去可以正常工作,但显然他们在 2.0 框架中添加了一个检查以禁止它。就个人而言,我认为从服务中取消关闭不是一个好主意,但如果你真的想这样做,它应该可以工作。只需调用 Application.Run(myFormInstance) 而不是 myFormInstance.ShowDialog。以上是关于Vista服务:可以在隐形桌面上显示表格吗?的主要内容,如果未能解决你的问题,请参考以下文章
过分了,别人用来做桌面应用开发,这家伙却用来撩妹-不正经的隐形弹窗
过分了,别人用来做桌面应用开发,这家伙却用来撩妹-不正经的隐形弹窗