#283 | 任意のレジストリキーにアクセスするには? | VBA、API | |
VBAのSaveSettingステートメントやGetSetting関数では、あらかじめ決められたキー、 「HKEY_CURRENT_USER\Software\VB and VBA Program Settings」 の下のエントリしか操作できません。しかし、WindowsAPIを使えば、どんなレジストリでも操作することができます。 以下の「SetRegValue」と「GetRegValue」の2つのプロシージャは、「#154 Accessのレジストリ情報を直接書き換える方法」の内容を、より汎用的なプロシージャとして拡張したものです。標準モジュールに書くことを前提としています。 Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _
(ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _ ByVal samDesired As Long, phkResult As Long) As Long Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" _ (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _ ByVal dwType As Long, ByVal lpData As Any, ByVal cbData As Long) As Long Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _ (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _ lpType As Long, lpData As Any, lpcbData As Long) As Long Private Const ERROR_SUCCESS = 0 Private Const REG_SZ = 1 Private Const KEY_QUERY_VALUE = &H1 Private Const KEY_SET_VALUE = &H2 Public Const HKEY_CLASSES_ROOT = &H80000000 Public Const HKEY_CURRENT_USER = &H80000001 Public Const HKEY_LOCAL_MACHINE = &H80000002 Public Const HKEY_USERS = &H80000003 Public Const HKEY_CURRENT_CONFIG = &H80000005 Public Function SetRegValue(lngRootKey As Long, strSubKey As String, _ strName As String, strValue As String) '概要 レジストリに値を設定する '引数 lngRootKey : レジストリルートキー ' strSubKey : レジストリサブキー ' strName : 名前 ' strValue : 設定する値 '返値 成功時 True、失敗時 False Dim lngRet As Long Dim hWnd As Long 'ハンドルを開く hWnd = Application.hWndAccessApp lngRet = RegOpenKeyEx(lngRootKey, strSubKey, 0, KEY_SET_VALUE, hWnd) '値を設定 lngRet = RegSetValueEx(hWnd, strName, 0, REG_SZ, ByVal strValue, LenB(strValue)) 'ハンドルを閉じる RegCloseKey hWnd 'エラーを確認して返り値に設定 SetRegValue = (lngRet = ERROR_SUCCESS) End Function Public Function GetRegValue(lngRootKey As Long, strSubKey As String, _ strName As String) As String '概要 レジストリの値を取得する '引数 lngRootKey : レジストリルートキー ' strSubKey : レジストリサブキー ' strName : 名前 '返値 取得したレジストリの値 Dim lngRet As Long Dim hWnd As Long Dim strValue As String 'ハンドルを開く hWnd = Application.hWndAccessApp lngRet = RegOpenKeyEx(lngRootKey, strSubKey, 0, KEY_QUERY_VALUE, hWnd) '受け取り値用のバッファを確保 strValue = String(255, " ") '値を取得 lngRet = RegQueryValueEx(hWnd, strName, 0, 0, ByVal strValue, LenB(strValue)) 'ハンドルを閉じる RegCloseKey hWnd '取得した値から後続のNullを取り除く strValue = Left(strValue, InStr(strValue, vbNullChar) - 1) '取得した値を返り値に設定 GetRegValue = strValue End Function 各プロシージャの呼び出し例: Sub RegTest()
Dim strRegValue As String 'デスクトップの壁紙のファイル名をレジストリより取得 strRegValue = GetRegValue(HKEY_CURRENT_USER, "Control Panel\desktop", "Wallpaper") Debug.Print strRegValue '新しい壁紙のファイル名をレジストリに設定 strRegValue = "C:\Windows\大草原の風.bmp" SetRegValue HKEY_CURRENT_USER, "Control Panel\desktop", "Wallpaper", strRegValue End Sub ※このサンプルプログラムの場合、実際にはデスクトップの壁紙は変更されません。変更後のレジストリの値が反映されていないためです。変更値を反映させるためには、Windowsを再起動するか、「SystemParametersInfo」API関数を使って再起動せずに反映させる必要があります。今回はレジストリの取得と設定の説明ですので、それに関しては割愛します。 |
|||
|
Copyright © T'sWare All rights reserved |