DisplayMagician/HeliosDisplayManagement/InterProcess/IPCService.cs

64 lines
1.8 KiB
C#
Raw Normal View History

2017-02-26 19:23:31 +00:00
using System;
using System.Diagnostics;
using System.ServiceModel;
using System.Windows.Forms;
namespace HeliosDisplayManagement.InterProcess
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
internal class IPCService : IService
{
private static ServiceHost _serviceHost;
private IPCService()
{
Status = InstanceStatus.Busy;
}
public int HoldProcessId { get; set; } = 0;
2017-08-10 14:21:45 +00:00
public InstanceStatus Status { get; set; }
2017-02-26 19:23:31 +00:00
public void StopHold()
{
Application.Exit();
}
2017-08-10 14:21:45 +00:00
public static IPCService GetInstance()
{
if ((_serviceHost != null) || StartService())
return _serviceHost?.SingletonInstance as IPCService;
return null;
}
2017-02-26 19:23:31 +00:00
public static bool StartService()
{
if (_serviceHost == null)
try
{
var process = Process.GetCurrentProcess();
var service = new IPCService();
_serviceHost = new ServiceHost(
service,
new Uri($"net.pipe://localhost/HeliosDisplayManagement_IPC{process.Id}"));
_serviceHost.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "Service");
_serviceHost.Open();
return true;
}
catch (Exception)
{
try
{
_serviceHost?.Close();
}
catch
{
// ignored
}
_serviceHost = null;
}
return false;
}
}
}