【问题标题】:SystemEvents.PowerModeChanged event handler not being called in VSTO & WPF appsSystemEvents.PowerModeChanged 事件处理程序未在 VSTO 和 WPF 应用程序中调用
【发布时间】:2016-12-17 13:18:13
【问题描述】:

我正在开发 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!!");
 }

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


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

【问题讨论】:

  • 这很可能是因为您在 VSTO 中没有Console。尝试写入File 而不是控制台,以确保您的事件被触发。
  • @lok​​usking 刚刚尝试过,但没有成功,我想这意味着我的 EventHandler 没有正确绑定到事件?
  • 另外,我在 VirtualBox Windows 10 VM 实例上运行它,不确定这是否是个问题?
  • 发现另一个选项here。 Tbh,我不知道这是否也能处理暂停
  • 在没有控制台的应用程序中使用的库中使用 Console.WriteLine() 是没有效率的,您当然永远看不到它。另一个典型的挂断是机器的电源模式在 .NET 有机会调用您的事件处理程序之前发生了变化。当机器再次启动时,您将收到两次事件 :) 在 VM 中使用它,只是不要打扰。

标签: c# .net wpf xaml vsto


【解决方案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>

主窗口:

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 机器中触发事件,请右键单击 开始 按钮,然后:


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

同样的结果:

【讨论】:

  • 抱歉耽搁了,刚刚尝试使用您的确切代码实现此功能,不幸的是,listView 中没有出现任何内容。 Visual Studio 中是否有设置或我尚未设置的某些解决方案/项目范围的属性阻止调用我的事件处理程序?感谢您的帮助!
  • 另外,我在 VirtualBox Windows 10 VM 实例上运行它,不确定这是否是个问题?
  • 如何让虚拟机实例进入睡眠模式?
  • 对于您的第一条评论,我将睡眠阈值设置为 1 分钟,以便它快速入睡。我会尝试您的编辑,尽管它会在我的 VM 上休眠,因为我将休眠阈值设置得太低。
  • 我也将阈值设置为 1 分钟,并且效果相同。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多