< UNICODEの列と文字列リテラルとUNIONするSQL | 圧縮フォルダを作成してコピーする WSH スクリプト >

November 29, 2007

入力システムを列挙する WSH スクリプト

タイトルの通りです。「テキスト サービスと入力言語」コントロールパネルでいうと、

規定の言語
HKCU\Keyboard Layout\Preload\1
インストールされているサービス
HKCU\Keyboard Layout\Preload 以下の値のリスト
[追加] ボタンより追加可能な全IME
HKLM\SYSTEM\CurrentControlSet\Control\Keyboard Layouts 以下のサブキーのリスト

と言う具合に、レジストリに情報が格納されているのでこれらを取得します。お蔵入りスクリプトになってしまい、もったいないのでアップします。

//
// enumIme.js
//

// 定義済み HKEY
var HKEY_CLASSES_ROOT    = 0x80000000;
var HKEY_CURRENT_USER    = 0x80000001;
var HKEY_LOCAL_MACHINE    = 0x80000002;
var HKEY_USERS            = 0x80000003;
var HKEY_CURRENT_CONFIG = 0x80000005;
var HKEY_DYN_DATA        = 0x80000006;

// WMI の StdRegProv を使用する
var locator = new ActiveXObject ("WbemScripting.SWbemLocator");
var service = locator.ConnectServer (null, "root\\default");
var stdRegProv = service.Get ("StdRegProv");

// スクリプト ランタイム関連
var fileSystemObject = new ActiveXObject ('Scripting.FileSystemObject');
var wsShell = new ActiveXObject ('WScript.Shell');
var desktopPath = wsShell.SpecialFolders ('Desktop');

// ログファイル、Layout Text 等が SJIS では表示できない可能性があるため、ユニコードテキストで
var logFile = fileSystemObject.CreateTextFile (fileSystemObject.BuildPath (desktopPath, "imecheck.txt"), true, true);

// すべてのキーボードレイアウト
// HKLM\SYSTEM\CurrentControlSet\Control\Keyboard Layouts
var lmImeList = new SubKey (stdRegProv, HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control", "Keyboard Layouts");
lmImeList.getSubKeys ();

// 言語バーより選択可能なキーボードレイアウト
// HKCU\Keyboard Layout\Preload
var preload = new SubKey (stdRegProv, HKEY_CURRENT_USER, "Keyboard Layout", "Preload");

for (var item in preload.getRegValues ())
{
    logFile.Write (item);    // 値名は番号
    logFile.Write (":");

    // 値はキーボードレイアウトの番号
    logFile.WriteLine (preload.regValues [item].value);

    // キーボードレイアウトの番号より、情報を取り出す
    var keyObj = lmImeList.subKeys [preload.regValues [item].value.toUpperCase ()];
    if (keyObj == null) keyObj = lmImeList.subKeys [preload.regValues [item].value.toLowerCase ()];

    // 情報あり
    if (keyObj != null)
    {
        for (var item2 in keyObj.getRegValues ())
        {
            // 値名 "layout text" を探す
            if (-1 != item2.search (/layout text/i))
            {// 見つかった
                logFile.Write ("        ");
                logFile.Write (item2);
                logFile.Write ("(" + keyObj.regValues [item2].typeName + ")");
                logFile.Write ("\t:");
                logFile.WriteLine (keyObj.regValues [item2].value);
            }
        }
    }
}

logFile.WriteBlankLine ();

// Keyboard Layouts のリスト
logFile.WriteLine (lmImeList.path);
writeImeList (logFile, lmImeList, "");

// ファイルを閉じる
logFile.Close ();

// 終了
WScript.echo ("完了しました");

//
// キーボードレイアウトのリストを出力する
//
function writeImeList (file, keyObj, padding)
{
    var item;
    var pad = padding + "  ";

    for (item in keyObj.getSubKeys ())
    {
        file.WriteLine (pad + keyObj.subKeys[item].name);
        writeImeList (file, keyObj.subKeys[item], pad);
    }

    for (item in keyObj.getRegValues ())
    {
        file.Write (pad);
        file.Write (item);
        file.Write ("(" + keyObj.regValues[item].typeName + ")");
        file.Write ("\t:");
        file.WriteLine (keyObj.regValues[item].value);
    }
    file.WriteLine ();
}



// レジストリキーオブジェクトのコンストラクタ
function SubKey (regProv, hDefKey, parentSubKey, name)
{
    //
    // メンバの初期化
    //
    this.regProv = regProv;
    this.hDefKey = hDefKey;
    this.parentSubKey = parentSubKey;
    this.name = name;
    this.path = parentSubKey + "\\" + name;
    this.subKeys = null;
    this.regValues = null;

    //
    // メソッドの定義
    //

    // サブキーのコレクションを取得
    this.getSubKeys = function ()
    {
        if (!this.subKeys)
        {
            var method = this.regProv.Methods_.Item ("EnumKey");
            var inParameter = method.InParameters.SpawnInstance_ ();
            inParameter.hDefKey = this.hDefKey;
            inParameter.sSubKeyName = this.path;
            var outParameter = this.regProv.ExecMethod_ (method.Name, inParameter);
            this.subKeys = new Array ();
            if (outParameter.sNames != null)
            {
                var subKeys = outParameter.sNames.toArray ();
                for (var i = 0; i < subKeys.length; i ++)
                {
                    this.subKeys [subKeys [i]] = new SubKey (this.regProv, this.hDefKey, this.path, subKeys [i]);
                }
            }
        }
        return this.subKeys;
    }

    // キー内の値の取得
    this.getRegValues = function ()
    {
        if (!this.regValues)
        {
            var method = this.regProv.Methods_.Item ("EnumValues");
            var inParameter = method.InParameters.SpawnInstance_ ();
            inParameter.hDefKey = this.hDefKey;
            inParameter.sSubKeyName = this.path;
            var outParameter = this.regProv.ExecMethod_ (method.Name, inParameter);
            this.regValues = new Array ();
            if (outParameter.sNames != null)
            {
                var names = outParameter.sNames.toArray ();
                var types = outParameter.Types.toArray ();
                var typeNames = new Array (
                    ""                                ,     // 0
                    "REG_SZ"                        ,     // 1
                    "REG_EXPAND_SZ"                 ,     // 2
                    "REG_BINARY"                    ,     // 3
                    "REG_DWORD"                     ,     // 4
                    "REG_DWORD_BIG_ENDIAN"            ,     // 5
                    "REG_LINK"                        ,     // 6
                    "REG_MULTI_SZ"                    ,     // 7
                    "REG_RESOURCE_LIST"             ,     // 8
                    "REG_FULL_RESOURCE_DESCRIPTOR"    ,     // 9
                    "REG_RESOURCE_REQUIREMENTS_LIST",     // 10
                    "REG_QWORD"                    );     // 11
                var getTypeValues = new Array (
                    null,
                    getStringValue,
                    getExpandedStringValue,
                    getBinaryValue,
                    getDWORDValue,
                    getDWORDValue,
                    null,
                    getMultiStringValue,
                    null,
                    null,
                    null,
                    getQWORDValue);

                for (var i = 0; i < names.length; i ++)
                {
                    this.regValues [names [i]] = new Object ();
                    this.regValues [names [i]].name = names [i];
                    this.regValues [names [i]].type = types [i];
                    this.regValues [names [i]].typeName = typeNames [types [i]];
                    this.regValues [names [i]].value = "";
                    var fn = getTypeValues [types [i]];
                    if (fn)
                    {
                        this.regValues [names [i]].value = fn (this.regProv, this.hDefKey, this.path, names [i]);
                    }
                }
            }
        }
        return this.regValues;
    }
    return this;
}


// 文字列値取得
function getStringValue (regProv, hDefKey, sSubKeyName, sValueName)
{
    var method = regProv.Methods_.Item ("GetStringValue");
    var inParameter = method.InParameters.SpawnInstance_ ();
    inParameter.hDefKey = hDefKey;
    inParameter.sSubKeyName = sSubKeyName;
    inParameter.sValueName = sValueName;
    var outParameter = regProv.ExecMethod_ (method.Name, inParameter);
    return outParameter.sValue;
}

// 展開済み文字列値取得
function getExpandedStringValue (regProv, hDefKey, sSubKeyName, sValueName)
{
    var method = regProv.Methods_.Item ("GetExpandedStringValue");
    var inParameter = method.InParameters.SpawnInstance_ ();
    inParameter.hDefKey = hDefKey;
    inParameter.sSubKeyName = sSubKeyName;
    inParameter.sValueName = sValueName;
    var outParameter = regProv.ExecMethod_ (method.Name, inParameter);
    return outParameter.sValue;
}

// バイナリ値取得
function getBinaryValue (regProv, hDefKey, sSubKeyName, sValueName)
{
    var method = regProv.Methods_.Item ("GetBinaryValue");
    var inParameter = method.InParameters.SpawnInstance_ ();
    inParameter.hDefKey = hDefKey;
    inParameter.sSubKeyName = sSubKeyName;
    inParameter.sValueName = sValueName;
    var outParameter = regProv.ExecMethod_ (method.Name, inParameter);
    var str = "";
    var ary = outParameter.uValue.toArray ();
    for (var i = 0; i < ary.length; i ++)
    {
        str += ary [i].toString (16) + ((i + 1) % 8)? " ": "\n";
    }
    return str;
}

// DWORD 値取得
function getDWORDValue (regProv, hDefKey, sSubKeyName, sValueName)
{
    var method = regProv.Methods_.Item ("GetDWORDValue");
    var inParameter = method.InParameters.SpawnInstance_ ();
    inParameter.hDefKey = hDefKey;
    inParameter.sSubKeyName = sSubKeyName;
    inParameter.sValueName = sValueName;
    var outParameter = regProv.ExecMethod_ (method.Name, inParameter);
    return outParameter.uValue.toString (16);
}

// QWORD 値取得
function getQWORDValue (regProv, hDefKey, sSubKeyName, sValueName)
{
    var method = regProv.Methods_.Item ("GetQWORDValue");
    var inParameter = method.InParameters.SpawnInstance_ ();
    inParameter.hDefKey = hDefKey;
    inParameter.sSubKeyName = sSubKeyName;
    inParameter.sValueName = sValueName;
    var outParameter = regProv.ExecMethod_ (method.Name, inParameter);
    return outParameter.uValue.toString (16);
}

// マルチ文字列値取得
function getMultiStringValue (regProv, hDefKey, sSubKeyName, sValueName)
{
    var method = regProv.Methods_.Item ("GetMultiStringValue");
    var inParameter = method.InParameters.SpawnInstance_ ();
    inParameter.hDefKey = hDefKey;
    inParameter.sSubKeyName = sSubKeyName;
    inParameter.sValueName = sValueName;
    var outParameter = regProv.ExecMethod_ (method.Name, inParameter);
    return outParameter.sValue.toArray ().toString ();
}

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/1936

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?