2010-06-16 119 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值已更改,而不是其他代码。 (我不知道有什么方法可以听取具体的数值。)