首页 文章

在VSTO和WPF应用程序中未调用SystemEvents.PowerModeChanged事件处理程序

提问于
浏览
2

我正在开发VSTO应用程序级Word AddIn和WPF应用程序,两者都需要在系统进入休眠状态时通知并随后恢复 . 我已将事件处理程序绑定到每个应用程序中的SystemEvents.PowerModeChanged事件,但由于某种原因,当系统进入休眠状态或恢复时,它仍然永远不会被调用 . 只是为了测试,我只是在系统进入睡眠状态时尝试写入控制台 . 我也试过设置断点,但这也没有用;虽然我不确定他们是否会这样做,因为系统暂停了应用程序 . 无论是哪种尝试,它都不会打印或打破:

VSTO Addin

void ThisAddIn_Startup(object sender, EventArgs e)
{
  SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(powerModeChanged);
}

public void powerModeChanged(object sender, PowerModeChangedEventArgs args)
{
  Console.WriteLine("Sleeping.....");
}

WPF

internal MyControl()
{
    SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(powerModeChanged);
}

 public void powerModeChanged(object sender, PowerModeChangedEventArgs args)
 {
     Console.WriteLine("Sleeping!!");
 }

我已经尝试将事件处理程序的访问级别从公共更改为私有到内部,反之亦然,以及将绑定移动到每个应用程序中代码的其他部分,但它没有解决问题 . 非常感谢任何帮助,谢谢!


解决方案:根据评论和有用的答案,事件未触发,因为我通过VirtualBox VM运行Windows . 一旦我的同事在本机Windows机器上运行代码,它就可以工作了 .

1 回答

  • 1

    试试这个:

    XAML:

    <Window x:Class="WpfApplication279.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:WpfApplication279"
        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>
    

    MainWindow:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
        }
    
        private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
        {
            listView1.Items.Add(string.Format("{0} : Power mode changed = {1}", DateTime.Now, e.Mode));
        }
    }
    

    enter image description here


    要在 Windows 10 机器中触发事件,请右键单击 Start 按钮,然后:

    enter image description here


    让机器通过超时进入睡眠模式的方式相同 . 这些是我的设置:

    enter image description here

    相同的结果:

    enter image description here

相关问题