【问题标题】:C# - Launch a Windows Form from a Windows Service [duplicate]C# - 从 Windows 服务启动 Windows 窗体 [重复]
【发布时间】:2018-05-14 07:45:29
【问题描述】:

我正在开发一个监视消息队列 (RabbitMQ) 的 Windows 服务。每当有消息在消息队列中排队时,Windows 服务中将触发一个事件,并启动一个 Windows 窗体应用程序,该应用程序将队列的消息作为命令行参数。

所有的编码部分都很好。在调试模式下,我已经验证了在队列中找到消息时是否触发了事件,是的,它确实触发了事件回调。但是当事件被触发时,我没有看到弹出窗口。以下是我尝试执行 windows 窗体的方式。

Process process = new Process();
process.EnableRaisingEvents = true;
process.Exited+= <exit event handler>
process.Start(new ProcessStartInfo(){
       CreateNoWindow=true,
       UseShellExecute=false,
       ErrorDialog=true,
       FileName = "<path to the .exe file of windows form>",
       WindowStyle=ProcessWindowStyle.Hidden
});
process.WaitForExit();

我什至没有看到任何错误抛出或登录 EventViewer。感谢您提供这方面的任何帮助。

【问题讨论】:

  • 作为一种规范,服务不会与桌面交互,因为它们处于 UI 不可用的级别
  • 从服务中启动进程到底有什么问题?也许只是 Windowstyle 不应该是“隐藏的”
  • @nabuchodonossor 我也试过了,但还是没有运气。我只需要从 Windows 服务启动 GUI 应用程序。
  • @praveen:我刚刚了解到,用户交互的限制包括启动程序。我认为你必须做一些技巧。也许您可以写入事件日志,如果是这样,您可以触发应用程序启动。

标签: c# winforms rabbitmq windows-services


【解决方案1】:

从 Windows Vista 开始,Windows 服务就被禁止与桌面交互。他们根本没有得到interactive session。虽然您可以在服务注册期间覆盖它,但这不是您应该认真考虑的事情。该选项可能很快就会完全消失。我什至不知道它是否仍然存在于 Windows 10 中。

他们仍然可以使用right tricks 启动交互式程序,包括子程序上的适当清单。但通信随后通过IPC。也许您也可以采用单实例方法,但现在这些方法有点过时了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 2019-05-07
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多