在Vista之前的Windows早期版本中,您可以让Windows服务与当前登录的桌面用户进行交互,以便在服务的屏幕上轻松显示信息。在Windows Vista中,为了安全起见,添加了会话0以将服务与桌面隔离。在会话0之外运行的服务和应用程序之间进行通信的简单方法是什么?到目前为止,我已经通过使用TCP / IP在两者之间进行通信来解决这个问题,但这似乎是一种草率的方式。
答案 0 :(得分:4)
您也可以使用共享内存或命名管道来促进IPC。从概念上讲,这类似于TCP / IP,但您不必担心找到未使用的端口。
您必须确保您创建的命名对象以“Global \”为前缀,以允许所有会话访问它们,如here所述。
AFAIK服务无法再直接与桌面交互。
答案 1 :(得分:3)
实际上,出于安全原因,不再可能直接与“桌面”通信。无论如何,当您居住在具有多个活动用户+远程会话的计算机中时,“桌面”究竟是什么?
解决问题的一般方法是使用通过某种RPC机制(TCP / IP,IPC,.Net Remoting Channels等通过其中一种机制进行通信)的服务应用程序。它有点痛苦,但我认为这些好处值得改变。
答案 2 :(得分:1)
对于与桌面通信的服务,你几乎停留在其中一个RPC机制上。 .NET远程处理机制(IpcServerChannel)并不难为此目的而实现。
使用.NET,桌面应用程序可以使用ServiceController.ExecuteCommand直接向服务发送消息。服务通过ServiceBase.OnCustomCommand接收这些命令。这更容易做到,如果控制服务是您唯一的要求,那就是您所需要的一切。