2010-06-16 117 views
2

我試圖在每次修改註冊表值時觸發一個事件。Python win32api註冊表項更改

import win32api 
import win32event 
import win32con 
import _winreg 
key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER,'Control Panel\Desktop',0,_winreg.KEY_READ) 
sub_key = _winreg.CreateKey(key,'Wallpaper') 
evt = win32event.CreateEvent(None,0,0,None) 
win32api.RegNotifyChangeKeyValue(sub_key,1,win32api.REG_NOTIFY_CHANGE_ATTRIBUTES,evt,True) 
ret_code=win32event.WaitForSingleObject(evt,3000) 
if ret_code == win32con.WAIT_OBJECT_0: 
    print "CHANGED" 
if ret_code == win32con.WAIT_TIMEOUT: 
    print "TIMED" 

我的問題是,這是從來沒有觸發過,事件總是超時。 (我試圖遵循了reg關鍵是牆紙)

[

請注意我觸發1時)在註冊表編輯器2)運行這個自動運行的腳本手動更改註冊表值:

從ctypes的導入WINDLL

從win32con進口*

windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER,0,「C:\ wall.jp g「,SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE)

]

感謝提前任何幫助:)

編輯::關於格式化

回答

3

「壁紙」 是一個不是一個鍵/子項抱歉。因此,如果您啓動了regedit.exe,您會注意到您創建了一個與「HKCU \ Control Panel \ Desktop」下的「WallPaper」值不同的新鍵「HKCU \ Control Panel \ Desktop \ WallPaper」鍵。

這裏有一個方法來修改你的代碼來監聽更改:

key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, 'Control Panel\Desktop', 0, _winreg.KEY_READ) 
evt = win32event.CreateEvent(None, 0, 0, None) 
win32api.RegNotifyChangeKeyValue(key, 1, win32api.REG_NOTIFY_CHANGE_LAST_SET, evt, True) 

請注意,我們不使用牆紙子項更多的,請注意,「通知fitler」已更改爲NOTIFY_CHANGE_LAST_SET;從docs這將:

通知調用者對密鑰值的更改。這可以包括添加或刪除值或更改現有值。

其餘的代碼可以正常工作,但需要在前後使用QueryValueEx函數來確保WallPaper值已更改,而不是其他代碼。 (我不知道有什麼方法可以聽取具體的數值。)