1. 程式人生 > >winreg操作windows登錄檔詳解示例

winreg操作windows登錄檔詳解示例

#coding:utf-8

#=====================================================================
#=====本程式演示了WINREG操作WINDOWS登錄檔的所有常見操作
#=====作者:dengpeiyou QQ:86074731 2019.01.12
#=====================================================================
import ctypes
import winreg
import os

#===============================================================開啟子鍵
key=None
try:
key=winreg.OpenKey(winreg.HKEY_CURRENT_USER,r"software")
except Exception as error_txt:
#提示
#ctypes.windll.user32.MessageBoxW(None,str(error_txt),'開啟',0)
ctypes.windll.user32.MessageBoxW(None,'開啟登錄檔異常','開啟',0)
os._exit(0)

#如果開啟則關閉
if key:
winreg.CloseKey(key)

#================================================================新建(修改)子鍵
winreg.CreateKey(winreg.HKEY_CURRENT_USER,r'software\dengpeiyou')
winreg.CreateKey(winreg.HKEY_CURRENT_USER,r'software\dengpeiyou\testa')
#新增鍵值
list_keys=[('aa1',winreg.REG_SZ,'a001'),('aa2',winreg.REG_DWORD,64),('aa3',winreg.REG_SZ,'99999')]
key_a=winreg.OpenKey(winreg.HKEY_CURRENT_USER,r'software\dengpeiyou\testa',0,winreg.KEY_SET_VALUE)
#建立1+3個鍵值
winreg.SetValueEx (key_a, "", 0, winreg.REG_SZ,'55555') #名稱為空指定預設值
for i in range(len(list_keys)):
winreg.SetValueEx(key_a, list_keys[i][0], 0, list_keys[i][1], list_keys[i][2])
winreg.CreateKey(winreg.HKEY_CURRENT_USER,r'software\dengpeiyou\testb')
winreg.CreateKey(winreg.HKEY_CURRENT_USER,r'software\dengpeiyou\testc')
winreg.CloseKey(key_a)

#=================================================================讀取子值
key_a=winreg.OpenKey(winreg.HKEY_CURRENT_USER,r'software\dengpeiyou\testa',0,winreg.KEY_QUERY_VALUE)

#遍歷方法一
#項數
countkey=winreg.QueryInfoKey(key_a)[1] #返回元組(子值數,項數,長整數)
keylist=[]
for i in range(countkey):
name, key_value, value_type = winreg.EnumValue(key_a, i)
keylist.append((name,key_value,value_type))
print(keylist)

#另一種遍歷方法
try:
i = 0
while True:
name, value, value_type = winreg.EnumValue(key_a, i)
i += 1
print("項名:%5s 值:%5s 型別:%1d" % (name, value, value_type))
except Exception as e:
pass
#print('查詢完了')

winreg.CloseKey(key_a)
#==================================================================刪除值和子鍵

key_name=r'software\dengpeiyou\testa'
key=winreg.OpenKey(winreg.HKEY_CURRENT_USER,key_name,0,winreg.KEY_SET_VALUE)
#這句正確執行的前提是前面開啟時加winreg.KEY_SET_VALUE引數,否則報錯無法執行
winreg.SetValueEx(key, "aa3", 0, winreg.REG_SZ,'123456') #修改一個存在的項值(如果不存在則新建)
try:
winreg.DeleteValue(key,"aa1") #而刪除值項相對簡單
except FileNotFoundError:
ctypes.windll.user32.MessageBoxW(None,'要刪除的值不存在','提示',16)

winreg.CloseKey(key)

#技術含量最大的一個函式,可以遞迴刪除所有子鍵和值(包括自身),請慎用!!!
def find_key(key_str):
try:
key=winreg.OpenKey(winreg.HKEY_CURRENT_USER,key_str)
except FileNotFoundError:
ctypes.windll.user32.MessageBoxW(None,'開啟登錄檔異常','提示',16)
return

countkey=winreg.QueryInfoKey(key)[0] #子鍵數
#print("%s有%d個子鍵."%(key_str,countkey))
if countkey!=0:
for i in range(countkey-1,-1,-1):
key_name=winreg.EnumKey(key,i) #取鍵名
find_key(key_str+"\\"+key_name)
try:
winreg.DeleteKey(winreg.HKEY_CURRENT_USER, key_str)
except FileNotFoundError:
pass

str1=r'software\dengpeiyou'
#find_key(str1)