我试图在Vista上使用服务显示一个表单(使用.NET winforms)
显然,表单不会显示给控制台用户,因为服务在会话0中被隔离。
然而,实验是看是否有可能“显示”一个不可见的形式并获得一个窗口句柄&消息循环
我试过但是当我发出form.Show()时,只有form.Load事件不会触发.Shown或.FormClosing
有没有办法像用户应用程序那样以这种方式捕获Windows消息?
我没有尝试让服务“互动”,因为我不希望与登录用户互动。
答案 0 :(得分:0)
是的,您可以在服务的桌面上显示表单。它不会显示给任何登录用户,实际上在Vista和更高版本的操作系统中,即使将服务设置为“交互式”,也无法向用户显示。由于桌面不是交互式的,因此窗体收到的窗口消息会略有不同,但绝大多数事件应该在服务中触发,就像它们在交互式桌面上一样(我只是做了快速测试并得到了表单)加载,显示,激活和关闭事件)。
要记住的一件事是,为了显示表单,您的线程必须是STA线程,并且必须通过调用ShowDialog或Applicaton.Run来创建消息循环。此外,请记住,需要使用表单实例上的Invoke或BeginInvoke将与表单的所有外部交互封送到正确的线程。
这当然非常可行,但实际上根本不推荐。您必须绝对确保在任何情况下,表单及其包含的任何组件都不会显示任何意外的UI,例如消息框。唯一一次这种方法可以证明是合理的,当你使用可疑质量遗产或第三方工具时,需要创建句柄才能正常运行。