VMware中的VMware事件挂钩

时间:2010-06-09 20:36:07

标签: .net virtual-machine vmware

我正在开发一个内部.NET应用程序,它将在VM上运行(使用VMware),并想知道是否有办法从VM系统事件(如挂起,恢复等)获取通知

任何人都知道这样做的便捷方法吗?虚拟机安装了VMware Tools,是否提供用于挂钩事件的.NET API?

编辑:特别是,我对系统刚刚恢复时感兴趣。我认为这与任何“常规”Windows系统事件都不对应(毕竟,暂停和恢复VM的重点是Windows不知道发生了什么)。我错了吗?会引发事件吗?

编辑2:我编写了这个快速控制台应用程序来挂钩我能想到的所有系统事件,并在暂停/恢复时什么也得不到:

static void Main(string[] args) {

    SystemEvents.DisplaySettingsChanged += (sender, e) => Console.WriteLine("Display settings changed");
    SystemEvents.EventsThreadShutdown += (sender, e) => Console.WriteLine("Events thread shutdown");
    SystemEvents.PowerModeChanged += (sender, e) => Console.WriteLine("Power mode changed");
    SystemEvents.SessionEnding += (sender, e) => Console.WriteLine("Session ending");
    SystemEvents.SessionSwitch += (sender, e) => Console.WriteLine("Session switch");
    SystemEvents.UserPreferenceChanging += (sender, e) => Console.WriteLine("User preference changing");

    Console.ReadLine();
}

2 个答案:

答案 0 :(得分:2)

您正在收听任何特定于vmware的事件吗?否则听起来你最好不要在Windows上听这些事件


查看WM_POWERBROADCAST - http://www.pinvoke.net/default.aspx/user32.RegisterPowerSettingNotification

答案 1 :(得分:1)

好的,所以我已经放弃了为此寻找一个简单的.NET钩子,但如果其他人偶然发现并想知道我是如何解决它的:

我的应用中有一个定时触发的定时器(每10秒钟),并将当前时间与上次时间进行比较。如果时间明显超过10秒,我会认为计算机已经处于睡眠状态或已暂停,并根据需要刷新我的应用程序。

有点hacky,但是计时器没有为程序的CPU或内存使用量增加任何东西,所以我觉得它并不可怕。