2010-06-09 55 views
5

我正在開發一個將在VM(與VMware)上運行的內部.NET應用程序,並且想知道是否有辦法從VM系統事件中獲取通知(如掛起,恢復等).NET中的VMware事件掛接

任何人都知道一個方便的方法來做到這一點?虛擬機安裝了VMware Tools,它是否提供用於掛鉤事件的.NET API?

編輯:特別是,我感興趣的是什麼時候系統剛剛恢復。我認爲這不符合任何「常規」Windows系統事件(畢竟,暫停和恢復虛擬機的全部重點是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(); 
} 
+0

你試過標準的Windows事件嗎? – 2010-06-09 20:39:00

+0

我已經放棄尋找一個鉤子,並用計時器解決了這個問題,但如果有人有更好的解決方案,我很樂意聽到它! – 2010-10-07 19:14:41

回答

1

OK,所以我放棄了尋找一種簡單的.NET爲此,但如果別人絆倒在這,並想知道我是如何解決它:

我有一個定時器在我的應用程序定期觸發(每10秒),並比較當前時間與上次。如果時間明顯長於10秒,我認爲計算機已經睡着或掛起,並根據需要刷新我的應用程序。

有點不好意思,但計時器並沒有增加程序的CPU或內存使用量,所以我認爲這並不可怕。

2

是否有任何VMware特定事件,你會在聽嗎?否則,它聽起來就像你會更好監聽從Windows

這些事件

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

+0

我不知道哪些系統事件會對應於「簡歷」...請參閱編輯。 – 2010-06-09 20:49:05

+0

如果你可以檢測到它進入待機狀態,那麼你可以設置應用程序處於待機狀態的某種標誌 - 如果應用程序開始運行並且看到它處於待機狀態,那麼它可以推斷它一定是剛剛恢復的。 – STW 2010-06-09 20:55:49

+0

進入待機狀態,但暫停虛擬機與備用電源模式不一樣。 – 2010-06-09 20:58:27