跳到主要內容

該死的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,還沒有什麼大的問題。

留言

這個網誌中的熱門文章

Portable Python

我常常需要把Python寫的script帶到其他電腦使用,因此,一個免安裝,可攜帶的Python就顯得十分重要。最近看過了幾個可攜式Python的方案,下面這個PortablePython是我覺得最合我意的方案。因為它提供了大部分會用到的Python module及工具,甚至連wxPython及PyGame也有。同時也有好用的Python編輯器PyScripter。所有開發Python所需的開發工具都一應俱全了!把它放到隨身碟中,就不用到處幫人安裝Python了。 PortablePython : http://www.portablepython.com/

一個Python程式可幫檔名加上日期與時間

很多時候,我們希望能夠將檔案或是目錄名稱加上一個時間及日期,以便release。所以,我就寫了一個小小的程式來達到這個目的。我把這個程式貼上來,讓有興趣的人可以拿去使用。 -- #!/usr/bin/env python # -*- coding: ascii -*- """ Usage: cfgfn.py [filename or directory list] """ import sys import os import time import re import glob ro = re.compile(r'(?P<FN> .*)-[0-9]{8}-[0-9]{4}(?P<EXT> .*)') for fnl in sys.argv[1:]: for fn in glob.glob(fnl): mo = ro.match(fn) if mo: pre = mo.group('FN') ext = mo.group('EXT') else: pre, ext = os.path.splitext(fn) newFn = pre + time.strftime('-%Y%m%d-%H%M') + ext os.rename(fn, newFn) print 'Rename %s -> %s' % (fn, newFn)