Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python查看Windows注册表中的更改_Python_Winapi_Registry_Pywin32 - Fatal编程技术网

如何使用Python查看Windows注册表中的更改

如何使用Python查看Windows注册表中的更改,python,winapi,registry,pywin32,Python,Winapi,Registry,Pywin32,我想观察某个注册表项的变化,并在它与Python发生变化时立即执行一些自动操作,例如,程序在启动过程中更改注册表项,我希望在启动后立即将注册表项强制为旧值。以下示例代码将强制计算器以日期时间模板启动,而不管上次使用的模板是什么。它使用了一种非常快速的方法来访问大多数Windows内部构件并自动化COM感知应用程序: import win32api import win32con import logging logging.basicConfig(level=logging.DEBUG, fo

我想观察某个注册表项的变化,并在它与Python发生变化时立即执行一些自动操作,例如,程序在启动过程中更改注册表项,我希望在启动后立即将注册表项强制为旧值。

以下示例代码将强制计算器以日期时间模板启动,而不管上次使用的模板是什么。它使用了一种非常快速的方法来访问大多数Windows内部构件并自动化COM感知应用程序:

import win32api
import win32con
import logging 
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s', filename='watchRegistry.log')
log = logging.getLogger()

hiveToWatch = win32con.HKEY_CURRENT_USER
keyToWatch = r'Software\Microsoft\Calc'

values = {(hiveToWatch, keyToWatch, 'DateTime'): (win32con.REG_DWORD, 1),
          (hiveToWatch, keyToWatch, 'Templates'): (win32con.REG_DWORD, 0),
          (hiveToWatch, keyToWatch, 'UnitConv'): (win32con.REG_DWORD, 0)}

while True:

    for (hive, key, valueName), (valueType, value) in values.items():
        handleWithSetRights = win32api.RegOpenKeyEx(hive, key, 0, win32con.KEY_SET_VALUE)
        log.info(r'Setting %s\%s\%s = %s' % (hive, key, valueName, value))
        win32api.RegSetValueEx(handleWithSetRights, valueName, 0, valueType, value)
        win32api.RegCloseKey(handleWithSetRights)

    # Open and close the handle here as otherwise the set operation above will trigger a further round
    handleToBeWatched = win32api.RegOpenKeyEx(hiveToWatch, keyToWatch, 0, win32con.KEY_NOTIFY)
    win32api.RegNotifyChangeKeyValue(handleToBeWatched, False, win32api.REG_NOTIFY_CHANGE_LAST_SET, None, False)
    win32api.RegCloseKey(handleToBeWatched)

这个问题似乎离题了,因为它是一个为我编写的代码,而不是一个编程问题。我想根据我的要求回答我自己的问题。因此,我没有在问题中包含我自己的研究,只是具体说明了我最初的问题是什么。在这种情况下,我应该在原始问题中加入更多的研究,还是您认为整个问题对于堆栈溢出或其他离题问题来说太容易解决?+1感谢您对堆栈溢出的补充。我不经常使用Windows,但这看起来很有用。我很高兴Python可以如此省钱地完成这项任务。是否可以使用Python windows扩展列出所有windows注册表项?您可以在中看到所有可用的函数。要查看的函数是RegEnumKey(Ex)。但是,请记住,如果要递归枚举所有注册表项,则会有很多注册表项。为了与Python 2.7到3.6兼容,请使用
values.items()
,而不是
values.iteritems()
(后者在3.x中被弃用,并且
items()的性能也会受到影响)
在这种情况下,使用较旧的Python版本可以忽略不计)。另外,
keyToWatch
初始化中的反斜杠对于某些键来说是有问题的-在使用不应解释为转义序列的反斜杠时,始终指定raw(
keyToWatch=r'Software\Microsoft\Calc'
)。