如何检查我的电脑是否已退出睡眠模式

4

我找到的所有资料都是使用.NET Framework来检查PC是否处于睡眠模式,但我的应用程序必须跨平台,因此我需要使用.NET Core。

我想复制下面这个示例的功能,它需要.NET Framework并可以检查PC是否离开了睡眠模式:

SystemEvents.PowerModeChanged += OnPowerChange;

private void OnPowerChange(object s, PowerModeChangedEventArgs e) 
{
    switch ( e.Mode ) 
    {
        case PowerModes.Resume: 
        break;
        case PowerModes.Suspend:
        break;
    }
}

有没有一个纯粹使用.NET Core的解决方案,或者有没有一个用C/C++编写的DLL可以导入和使用?


我不明白一个程序如何知道它是否处于睡眠模式,因为根据定义,所有程序都会被置于睡眠状态,所以程序将无法执行任何“睡眠模式检测”代码。 - Pac0
1
核心中缺少哪个类或方法? - Mat J
1
.Net Framework有PowerState,而.NET Core没有或者至少我不知道有任何相应的东西。 - dragonking3002
文档中提到了它: https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.win32.powermodes?view=netcore-2.1 但我从未在任何地方使用过它。 - Peter B
2个回答

1
“PowerModeChangedEvent”可能对您有用,在 .net core 控制台应用程序中,您可以安装一个 Nuget 包来使用它。”

package management screen

您需要确保引用了 using Microsoft.Win32; 命名空间,并且您需要进行一些研究 (可能会有所帮助的 http://www.blackwasp.co.uk/DetectPowerEvents.aspx) 来了解如何将其应用于您的具体情况。


2
作者要求跨平台解决方案,但这是仅限于Windows的库。它在Linux/MacOS上不可能正常运行。 - stasiaks

1

代码依赖睡眠模式的主要问题是每个平台都有不同的定义,因此没有内置的解决方案(至少没有我知道的)。

我最好的猜测是编写一个简单的库,从当前系统获取电源状态,并将其映射到您自己的枚举

这个库需要检查它正在运行的系统,您可以使用:

System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()

这将会给你其中之一:

OSPlatform.Windows
OSPlatform.OSX
OSPlatform.Linux

然后,您将针对每种情况使用特定于平台的代码。所以:
对于Windows-使用Microsoft.Win32.SystemEventsSystemEvents.PowerModeChanged 对于Linux的低级代码,不幸的是我不知道具体的解决方案,所以我能做的就是给您一个链接,解释Linux内核中的睡眠状态: https://www.kernel.org/doc/html/v4.18/admin-guide/pm/sleep-states.html 至于OSX,我也不知道。我第一个想法是它应该与Linux情况类似,但也许有一些库可以为您完成。
无论如何,对于Linux和OSX,您需要使用外部C / C ++库来获取睡眠状态,并将其映射到您的枚举类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接