- 桌面应用
- 跨平台
【免费下载链接】Electron.NET
:electron: Build cross platform desktop apps with ASP.NET Core (Razor Pages, MVC, Blazor).
Electron.NET 的Electron.PowerMonitorAPI 为 ASP.NET Core 应用(Razor Pages、MVC、Blazor)提供了监听系统电源事件的能力,覆盖睡眠、唤醒、锁屏、解锁、AC/电池切换与系统关机等关键节点。本文以 PowerMonitor 官方文档 为骨架,结合仓库中的 C# 源码、Electron 主进程 TypeScript 桥接层与实际示例,完整讲解每个事件的触发时机、平台支持范围、事件注册原理,并给出可直接落地的状态保存、安全防护与省电策略示例,帮助你在桌面应用中实现健壮的电源感知行为。
PowerMonitor 是什么
Electron.PowerMonitor是 Electron.NET 提供的系统电源状态监控入口。通过它可以感知三类系统级变化:
- 电源来源变化:系统切换到 AC 电源或电池供电;
- 系统会话变化:系统即将休眠、正在恢复、即将重启或关机;
- 屏幕会话变化:系统即将锁定或解锁屏幕。
这些事件全部通过Electron.PowerMonitor上的 C# 事件(event Action)暴露,订阅方式与普通 .NET 事件完全一致。从源码看,PowerMonitor.cs 继承自ApiBase,并以双重检查锁实现的线程安全单例模式对外提供实例,通过 Electron.cs 中的静态属性Electron.PowerMonitor访问:
public static PowerMonitor PowerMonitor { get { return PowerMonitor.Instance; } }也就是说,你在任何位置访问Electron.PowerMonitor,拿到的都是同一个实例,事件订阅与派发在整个应用生命周期内保持一致。
七类电源事件详解
事件总览
| 事件 | 触发时机 | 平台支持 |
|---|---|---|
OnAC | 系统切换到交流(AC)电源 | macOS、Windows |
OnBattery | 系统切换到电池供电 | macOS、Windows |
OnLockScreen | 系统即将锁定屏幕 | macOS、Windows |
OnUnLockScreen | 系统即将解锁屏幕 | macOS、Windows |
OnSuspend | 系统正在挂起(进入睡眠) | 所有平台 |
OnResume | 系统正在恢复(唤醒) | 所有平台 |
OnShutdown | 系统即将重启或关机 | Linux、macOS |
平台支持范围在 PowerMonitor.cs 中通过[SupportedOSPlatform]特性逐一声明,例如:
[SupportedOSPlatform("macOS")] [SupportedOSPlatform("Windows")] public event Action OnLockScreen { add => AddEvent(value); remove => RemoveEvent(value); }注意OnAC、OnBattery与锁屏/解锁事件一样仅适用于 macOS 与 Windows,OnSuspend与OnResume无平台限制,而OnShutdown仅适用于 Linux 与 macOS。在实际开发中应结合OperatingSystem.IsMacOS()/OperatingSystem.IsWindows()/OperatingSystem.IsLinux()等运行时判断进行条件订阅,这一点与仓库示例项目 HomeController.cs 的做法一致——该控制器在HybridSupport.IsElectronActive为真且系统为 macOS/Windows 时才注册电源事件。
OnShutdown 的特殊语义
在所有事件中,OnShutdown的语义最特殊。根据 PowerMonitor.cs 中的注释说明,它对应 Electron 官方 powerMonitor 的shutdown事件:当事件处理器调用e.preventDefault()时,Electron 会尝试延迟系统关机,以便应用能干净退出;一旦调用,应用应尽快退出(例如调用app.quit())。这为"关机前保存关键数据"提供了时机窗口——尽管 C# 侧当前以无参Action形式暴露该事件,你仍可在处理器中执行保存与清理逻辑。
事件是如何从 Electron 传到 C# 的
要理解 PowerMonitor 事件,有必要了解它跨越进程的传递链路。Electron.NET 应用分为两个进程:运行 ASP.NET Core 的 .NET 进程与承载 Electron 主进程的 Node.js 进程,二者通过 Socket.IO 桥接通信(桥接连接器见 BridgeConnector.cs,Socket.IO 实现见 SocketIOConnection.cs)。
整个链路可以概括为三个环节:
C# 侧注册:当你执行
Electron.PowerMonitor.OnSuspend += handler;时,ApiBase.AddEvent 会构造事件名(PowerMonitor 的SocketEventNameType为DashedLower,即powerMonitor-suspend这样的短横线小写格式),在 Socket 上监听该事件,并通过BridgeConnector.Socket.Emit($"register-{eventName}")向主进程发送register-powerMonitor-suspend注册请求。主进程桥接:powerMonitor.ts 中的导出函数监听上述
register-powerMonitor-*消息,将 C# 侧订阅一一映射到 Electron 原生powerMonitor对象。例如收到register-powerMonitor-suspend后执行powerMonitor.on("suspend", () => electronSocket.emit("powerMonitor-suspend")),其余六个事件同理:C# 事件 注册消息 Electron 原生事件 回调消息 OnLockScreenregister-powerMonitor-lock-screenlock-screenpowerMonitor-lock-screenOnUnLockScreenregister-powerMonitor-unlock-screenunlock-screenpowerMonitor-unlock-screenOnSuspendregister-powerMonitor-suspendsuspendpowerMonitor-suspendOnResumeregister-powerMonitor-resumeresumepowerMonitor-resumeOnACregister-powerMonitor-acon-acpowerMonitor-acOnBatteryregister-powerMonitor-batteryon-batterypowerMonitor-batteryOnShutdownregister-powerMonitor-shutdownshutdownpowerMonitor-shutdown事件回传与派发:系统事件发生后,主进程通过 Socket 将
powerMonitor-*消息推回 .NET 进程,ApiBase的事件容器(EventContainer)收到消息后同步调用你在 C# 侧注册的委托。
理解这条链路的意义在于:事件只有在 C# 侧被订阅后才会在主进程真正注册,因此你应该在应用启动早期完成订阅,避免因订阅过晚而错过关键电源事件。
使用示例
以下示例均来自 PowerMonitor.md 原文,结合上述机制可直接运行于 Electron.NET 应用中。
基础电源事件监控
监控系统睡眠与唤醒,在睡眠前保存应用状态、唤醒后恢复:
// Monitor system sleep/wake Electron.PowerMonitor.OnSuspend += () => { Console.WriteLine("System going to sleep"); // Save application state SaveApplicationState(); }; Electron.PowerMonitor.OnResume += () => { Console.WriteLine("System waking up"); // Restore application state RestoreApplicationState(); };屏幕锁定/解锁监控
屏幕锁定时暂停实时操作、解锁后恢复,适用于需要保护敏感界面的场景:
// Handle screen lock events Electron.PowerMonitor.OnLockScreen += () => { Console.WriteLine("Screen locking"); // Pause real-time operations PauseRealTimeOperations(); }; Electron.PowerMonitor.OnUnLockScreen += () => { Console.WriteLine("Screen unlocking"); // Resume real-time operations ResumeRealTimeOperations(); };平台提示:
OnLockScreen与OnUnLockScreen仅支持 macOS 与 Windows,建议在订阅前用OperatingSystem.IsMacOS() || OperatingSystem.IsWindows()判断,避免在 Linux 上无效注册(仓库示例 HomeController.cs 即采用此写法)。
电源来源切换
根据 AC/电池状态动态调整功耗策略:
// Monitor power source changes Electron.PowerMonitor.OnAC += () => { Console.WriteLine("Switched to AC power"); // Adjust power-intensive operations EnablePowerIntensiveFeatures(); }; Electron.PowerMonitor.OnBattery += () => { Console.WriteLine("Switched to battery power"); // Reduce power consumption EnablePowerSavingMode(); };系统关机处理
在系统关机前保存关键数据并优雅退出:
// Handle system shutdown Electron.PowerMonitor.OnShutdown += () => { Console.WriteLine("System shutting down"); // Save critical data and exit gracefully SaveAndExit(); };平台提示:
OnShutdown仅支持 Linux 与 macOS,在 Windows 上需要关机监听时可结合 Electron.App 的应用生命周期事件(如窗口关闭/退出事件)实现等效逻辑。
应用状态管理
将电源事件整合进统一的初始化方法,通过布尔标志跟踪挂起状态,实现一套完整的"睡眠-唤醒-锁屏"响应流程:
private bool isSuspended = false; public void InitializePowerMonitoring() { // Track suspension state Electron.PowerMonitor.OnSuspend += () => { isSuspended = true; OnSystemSleep(); }; Electron.PowerMonitor.OnResume += () => { isSuspended = false; OnSystemWake(); }; // Handle screen lock for security Electron.PowerMonitor.OnLockScreen += () => { OnScreenLocked(); }; } private void OnSystemSleep() { // Pause network operations PauseNetworkOperations(); // Save unsaved work AutoSaveDocuments(); // Reduce resource usage MinimizeResourceUsage(); } private void OnSystemWake() { // Resume network operations ResumeNetworkOperations(); // Check for updates CheckForUpdates(); // Restore full functionality RestoreFullFunctionality(); } private void OnScreenLocked() { // Hide sensitive information HideSensitiveData(); // Pause real-time features PauseRealTimeFeatures(); }电池状态监控
笔记本场景下的性能模式切换:
// Monitor battery status changes Electron.PowerMonitor.OnAC += () => { Console.WriteLine("Plugged in - full performance mode"); EnableFullPerformanceMode(); }; Electron.PowerMonitor.OnBattery += () => { Console.WriteLine("On battery - power saving mode"); EnablePowerSavingMode(); };实战建议:订阅时机与平台守卫
结合仓库代码,以下几点值得在实际项目中落实:
尽早订阅:建议在应用启动阶段(如 ASP.NET Core 的
Startup/Program初始化、或应用首个页面加载时)完成所有电源事件注册。C# 侧未订阅的事件不会在主进程注册,过早错过可能导致状态丢失。用
HybridSupport.IsElectronActive守护:仓库示例 HomeController.cs 先判断HybridSupport.IsElectronActive再访问Electron.PowerMonitor,保证应用在纯 Web 模式下运行时不会触发无效调用。按平台条件订阅:由于
OnAC/OnBattery/OnLockScreen/OnUnLockScreen仅支持 macOS 与 Windows,OnShutdown仅支持 Linux 与 macOS,建议用OperatingSystem.IsMacOS()、OperatingSystem.IsWindows()、OperatingSystem.IsLinux()分流注册,避免无意义订阅并保证跨平台可移植性。处理器保持轻量:电源事件(尤其
OnSuspend)要求处理器尽快返回,避免阻塞系统挂起流程。重活(如网络操作、大量持久化)应放到后台任务队列执行。
与相关 API 的配合
- Electron.App:提供应用生命周期事件(如
BeforeQuit、WindowAllClosed),可与OnShutdown配合,在系统关机与用户退出两种场景下都保证数据安全。 - Electron.Notification:可在电源事件发生后向用户发送桌面通知,例如电量切换提示、唤醒后的更新提示等,让用户对电源状态变化有明确感知。
小结
Electron.PowerMonitor用七个 C# 事件把 Electron 原生 powerMonitor 能力完整映射到 .NET 世界:OnAC/OnBattery感知电源来源,OnSuspend/OnResume感知睡眠与唤醒,OnLockScreen/OnUnLockScreen感知屏幕会话,OnShutdown把握系统关机前最后的保存窗口。结合本文梳理的跨进程桥接原理(C# 订阅 →register-注册消息 → powerMonitor.ts 桥接 → 事件回传)与平台支持矩阵,你可以在任意 Electron.NET 应用中可靠地实现自动保存、功耗优化、安全锁屏与优雅退出等电源感知能力。
- 桌面应用
- 跨平台
【免费下载链接】Electron.NET
:electron: Build cross platform desktop apps with ASP.NET Core (Razor Pages, MVC, Blazor).
相关推荐
Solaar与系统电源事件:休眠/唤醒时的设备状态处理
Solaar与系统电源事件:休眠/唤醒时的设备状态处理 问题场景:休眠唤醒后的设备异常 你是否遇到过这样的情况:Linux系统从休眠状态唤醒后,Logitech
开发工具Electron powerMonitor 深度解析:在桌面应用中监听系统电源、休眠与热状态
Electron powerMonitor 深度解析:在桌面应用中监听系统电源、休眠与热状态 Electron 的 powerMonitor 模块让主进程能够感
桌面应用跨平台前端UDA与BERT强强联合:如何在GPU和TPU上实现最佳性能
UDA与BERT强强联合:如何在GPU和TPU上实现最佳性能 Unsupervised Data Augmentation UDA 技术与BERT模型的结合为自
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考