それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

JScriptでレジストリを操作する方法まとめ。

よく使うレジストリの読み書きはJScriptで書きためていたりする。

その中から必要なことをまとめた。

レジストリの種類

名前空間がある。名前空間レジストリを管理されている。ユーザー・システム毎に管理されている。
RegRead、RegWriteで指定する。

ルート・キー 省略名 概要
HKEY_CURRENT_USER HKCU 現在ログイン中のユーザーに関する諸設定
HKEY_LOCAL_MACHINE HKLM システム全体、全登録ユーザーに関する設定情報
HKEY_CLASSES_ROOT HKCR 拡張子やアイコン情報など、Windowsで扱うファイル全般に関する情報を管理
HKEY_USERS HKU ユーザー別の設定を管理
HKEY_CURRENT_CONFIG HKCC ハードウェア設定などの設定
http://www.atmarkit.co.jp/fwin2k/win2ktips/453regaccess/regaccess.html

レジストリ用語

レジストリで使う用語。「型」に関するものは最初は戸惑う。レジストリに格納されるデータは専用の名称を持つ。

データ型 概要
REG_SZ 文字列
REG_DWORD 整数
REG_BINARY 2進数(VBArray)
REG_EXPAND_SZ 展開可能な文字列(例:%JAVA_HOME%\bin)
REG_MULTI_SZ 文字列配列(VBArray)

値エントリのデータ型

http://www.atmarkit.co.jp/fwin2k/win2ktips/453regaccess/regaccess.html

ま、別に知らなくても良いけど。

レジストリを読み込む

//壁紙を読み込む
var WshShell=new ActiveXObject("WScript.Shell")
key = "HKCU\\Software\\Microsoft\\Internet Explorer\\Desktop\\General\\Wallpaper"
value = shell.RegRead(key)
WScript.Echo(value) //壁紙パス

レジストリに書き込む

//壁紙を読み込む
var WshShell=new ActiveXObject("WScript.Shell")
path = "%USERPROFILE%\\Pictures\\壁紙\\201004_b_1280.jpg"
key = "HKCU\\Software\\Microsoft\\Internet Explorer\\Desktop\\General\\Wallpaper"
shell.RegWrite( wallpaper_key_path, paths[0], "REG_EXPAND_SZ" )//書き込み
//UpdatePerUserSystemParameters を実行して反映させる。
shell.Run( "RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters ",1,true)

レジストリが簡単に変更できることが分かる。

レジストリを反映させる

//UpdatePerUserSystemParameters を実行して反映させる。
shell.Run( "RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters ",1,true)

UpdatePerUserSystemParameters の実行はタイミングがうまく行かなくて、壁紙が変更されないこともある。

Explorerを再起動する。

レジストリを無理矢理反映させるため、Explorerを消してみるとか。

/**
* WMI をWSHから起動して引数に一致するなまえのプロセスを殺す。
* @argment program_name プログラム名(たいていは ***.exe)
*/
function TerminateProcess( program_name ){
  var strComputer = ".";
  var name = "winmgmts:\\\\" + strComputer + "\\root\\CIMV2";
  var oWmis = GetObject(name);
  var cols = oWmis.ExecQuery("SELECT * FROM Win32_Process WHERE Caption = '"+ program_name +"'")
  var list = new Enumerator(cols)
  for(;!list.atEnd(); list.moveNext()){
    var proc = list.item();
    proc.terminate()
  }

}
if( WScript.Arguments.Length > 0 ){
  var name = WScript.Arguments.Item(0)
  DesktopFolder( name )
  TerminateProcess("explorer.exe");
}

レジストリのサブキーを列挙して表示する。

var locator = new ActiveXObject("WbemScripting.SWbemLocator");
var server = locator.ConnectServer(null, "root\\default");
var registry = server.Get("StdRegProv");

var method = registry.Methods_.Item("EnumKey");
var iParams = method.InParameters.SpawnInstance_();

iParams.hDefKey = 0x80000000; // HKEY_CLASSES_ROOT
iParams.sSubKeyName = ""; 

var result = registry.ExecMethod_(method.Name, iParams);
var keys = result.sNames.toArray();

for (var i = 0, l = keys.length; i < l; i++) {
    WScript.Echo(keys[i]);
}
http://moz-addon.g.hatena.ne.jp/ZIGOROu/20070808/1186562694

サブキーを列挙して、find 的な事をやりたいな。とおもったけど面倒だ。
特定のキーを探して消したいとか手作業でイイヤ。