該死的WTSRegisterSessionNotification()在Vista下面沒用了

最近才發現WTSRegisterSessionNotification()這個Function在Vista下面已經失去作用了。變成之前在XP下面可以在切換使用者後繼續工作的程式,現在沒有作用了!上網找了一下,發現新的替代方案要去寫Service程式。天阿!哪那麼多閒功夫阿。

還好,後來發現WTSGetActiveConsoleSessionId()這個function在Vista下面還有作用。因此,透過Timer的方式定期去呼叫這個函式確定Active console session是否不一樣了。一旦不一樣,就表示session被切換了。當切換回原來的session時,就會得到一樣的id。如此便知道已經回到原來的Session了。程式概念大概如下:

DWORD MyId = -1;  
BOOLEAN SessionChanged;  

// 程式啟動時,先取得目前的session id並且記錄下來。  
OnCreate()  
{  
 MyId = WTSGetActiveConsoleSessionId();  
 SessionChanged = FALSE;  
}  

OnTimer()  
{  
 if (SessionChanged)  
 {  
 if (MyId == WTSGetActiveConsoleSessionId())  
 {  
 SessionChanged = FALSE;  
 // Session已經重新回復到原來的session.  
 // 在這裡進行必要的回復工作。  
 }  
 }  
 else  
 {  
 if (MyId != WTSGetActiveConsoleSessionId())  
 {  
 SessionChanged = TRUE;  
 // Session已經被改掉了,需要在這裡趕快進行必要的處理。  
 }  
 }  
}  

這其實並不是一個很好的作法,因為要透過一個Timer定期的去polling,Timer的週期太短容易造成系統的負擔,太長的話,可能會抓不到Session的變化。不過,經過一些實驗之後,發現大約2-4秒的週期去polling,還沒有什麼大的問題。

comments powered by Disqus