using System.Collections.Generic; using System.Diagnostics; using System.ServiceModel; using System.ServiceModel.Description; namespace HeliosDisplayManagement.InterProcess { internal class IPCClient : ClientBase, IService { public IPCClient(Process process) : base( new ServiceEndpoint( ContractDescription.GetContract(typeof(IService)), new NetNamedPipeBinding(), new EndpointAddress( $"net.pipe://localhost/HeliosDisplayManagement_IPC{process.Id}/Service"))) { } public InstanceStatus Status => Channel.Status; public int HoldProcessId => Channel.HoldProcessId; public void StopHold() { Channel.StopHold(); } public static IEnumerable QueryAll() { var thisProcess = Process.GetCurrentProcess(); foreach (var process in Process.GetProcessesByName(thisProcess.ProcessName)) { if (process.Id == thisProcess.Id) continue; IPCClient processChannel = null; try { processChannel = new IPCClient(process); } catch { // ignored } if (processChannel != null) yield return processChannel; } } public static IPCClient QueryByStatus(InstanceStatus status) { var thisProcess = Process.GetCurrentProcess(); foreach (var process in Process.GetProcessesByName(thisProcess.ProcessName)) if (process.Id != thisProcess.Id) try { var processChannel = new IPCClient(process); if (processChannel.Status == status) return processChannel; } catch { // ignored } return null; } } }