Windows10 21H2に英語配列のBluetoothキーボードを追加して日本語キーボードと共存させるための設定支援PowerShellスクリプト

## はじめに
以前に「[Windows10 21H2で英語配列のBluetoothキーボードを追加して日本語キーボードと共存させる設定](https://qiita.com/e4rfx/items/3f9a5b884209aced37b5)」という記事を書きましたが、手順が複雑だったので、まずは現在の設定を確認するPowerShellスクリプトを作成してみました。レジストリ編集の際の一助になると思います。

## 前提
以下の記事の読者が対象です。

https://qiita.com/e4rfx/items/3f9a5b884209aced37b5

## コード
```chkkb.ps1
function Out-ContainerIDnFriendlyName($arg) {
	$FriendlyName = (gci -Path "Registry::$arg").GetValue("FriendlyName")
	if ( ! $FriendlyName) {
		$FriendlyName = "(null)"
	}
	echo (
		(gci -Path "Registry::$arg").GetValue("ContainerID") + "`t" +
		$FriendlyName
	)
}

# デフォルトキーボード設定を表示
echo "<<< Default Keyboard Settings >>>"
gp -Path HKLM:\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters |
	oss | ?{ $_.Contains("ver") } | ?{ ! $_.Contains("KOR") }

echo ""
# Bluetoothのデバイスをリストアップ
echo "<<< Bluetooth Devices >>>"
if (Test-Path HKLM:\SYSTEM\CurrentControlSet\Enum\BTHENUM) {
	echo "ContainerID`t`t`t`tFriendlyName"
	echo "-----------`t`t`t`t------------"
	gci -Path HKLM:\SYSTEM\CurrentControlSet\Enum\BTHENUM |
		?{ $_.Name.Contains("Dev_") } |
		%{ Out-ContainerIDnFriendlyName($_) }
} else {
	echo "There are no Bluetooth devices on this PC."
}

echo ""
# HID以下で"Service"が"kbdhid"に該当するものを順次表示
echo "<<< HID kbdhid Devices >>>"
echo "ContainerID`t`t`t`tFriendlyName"
echo "-----------`t`t`t`t------------"
gci -Path HKLM:\SYSTEM\CurrentControlSet\Enum\HID |
	?{ $_.Name.Contains("{") } |
	%{
		if ( (gci -Path "Registry::$_").GetValue("Service") -eq "kbdhid") {
			Out-ContainerIDnFriendlyName($_)
			echo "Registry path:"
			$regpath = (gci -Path "Registry::$_").Name + "\Device Parameters"
			$regpath
			echo "Device Parameters:"
			$devparam = gp -Path "Registry::$regpath"
			if ($devparam) {
				$devparam | oss | ?{ $_.Contains("Key") }
			} else {
				echo "(null)"
			}
			echo ""
		}
	} 
```

## 使い方
## 実行手順
* 上記のスクリプトを`chkkb.ps1`という名前で保存
* `.\chkkb.ps1`で実行
  * スクリプトの実行権でエラーが出た場合は、以下を実行してから再実行してください。
`Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force`

### 実行結果(例)
この例では、英語配列キーボード未接続のマシンでの結果を一部編集しています。([...]=省略部分)
```
<<< Default Keyboard Settings >>>
LayerDriver JPN            : kbd106.dll
OverrideKeyboardIdentifier : PCAT_106KEY
OverrideKeyboardType       : 7
OverrideKeyboardSubtype    : 2

<<< Bluetooth Devices >>>
ContainerID                             FriendlyName
-----------                             ------------
[...]
{ccf8303e-f27e-591c-980b-7d0877fda520}  Sample_Japanese_Keyboard

<<< HID kbdhid Devices >>>
ContainerID                             FriendlyName
-----------                             ------------
{ccf8303e-f27e-591c-980b-7d0877fda520}  (null)
Registry path:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HID\{[...]\Device Parameters
Device Parameters:
(null)
```

### 説明
#### デフォルトキーボード設定
`<<< Default Keyboard Settings >>>`以下がデフォルト設定に関する情報です。
共存のための日本語ベースの設定変更後は、この部分が以下のようになっている必要があります。

```
<<< Default Keyboard Settings >>>
LayerDriver JPN            : kbd106.dll
OverrideKeyboardIdentifier : PCAT_101KEY
```

#### Bluetoothデバイス
`<<< Bluetooth Devices >>>`以下にBluetoothデバイスが列挙されます。追加した英語キーボードを`FriendlyName`から特定し、その`ContainerID`を確認します。

#### HID以下で"Service"が"kbdhid"に該当
`<<< HID kbdhid Devices >>>`以下に、HIDで`Service`が`kbdhid`であるものが順次表示されます。上で確認した`ContainerID`が含まれるデバイスの`Registry path`をコピーし、レジストリエディタ(`regedit`)のアドレスバーに貼り付けて移動して必要なキーの追加をします。
`Device Parameters:`が何も設定されていなければ、例のように`(null)`と表示されます。
英語配列のキーボードを追加して設定した場合、`Device Parameters:`部分が以下のように表示されれば共存して使えるようになっているはずです。
```
Device Parameters:
KeyboardSubtypeOverride : 0
KeyboardTypeOverride    : 4
```



### 確認環境

* Windows10 Home 21H2
* PowerShell 5.1
  
```
OS 名:                  Microsoft Windows 10 Home
OS バージョン:          10.0.19044 N/A ビルド 19044
PSVersion:              5.1.19041.1320
```

## おわりに
とりあえず手元で動作は確認しましたが、不十分かもしれません。レジストリを読み解いて、必要な部分を抜き出すだけのツールですが、どこを設定すれば良いかがわかるので、調査の手間が省けると思います。レジストリの扱いに関して試行錯誤的なコードになっていると思います。コードを読んでいただく価値はないと思いますが、何かお気づきの点がありましたら、ご指摘をお願いします。

### 追記
* 設定の確認・変更・復元ツールを下記に公開しています。(2022/8/16)
    * https://gitlab.com/e4rfx/dula