2

每次修改注册表值时,我都试图触发一个事件。

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) 手动更改 regedit 中的注册表值来触发事件 2) 运行此脚本的自动脚本:

从 ctypes 导入windll

从 win32con 导入 *

windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0,"C:\wall.jpg",SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE)

]

提前感谢您的帮助:)

编辑:: 抱歉格式化

4

1 回答 1

3

“WallPaper”是一个而不是键/子键。因此,如果您打开 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)

请注意,我们不再使用 WallPaper 子项,并注意“通知 fitler”已更改为 NOTIFY_CHANGE_LAST_SET;从文档这将:

通知调用者键值的更改。这可以包括添加或删除值,或更改现有值。

您的其余代码将起作用,但您需要在前后使用 QueryValueEx 函数来确保更改的是 WallPaper 值而不是其他值。(我不知道如何监听特定值。)

于 2010-07-17T22:19:44.620 回答