214:Windowsレジストリにアクセスする
Windows のレジストリを操作するには _winreg モジュールを 使います。まだ Windows API の薄いラッパーにすぎないモジュールであるため、 新たな実装を募集中のようです。
レジストリの値を読む
レジストリを開くには_winreg.OpenKey? 、値を読むには _winreg.QueryValueEx? を用います。 では、Windows XP で前回メモ帳を終了したときのウィンドウの X, Y座標を読んでみます。
import _winreg
reg_notepad = _winreg.OpenKey(
_winreg.HKEY_CURRENT_USER,
'Software\\Microsoft\\Notepad'
)
try:
print _winreg.QueryValueEx(reg_notepad, 'iWindowPosX')[0]
print _winreg.QueryValueEx(reg_notepad, 'iWindowPosY')[0]
finally:
_winreg.CloseKey(reg_notepad)
レジストリの値を列挙する
値を列挙するには_winreg.EnumValue? を使うのですが、 EnumValue? 関数は使い勝手が悪いので、次の enum_values ジェネレータでラップしておきます。
def enum_values(key):
u"""_winreg.EnumValue(key, index) を for 文で使える形に
"""
try:
i = 0
while True:
yield _winreg.EnumValue(key, i)
i += 1
except EnvironmentError:
pass
次のコードは enum_values ジェネレータを用いてメモ帳関連のレジストリ値を列挙します。
reg_notepad = _winreg.OpenKey(
_winreg.HKEY_CURRENT_USER,
'Software\\Microsoft\\Notepad'
)
try:
for name, value, type_ in enum_values(reg_notepad):
print name, value
finally:
_winreg.CloseKey(reg_notepad)
次の read_values 関数は enum_values ジェネレータによる値の列挙を利用して レジストリの名前つき値を収めた辞書を作成します。
def read_values(key):
u"""開かれているレジストリの値を辞書で返す
"""
values = {}
for name, value, index in enum_values(key):
values[name] = value
return values
次のコードは先ほど作った read_values 関数を用いて 前回メモ帳を終了したときのウィンドウの X, Y座標を表示するものです。
reg_notepad = _winreg.OpenKey(
_winreg.HKEY_CURRENT_USER,
'Software\\Microsoft\\Notepad'
)
try:
values = read_values(reg_notepad)
finally:
_winreg.CloseKey(reg_notepad)
print values['iWindowPosX']
print values['iWindowPosY']
レジストリの値を変更する
レジストリの値を変更するには、レジストリを開く際に用いる _winreg.OpenKey? の第4引数に_winreg.KEY_WRITE フラグを渡しておく必要があります。 読み書きを同時に行うには _winreg.KEY_READ | _winreg.KEY_WRITE のように フラグの論理和を渡してください。 第3引数は意味を持たないようですが 0 を入れておくようにしてください。
値を書き込むには _winreg.SetValueEx? を用います。 第4引数には _winreg.REG_SZ(ヌル終端文字列)、 _winreg.REG_DWORD(32ビットの数)のような データの型を示す定数を入れます。 第3引数には 0 を入れておくようにしてください。
次のコードは前回メモ帳を終了したときのウィンドウの X, Y座標を 40, 80 に上書きします。
reg_notepad = _winreg.OpenKey(
_winreg.HKEY_CURRENT_USER,
'Software\\Microsoft\\Notepad',
0,
_winreg.KEY_WRITE
)
try:
_winreg.SetValueEx(
reg_notepad,
'iWindowPosX',
0,
_winreg.REG_DWORD, # 型は32ビット数値
40,
)
_winreg.SetValueEx(
reg_notepad,
'iWindowPosY',
0,
_winreg.REG_DWORD, # 型は32ビット数値
80,
)
finally:
_winreg.CloseKey(reg_notepad)