Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SystemEvents.PowerModeChanged事件处理程序未在VSTO中调用&;WPF应用程序_C#_.net_Wpf_Xaml_Vsto - Fatal编程技术网

C# SystemEvents.PowerModeChanged事件处理程序未在VSTO中调用&;WPF应用程序

C# SystemEvents.PowerModeChanged事件处理程序未在VSTO中调用&;WPF应用程序,c#,.net,wpf,xaml,vsto,C#,.net,Wpf,Xaml,Vsto,我正在开发一个VSTO应用程序级Word AddIn和一个WPF应用程序,这两个应用程序都需要在系统进入睡眠状态并随后恢复时得到通知。我已将我的事件处理程序绑定到每个应用程序中的SystemEvents.PowerModeChanged事件,但由于某些原因,当系统进入睡眠或恢复时,仍然不会调用它。为了测试,我只是在系统进入睡眠状态时尝试写入控制台。我也试着设置断点,但也没用;尽管我不确定他们是否会这样做,因为系统正在暂停应用程序。无论哪种尝试,它都不会打印或中断: VSTO Addin void

我正在开发一个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!!");
 }
我尝试过将事件处理程序的访问级别从public改为private再改为internal,反之亦然,并将绑定移动到每个应用程序中代码的其他部分,但没有解决问题。任何帮助都将不胜感激,谢谢


解决方案:根据评论和有用的回答,事件没有触发,因为我是通过VirtualBox VM运行windows的。一旦我的同事在本机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计算机中触发事件,请右键单击开始按钮,然后:


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

同样的结果:


这很可能是由于VSTO中没有
控制台造成的。尝试写入
文件,而不是控制台,以确保事件被触发。@lokusking只是尝试了一下,但没有成功,我想这意味着我的EventHandler没有正确绑定到事件?另外,我正在VirtualBox Windows 10 VM实例上运行此操作,不确定这是否是一个问题?找到了另一个选项。Tbh,我不知道这是否也能处理暂停使用Console.WriteLine()在没有控制台的应用程序中使用的库中是无效的,当然你永远看不到它。另一个典型的问题是,在.NET有机会调用事件处理程序之前,机器的电源模式发生了变化。当机器再次通电时,您将收到两次该事件:)在VM中使用它,请不要麻烦。对于延迟,很抱歉,只是尝试使用您的确切代码实现它,但不幸的是,listView中没有显示任何内容。Visual Studio中是否有一个设置或一些解决方案/项目范围的属性我没有设置,以阻止调用我的事件处理程序?谢谢你的帮助!另外,我正在VirtualBox Windows 10虚拟机实例上运行此操作,不确定这是否会成为问题?如何使您的虚拟机实例进入睡眠模式?在您的第一条评论中,我将睡眠阈值设置为1分钟,使其快速睡眠。我将尝试您的编辑,尽管它将在我的虚拟机上休眠,因为我将休眠阈值设置得很低。我也将阈值设置为1分钟,并且它的工作方式相同。