ユーザー指定キーのサブキーを列挙          <TOP>


SHRegOpenUSKey ユーザー指定キーをオープン
SHRegEnumUSKey ユーザー指定キーのサブキーを列挙
SHRegCloseUSKey ユーザー固有のレジストリキーをクローズ
 

 

'================================================================
'= ユーザー指定キーのサブキーを列挙
'=    (SHRegOpenUSKey.bas)
'================================================================
#include "Windows.bi"

' ユーザー指定キーをオープン
Declare Function Api_SHRegOpenUSKey& Lib "Shlwapi" Alias "SHRegOpenUSKeyA" (ByVal pszPath$, ByVal samDesired&, ByVal hRelativeUSKey&, phNewUSKey&, ByVal fIgnoreHKCU&)

' ユーザー指定キーのサブキーを列挙
Declare Function Api_SHRegEnumUSKey& Lib "Shlwapi" Alias "SHRegEnumUSKeyA" (ByVal hUSKey&, ByVal dwIndex&, ByVal pszName$, pcchName&, ByVal enumRegFlags&)

' ユーザー固有のレジストリキーをクローズ
Declare Function Api_SHRegCloseUSKey& Lib "Shlwapi" Alias "SHRegCloseUSKey" (ByVal hUSKey&)

#define KEY_QUERY_VALUE &H1             'サブキーデータを問い合わせるためのアクセス権
#define ERROR_SUCCESS &H0               '正常終了の戻り値を示す

#define SHREGENUM_DEFAULT &H0           'HKEY_CURRENT_USERを列挙。HKEY_CURRENT_USERにキーがない場合、HKEY_LOCAL_MACHINEを列挙
#define SHREGENUM_HKCU &H1              'HKEY_CURRENT_USERを列挙
#define SHREGENUM_HKLM &H10             'HKEY_LOCAL_MACHINEを列挙
#define SHREGENUM_BOTH &H11             'HKEY_LOCAL_MACHINE・SHREGENUM_HKLMを列挙

#define REGSTR_MAX_VALUE_LENGTH 256
#define ERROR_NO_MORE_ITEMS 259         '

Var Shared List1 As Object
Var Shared Radio(2) As Object
Var Shared Button1 As Object

List1.Attach GetDlgItem("List1") : List1.SetFontSize 14 : List1.SetWindowSize 216, 78
For i = 0 To 2
    Radio(i).Attach GetDlgItem("Radio" & Trim$(Str$(i + 1))) : Radio(i).SetFontSize 14
Next i
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Function Index bdecl () As Integer
Function Index()
    Index = Val(Mid$(GetDlgRadioSelect("Radio1"), 6)) - 1
End Function

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    ShowWindow -1
    Cls
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hRegSubKey As Long
    Var sRegSubKey As String
    Var sRegEnumSubKey As String
    Var SubKeyIndex As Long
    Var SubKeyNameLength As Long
    Var RegFlags As Long
    Var Ret As Long
    
    'リストボックスをクリア
    List1.ResetContent

    'サブキーを列挙するキーのパスを設定
    sRegSubKey = ""

    'ユーザー固有のレジストリを問い合わせモードでオープン
    Ret = Api_SHRegOpenUSKey(sRegSubKey, KEY_QUERY_VALUE, 0, hRegSubKey, CLng(1))

    'オープンエラーのときは
    If Ret <> ERROR_SUCCESS Then
        'エラーを表示して終了
        List1.AddString "キーのオープンに失敗しました"
        Exit Sub
    End If

    Select Case Index
        Case 0
            RegFlags = SHREGENUM_DEFAULT
        Case 1
            RegFlags = SHREGENUM_HKCU
        Case 2
            RegFlags = SHREGENUM_HKLM
    End Select

    'サブキーのインデックスを初期化
    SubKeyIndex = 0

    'サブキーの列挙が完了するまで処理を反復
    Do
        '列挙するサブキー名の格納バッファを初期化
        sRegEnumSubKey = Space$(REGSTR_MAX_VALUE_LENGTH)

        'バッファサイズを初期化
        SubKeyNameLength = Len(sRegEnumSubKey)

        'インデックスで指定したサブキーを取得
        Ret = Api_SHRegEnumUSKey(hRegSubKey, SubKeyIndex, sRegEnumSubKey, SubKeyNameLength, RegFlags)

        '列挙するサブキーがないとき
        If Ret = ERROR_NO_MORE_ITEMS Then
            '反復処理終了
            Exit Do
        End If

        'リストボックスに取得したサブキーを追加
        List1.AddString Left$(sRegEnumSubKey, InStr(sRegEnumSubKey, Chr$(0)) - 1)

        'サブキーのインデックスを加算
        SubKeyIndex = SubKeyIndex + 1
    Loop

    'オープンしたレジストリをクローズ
    Ret = Api_SHRegCloseUSKey(hRegSubKey)
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End