home changes contents help options

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)