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.On("screen-display-added-event" + GetHashCode(), (display) => { _onDisplayAdded(display); }); BridgeConnector.Emit("register-screen-display-added", GetHashCode()); } _onDisplayAdded += value; } remove { _onDisplayAdded -= value; if (_onDisplayAdded == null) BridgeConnector.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.On("screen-display-removed-event" + GetHashCode(), (display) => { _onDisplayRemoved(display); }); BridgeConnector.Emit("register-screen-display-removed", GetHashCode()); } _onDisplayRemoved += value; } remove { _onDisplayRemoved -= value; if (_onDisplayRemoved == null) BridgeConnector.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.On("screen-display-metrics-changed-event" + GetHashCode(), (args) => { _onDisplayMetricsChanged(args.display, args.metrics); }); BridgeConnector.Emit("register-screen-display-metrics-changed", GetHashCode()); } _onDisplayMetricsChanged += value; } remove { _onDisplayMetricsChanged -= value; if (_onDisplayMetricsChanged == null) BridgeConnector.Off("screen-display-metrics-changed-event" + GetHashCode()); } } private event Action _onDisplayMetricsChanged; private static Screen _screen; private static readonly object _syncRoot = new(); 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() => BridgeConnector.OnResult("screen-getCursorScreenPoint", "screen-getCursorScreenPointCompleted"); /// /// macOS: The height of the menu bar in pixels. /// /// The height of the menu bar in pixels. public Task GetMenuBarHeightAsync() => BridgeConnector.OnResult("screen-getMenuBarHeight", "screen-getMenuBarHeightCompleted"); /// /// The primary display. /// /// public Task GetPrimaryDisplayAsync() => BridgeConnector.OnResult("screen-getPrimaryDisplay", "screen-getPrimaryDisplayCompleted"); /// /// An array of displays that are currently available. /// /// An array of displays that are currently available. public Task GetAllDisplaysAsync() => BridgeConnector.OnResult("screen-getAllDisplays", "screen-getAllDisplaysCompleted"); /// /// The display nearest the specified point. /// /// The display nearest the specified point. public Task GetDisplayNearestPointAsync(Point point) => BridgeConnector.OnResult("screen-getDisplayNearestPoint", "screen-getDisplayNearestPointCompleted", point); /// /// The display that most closely intersects the provided bounds. /// /// /// The display that most closely intersects the provided bounds. public Task GetDisplayMatchingAsync(Rectangle rectangle) => BridgeConnector.OnResult("screen-getDisplayMatching", "screen-getDisplayMatchingCompleted", rectangle); } }