Python win32api изменение ключа реестра - PullRequest
2 голосов
/ 17 июня 2010

Я пытаюсь вызвать событие каждый раз, когда изменяется значение реестра.

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 import windll

из win32con import *

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

]

Спасибо за любую помощь заранее:)

EDIT :: извините за форматирование

1 Ответ

3 голосов
/ 18 июля 2010

"WallPaper" - это значение , а не ключ / подраздел.Поэтому, если вы запустите regedit.exe, вы заметите, что создали новый ключ «HKCU \ Control Panel \ Desktop \ WallPaper», который отличается от значения «WallPaper» в «HKCU \ Control Panel \ Desktop»key.

Вот один из способов изменить ваш код для прослушивания изменений:

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, и обратите внимание, что "уведомитель-установщик" имеетбыл изменен на NOTIFY_CHANGE_LAST_SET;из документов это будет:

Уведомлять вызывающего абонента об изменениях значения ключа.Это может включать добавление или удаление значения или изменение существующего значения.

Остальной код будет работать, но вам нужно будет использовать функцию QueryValueEx до и после, чтобы убедиться, что это былоЗначение WallPaper, которое изменилось, а не другое.(Я не знаю, как прислушиваться к конкретным значениям.)

...