using ElectronNET.API.Entities; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; using System; using System.Threading.Tasks; namespace ElectronNET.API { /// /// Retrieve information about screen size, displays, cursor position, etc. /// public sealed class Screen { /// /// Emitted when an new Display has been added. /// public event Action OnDisplayAdded { add { if (_onDisplayAdded == null) { BridgeConnector.Socket.On("screen-display-added-event" + GetHashCode(), (display) => { _onDisplayAdded(((JObject)display).ToObject()); }); BridgeConnector.Socket.Emit("register-screen-display-added", GetHashCode()); } _onDisplayAdded += value; } remove { _onDisplayAdded -= value; if (_onDisplayAdded == null) BridgeConnector.Socket.Off("screen-display-added-event" + GetHashCode()); } } private event Action _onDisplayAdded; /// /// Emitted when oldDisplay has been removed. /// public event Action OnDisplayRemoved { add { if (_onDisplayRemoved == null) { BridgeConnector.Socket.On("screen-display-removed-event" + GetHashCode(), (display) => { _onDisplayRemoved(((JObject)display).ToObject()); }); BridgeConnector.Socket.Emit("register-screen-display-removed", GetHashCode()); } _onDisplayRemoved += value; } remove { _onDisplayRemoved -= value; if (_onDisplayRemoved == null) BridgeConnector.Socket.Off("screen-display-removed-event" + GetHashCode()); } } private event Action _onDisplayRemoved; /// /// Emitted when one or more metrics change in a display. /// The changedMetrics is an array of strings that describe the changes. /// Possible changes are bounds, workArea, scaleFactor and rotation. /// public event Action OnDisplayMetricsChanged { add { if (_onDisplayMetricsChanged == null) { BridgeConnector.Socket.On("screen-display-metrics-changed-event" + GetHashCode(), (args) => { var display = ((JArray)args).First.ToObject(); var metrics = ((JArray)args).Last.ToObject(); _onDisplayMetricsChanged(display, metrics); }); BridgeConnector.Socket.Emit("register-screen-display-metrics-changed", GetHashCode()); } _onDisplayMetricsChanged += value; } remove { _onDisplayMetricsChanged -= value; if (_onDisplayMetricsChanged == null) BridgeConnector.Socket.Off("screen-display-metrics-changed-event" + GetHashCode()); } } private event Action _onDisplayMetricsChanged; private static Screen _screen; private static object _syncRoot = new object(); internal Screen() { } internal static Screen Instance { get { if (_screen == null) { lock (_syncRoot) { if (_screen == null) { _screen = new Screen(); } } } return _screen; } } /// /// The current absolute position of the mouse pointer. /// /// public Task GetCursorScreenPointAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("screen-getCursorScreenPointCompleted", (point) => { BridgeConnector.Socket.Off("screen-getCursorScreenPointCompleted"); taskCompletionSource.SetResult(((JObject)point).ToObject()); }); BridgeConnector.Socket.Emit("screen-getCursorScreenPoint"); return taskCompletionSource.Task; } /// /// macOS: The height of the menu bar in pixels. /// /// The height of the menu bar in pixels. public Task GetMenuBarHeightAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("screen-getMenuBarHeightCompleted", (height) => { BridgeConnector.Socket.Off("screen-getMenuBarHeightCompleted"); taskCompletionSource.SetResult(int.Parse(height.ToString())); }); BridgeConnector.Socket.Emit("screen-getMenuBarHeight"); return taskCompletionSource.Task; } /// /// The primary display. /// /// public Task GetPrimaryDisplayAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("screen-getPrimaryDisplayCompleted", (display) => { BridgeConnector.Socket.Off("screen-getPrimaryDisplayCompleted"); taskCompletionSource.SetResult(((JObject)display).ToObject()); }); BridgeConnector.Socket.Emit("screen-getPrimaryDisplay"); return taskCompletionSource.Task; } /// /// An array of displays that are currently available. /// /// An array of displays that are currently available. public Task GetAllDisplaysAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("screen-getAllDisplaysCompleted", (displays) => { BridgeConnector.Socket.Off("screen-getAllDisplaysCompleted"); taskCompletionSource.SetResult(((JArray)displays).ToObject()); }); BridgeConnector.Socket.Emit("screen-getAllDisplays"); return taskCompletionSource.Task; } /// /// The display nearest the specified point. /// /// The display nearest the specified point. public Task GetDisplayNearestPointAsync(Point point) { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("screen-getDisplayNearestPointCompleted", (display) => { BridgeConnector.Socket.Off("screen-getDisplayNearestPointCompleted"); taskCompletionSource.SetResult(((JObject)display).ToObject()); }); BridgeConnector.Socket.Emit("screen-getDisplayNearestPoint", JObject.FromObject(point, _jsonSerializer)); return taskCompletionSource.Task; } /// /// The display that most closely intersects the provided bounds. /// /// /// The display that most closely intersects the provided bounds. public Task GetDisplayMatchingAsync(Rectangle rectangle) { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("screen-getDisplayMatching", (display) => { BridgeConnector.Socket.Off("screen-getDisplayMatching"); taskCompletionSource.SetResult(((JObject)display).ToObject()); }); BridgeConnector.Socket.Emit("screen-getDisplayMatching", JObject.FromObject(rectangle, _jsonSerializer)); return taskCompletionSource.Task; } private JsonSerializer _jsonSerializer = new JsonSerializer() { ContractResolver = new CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore }; } }