タイトルの通りです。「テキスト サービスと入力言語」コントロールパネルでいうと、
- 規定の言語
- 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 ();
}