Skip to content

Instantly share code, notes, and snippets.

@ktsugita
Last active June 4, 2023 23:28
Show Gist options
  • Save ktsugita/0d34312809cfcd073726b506d84083fb to your computer and use it in GitHub Desktop.
Save ktsugita/0d34312809cfcd073726b506d84083fb to your computer and use it in GitHub Desktop.
日本語キーボードが基本の状況で英語キーボードを接続した際に文字が正しく入力されるようにレジストリを変更する
#Requires -RunAsAdministrator
# 日本語キーボードが基本の状況で英語キーボードを接続した際に文字が正しく入力されるようにレジストリを変更します
# このスクリプトをコピペ等で保存する場合、文字コードをBOM付きUTF-8にして保存してください
# 管理者モードで実行してください
#
# - 参考
# - [Windows10 21H2に英語配列のBluetoothキーボードを追加して日本語キーボードと共存させるための設定支援PowerShellスクリプト - Qiita](https://qiita.com/e4rfx/items/5eb658d3faff1a4c93ab)
# - [Windows10 21H2で英語配列のBluetoothキーボードを追加して日本語キーボードと共存させる設定 - Qiita](https://qiita.com/e4rfx/items/3f9a5b884209aced37b5)
# - [Windows 11 で 2 つのキーボード配列を使う](https://zenn.dev/microsoft/articles/two-keylayout-windows11)
Write-Host @"
日本語キーボードが基本の状況で英語キーボードを接続すると一部のキーが表示と異なる文字が入力されてしまいます。
これを修正するためにキーボードに関連するレジストリを編集して問題を改修するスクリプトを実行します。
基本: 日本語キーボード
追加: 英語キーボード
"@
Read-Host "Enterキーを押すと必須レジストリの追加と削除を実施します"
Set-ItemProperty `
-LiteralPath 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\i8042prt\Parameters' `
-Name 'LayerDriver JPN' `
-Value 'kbd106.dll' `
-Force -Verbose
Set-ItemProperty `
-LiteralPath 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\i8042prt\Parameters' `
-Name 'OverrideKeyboardIdentifier' `
-Value 'PCAT_101KEY' `
-Force -Verbose
Remove-ItemProperty `
-LiteralPath 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\i8042prt\Parameters' `
-Name 'OverrideKeyboardType' `
-Force -Verbose -ErrorAction SilentlyContinue
Remove-ItemProperty `
-LiteralPath 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\i8042prt\Parameters' `
-Name 'OverrideKeyboardSubtype' `
-Force -Verbose -ErrorAction SilentlyContinue
Read-Host "Enterキーを押すと英語キーボード追加前を記憶します"
$base = "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HID"
$first = Get-ChildItem -Path $base
$second = $first | ForEach-Object { Get-ChildItem -Path ("Registry::{0}" -f $_.Name) | Get-ItemProperty } | Where-Object DeviceDesc -like '*;HID Keyboard Device'
$second | Format-Table Service, DeviceDesc, ContainerID
Read-Host "Enterキーを押すと英語キーボード追加後を記憶します"
$base = "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HID"
$third = Get-ChildItem -Path $base
$forth = $third | ForEach-Object { Get-ChildItem -Path ("Registry::{0}" -f $_.Name) | Get-ItemProperty } | Where-Object DeviceDesc -like '*;HID Keyboard Device'
$forth | Format-Table Service, DeviceDesc, ContainerID
Write-Host "英語キーボード追加前後の差分"
Compare-Object $second $forth | Tee-Object -Variable fifth | Format-List
$target = $fifth | Where-Object SideIndicator -eq '=>' | ForEach-Object { $_.InputObject } | Where-Object PSPath -like 'Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HID\VID*'
$targetpath = $target.PSPath | ForEach-Object { "{0}\Device Parameters" -f ($_ -replace ('Microsoft.PowerShell.Core\\Registry::', 'Registry::')) }
Write-Host "追加された英語キーボードと推定されるレジストリキーに英語設定を設定します"
$targetpath | ForEach-Object {
Set-ItemProperty `
-Path $_ `
-Name 'KeyboardTypeOverride' `
-Value 4 `
-Force -Verbose -Confirm:$true
Set-ItemProperty `
-Path $_ `
-Name 'KeyboardSubTypeOverride' `
-Value 0 `
-Force -Verbose -Confirm:$true
}
Write-Host (@"
英語キーボードを接続しなおして、
日本語キーボードでShift+2を押すと「{0}」が表示され、
 英語キーボードでShift+2を押すと「@」が表示されれば成功です。
間違っていた場合に除去するため、レジストリキーを記録してください
"@ -f '"')
$targetpath | ForEach-Object {
Write-Host (@"
レジストリキー: {0}
KeyboardTypeOverride:4
KeyboardSubTypeOverride:0
"@ -f $_)
}
Read-Host "Enterキーを押すと終了します"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment