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