winforms C#事件未检测到挂起状态

rur96b6h  于 2023-01-21  发布在  C#
关注(0)|答案(1)|浏览(184)

我正在开发一个Windows窗体应用程序,它需要在PC进入睡眠状态之前执行一些逻辑。我查看了许多线程,发现这个应该可以完美地工作:Link。我可以很好地检测电源的插入/拔出时间,但在尝试检测睡眠/挂起事件时遇到了严重的问题。
使用上面提到的逻辑,我的程序中有这段代码:

public void powerModeChanged(object sender, PowerModeChangedEventArgs args)
{
    if (args.Mode == PowerModes.Suspend)
    {
        Trace.WriteLine("Sleeping.....");
    }
    else if (args.Mode == PowerModes.StatusChange)
    {
        Trace.WriteLine("Other Status Change:");
    }
}

public MainPage()
{
    InitializeComponent();
    SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(powerModeChanged);

根据本文档页-Link,有3种电源模式。当我拔出并重新插入电源适配器到笔记本电脑时,会按预期检测到statusChange,并正常打印到调试窗口。但是,它不会检测到我何时将计算机置于睡眠状态。经过几个小时的检查,我的结论是,我运行的Windows 10版本定义为“睡眠”的内容与我检查的事件不匹配。
在第一个链接中有一个关于初始线程的评论,说我尝试的解决方案似乎不适用于“新的连接/现代待机模式”,并提供了一个指向此线程的链接:链接,其中描述了如何使用会话切换事件处理程序。这在我的笔记本电脑上工作,因为我的笔记本电脑在睡眠时锁定,但当在Surface平板电脑(这是我们的操作目标设备)上测试时,它不工作,因为Surface在睡眠时没有锁定。
当然,我可以设置设备在睡眠时锁定,这可能是唯一的解决方案,但我想看看是否有什么我忽略了或任何其他方式来检查睡眠在现代版本的Windows。因为它的立场,我会讨厌这个重要的功能的应用程序依赖于系统必须设置为锁定睡眠。谢谢!

n9vozmp4

n9vozmp41#

您可以使用SystemEvents.PowerModeChanged事件来检测计算机何时将要进入睡眠状态。在事件处理程序中,您可以执行计算机进入睡眠状态之前需要执行的任何逻辑。例如,您可以向windows注册表写入命令或执行一些其他相关任务。
以下是如何做到这一点的一个例子:

// Register the SystemEvents.PowerModeChanged event handler 
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;

// Event handler for SystemEvents.PowerModeChanged
private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
    // Check if the computer is about to go to sleep
    if (e.Mode == PowerModes.Suspend)
    {
        // Perform the logic that needs to be done before the computer goes to sleep
        // ...
    }
}

相关问题