SystemEvents.PowerModeChanged VSTO 和 WPF 应用程序中未调用事件处理程序
SystemEvents.PowerModeChanged event handler not being called in VSTO & WPF apps
我正在开发一个 VSTO 应用程序级 Word AddIn 和一个 WPF 应用程序,这两个应用程序都需要在系统进入睡眠状态并随后恢复时得到通知。我已将我的事件处理程序绑定到每个应用程序中的 SystemEvents.PowerModeChanged 事件,但由于某种原因,当系统进入睡眠或恢复时它仍然不会被调用。只是为了测试,我只是想在系统进入睡眠状态时写入控制台。我也试过设置断点,但也没用;尽管我不确定他们是否会这样做,因为系统正在暂停应用程序。无论哪种尝试,它都不会打印或中断:
VSTO 插件
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!!");
}
我尝试将事件处理程序的访问级别从 public 更改为私有到内部,反之亦然,以及将绑定移动到每个应用程序代码的其他部分,但它没有解决不了问题。如有任何帮助,我们将不胜感激!
解决方案:根据评论和有用的答案,事件没有触发,因为我 运行 windows 通过 VirtualBox VM。一旦我的同事 运行 在本机 windows 机器上编写了代码,它就成功了。
试试这个:
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>
主窗口:
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));
}
}
为了在 Windows 10 机器中触发事件,右键单击 Start 按钮,然后:
通过超时让机器进入休眠模式的方法相同。这些是我的设置:
同样的结果:
我正在开发一个 VSTO 应用程序级 Word AddIn 和一个 WPF 应用程序,这两个应用程序都需要在系统进入睡眠状态并随后恢复时得到通知。我已将我的事件处理程序绑定到每个应用程序中的 SystemEvents.PowerModeChanged 事件,但由于某种原因,当系统进入睡眠或恢复时它仍然不会被调用。只是为了测试,我只是想在系统进入睡眠状态时写入控制台。我也试过设置断点,但也没用;尽管我不确定他们是否会这样做,因为系统正在暂停应用程序。无论哪种尝试,它都不会打印或中断:
VSTO 插件
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!!");
}
我尝试将事件处理程序的访问级别从 public 更改为私有到内部,反之亦然,以及将绑定移动到每个应用程序代码的其他部分,但它没有解决不了问题。如有任何帮助,我们将不胜感激!
解决方案:根据评论和有用的答案,事件没有触发,因为我 运行 windows 通过 VirtualBox VM。一旦我的同事 运行 在本机 windows 机器上编写了代码,它就成功了。
试试这个:
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>
主窗口:
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));
}
}
为了在 Windows 10 机器中触发事件,右键单击 Start 按钮,然后:
通过超时让机器进入休眠模式的方法相同。这些是我的设置:
同样的结果: