C#WPF PowerModeChanged不';我不能在地面上工作

C#WPF PowerModeChanged不';我不能在地面上工作,c#,wpf,surface,C#,Wpf,Surface,在非表面设备中测试下面的代码效果很好,但当我在表面设备中尝试时,我只会在拔下电源线时收到通知(“statusChange”电源模式被触发)。将曲面置于未调用的处理程序的睡眠状态('resume'和'suspend'电源模式未被触发)。 有人知道为什么吗?多谢各位 表面规格: 操作系统名称:Microsoft Windows 10 Pro 版本:10.0.17134编译Ação 17134 操作系统制造商:微软公司 系统制造商:微软公司 系统型号:Surface Pro 系统类型:基于x64的PC

在非表面设备中测试下面的代码效果很好,但当我在表面设备中尝试时,我只会在拔下电源线时收到通知(“statusChange”电源模式被触发)。将曲面置于未调用的处理程序的睡眠状态('resume'和'suspend'电源模式未被触发)。
有人知道为什么吗?多谢各位

表面规格:
操作系统名称:Microsoft Windows 10 Pro
版本:10.0.17134编译Ação 17134
操作系统制造商:微软公司
系统制造商:微软公司
系统型号:Surface Pro
系统类型:基于x64的PC
系统SKU:Surface_Pro_1796

示例[WPF Visual Studio Pro 2015]
主窗口:

using System;
using System.Windows;
using Microsoft.Win32;

namespace WpfApplication2
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            // SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(SystemEvents_PowerModeChanged);
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(SystemEvents_PowerModeChanged);
        }

        private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
        {
            listView1.Items.Add(string.Format("{0} : Power mode changed = {1}", DateTime.Now, e.Mode));
        }
    }
}
XAML

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication2"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
    <Grid>
        <ListView x:Name="listView1" Margin="0">
            <ListView.View>
                <GridView>
                    <GridViewColumn/>
                </GridView>
            </ListView.View>
        </ListView>

    </Grid>
</Window>

我也在研究这样一个问题。据我所知,表面支持“睡眠状态(现代待机)”,或S0低功耗,但尚未处于实际睡眠状态(S1-3)。按下电源按钮或单击windows菜单中的“睡眠”选项不会直接进入睡眠,而是进入S0低功率,因此不会触发PowerModeChanged


确实如此。我不得不努力工作,但我没有任何强有力的解决办法。您可以使用SystemEvents.SessionSwitch或PowerManager.IsMonitorOnChanged(来自一个名为的nuget软件包,但对于我的情况,它们并不精确。其他黑客解决方案是通过禁用连接的备用/现代备用来扰乱注册表,方法是:将值CsEnabled设置为0(需要重新启动才能采取操作)在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power。这将完全禁用睡眠模式。Surface将改为休眠,PowerModeChanged将被触发。如果不禁用此选项并尝试将电源按钮设置为休眠,PowerModeChanged将不会被触发。基于@yozef答案的代码如下: