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"

私の問題は、これがトリガーされないことです。イベントは常にタイムアウトします。(私が従おうとしている登録キーは壁紙です)

[

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\ControlPanel \ Desktop\WallPaper」が作成されていることがわかります。鍵。

コードを変更して変更をリッスンする1つの方法は次のとおりです。

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に変更されたことに注意してください。ドキュメントからこれは:

キーの値の変更を呼び出し元に通知します。これには、値の追加または削除、または既存の値の変更が含まれます。

コードの残りの部分は機能しますが、変更されたのがWallPaper値であり、他の値ではないことを確認するために、前後にQueryValueEx関数を使用する必要があります。(特定の値をリッスンする方法がわかりません。)

于 2010-07-17T22:19:44.620 に答える