从Windows服务启动时,窗口不可见

本文关键字:窗口 Windows 服务 启动 | 更新日期: 2023-09-27 18:16:39

有一个监视给定基础设施的windows服务。在某些情况下,需要弹出一个表单,让用户看到一些指标,并能够做一些选择。

为此,我打开了WPF窗口

var thread = new Thread(() =>
{
    var w = new MyWindow();
    _uis.Add(w);
    w.Info = sb.ToString();
    w.Show();
            System.Windows.Threading.Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

,不幸的是看不到窗户。当我在控制台应用程序中托管我的服务业务逻辑时,我可以看到该窗口。

诀窍在哪里?

从Windows服务启动时,窗口不可见

服务不能访问相同的权限(网络服务/本地服务),也不能访问您的桌面

服务在设计上是沉默的,不具备启动窗口的能力。

控制台应用程序有这种能力,控制台应用程序不是windows服务,当然有能力与用户交互

您可以拆分功能:

  • 服务做监控
  • 客户端应用程序显示来自服务的信号

客户端应用程序可以简单地监听套接字,以获取应该显示给用户的服务消息。

服务将在机器启动时启动。

没有诀窍。不要这样做

这种方法违背了关于服务和UI的良好的实践和模式。你不应该试图直接从windows服务中显示UI(或交互式UI)。

标准做法是编写一个单独的UI应用程序来与您的windows服务通信。您可以考虑定期更新UIweb服务可用于在服务和UI应用程序之间进行通信

艰难的路

但是,如果你真的想做你最初要求的,你可以这样做

http://www.codeproject.com/articles/35773/subverting - vista uac - - - 32和64位——要