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