☰
Electron.NET PowerMonitor 系统电源事件监听指南:从睡眠唤醒到电池状态的全方位 C 监控方案
2026/9/28 6:57:58 网站建设 项目流程
  • 桌面应用
  • 跨平台

【免费下载链接】Electron.NET

:electron: Build cross platform desktop apps with ASP.NET Core (Razor Pages, MVC, Blazor).

项目地址:https://gitcode.com/gh_mirrors/el/Electron.NET
点击查看免费下载

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)。

整个链路可以概括为三个环节:

  1. C# 侧注册:当你执行Electron.PowerMonitor.OnSuspend += handler;时,ApiBase.AddEvent 会构造事件名(PowerMonitor 的SocketEventNameType为DashedLower,即powerMonitor-suspend这样的短横线小写格式),在 Socket 上监听该事件,并通过BridgeConnector.Socket.Emit($"register-{eventName}")向主进程发送register-powerMonitor-suspend注册请求。

  2. 主进程桥接: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-screen
    OnUnLockScreenregister-powerMonitor-unlock-screenunlock-screenpowerMonitor-unlock-screen
    OnSuspendregister-powerMonitor-suspendsuspendpowerMonitor-suspend
    OnResumeregister-powerMonitor-resumeresumepowerMonitor-resume
    OnACregister-powerMonitor-acon-acpowerMonitor-ac
    OnBatteryregister-powerMonitor-batteryon-batterypowerMonitor-battery
    OnShutdownregister-powerMonitor-shutdownshutdownpowerMonitor-shutdown
  3. 事件回传与派发:系统事件发生后,主进程通过 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(); };

实战建议:订阅时机与平台守卫

结合仓库代码,以下几点值得在实际项目中落实:

  1. 尽早订阅:建议在应用启动阶段(如 ASP.NET Core 的Startup/Program初始化、或应用首个页面加载时)完成所有电源事件注册。C# 侧未订阅的事件不会在主进程注册,过早错过可能导致状态丢失。

  2. 用HybridSupport.IsElectronActive守护:仓库示例 HomeController.cs 先判断HybridSupport.IsElectronActive再访问Electron.PowerMonitor,保证应用在纯 Web 模式下运行时不会触发无效调用。

  3. 按平台条件订阅:由于OnAC/OnBattery/OnLockScreen/OnUnLockScreen仅支持 macOS 与 Windows,OnShutdown仅支持 Linux 与 macOS,建议用OperatingSystem.IsMacOS()、OperatingSystem.IsWindows()、OperatingSystem.IsLinux()分流注册,避免无意义订阅并保证跨平台可移植性。

  4. 处理器保持轻量:电源事件(尤其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).

项目地址:https://gitcode.com/gh_mirrors/el/Electron.NET
点击查看免费下载
上一篇:lax.js状态管理集成:Redux/Vuex中的动画控制
下一篇:解决React Native轮播图加载慢问题:用FastImage实现图片缓存

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询