日本語版 Windows(JIS ドライバ)のまま、US(ANSI) 配列キーボードを配列どおりに打つ。 指定したキーボードを繋いでいる間だけ有効になり、外すとノート内蔵の JIS 配列にひとりでに戻る。
外付け US キーボードを繋ぐ → US(ANSI) 配列で打てる
外して内蔵キーボードだけ → JIS 配列に戻る
再起動もドライバ変更も要らない。AutoHotkey v2 のスクリプト1本。
日本語版 Windows で US 配列のキーボードを使うには、これまで2つしか道がなかった。
| 方法 | 問題 |
|---|---|
レジストリで kbd101.dll に変える |
ハードウェアキーボードレイアウトはシステム全体で1つしか持てず、変更に再起動が要る。ノート内蔵の JIS キーボードまで US になるので、外付けを外した瞬間に刻印と入力がズレる |
| ULE4JIS | 2009年のソフトで対象 OS が Windows XP / Vista。常時オンか手動終了しかなく、デバイスに連動しない |
ノートPCに US 配列の外付けキーボードを繋いで作業し、外出先では内蔵キーボードで打つ—— という使い方だと、繋いだときだけ US になってほしい。それをやるものが無かった。
これは ULE4JIS のバグではなく 管理者権限の問題であることが多い。
低レベルキーボードフック(WH_KEYBOARD_LL)は、自分より権限の高いプロセスのウィンドウには届かない。
非管理者で起動していると、管理者権限で動いているアプリ(Windows Terminal、タスクマネージャ、
UAC ダイアログなど)でだけ変換が素通しになる。ほとんどの場面では効くので、
「たまに効かない」「アプリによって違う」という分かりにくい壊れ方をする。
AutoUsLayout はタスクスケジューラで最高の特権で自動起動するので、これが起きない。
- Windows 10 / 11(Windows 11 25H2 で動作確認)
- 日本語キーボードレイアウト(
kbd106.dll/PCAT_106KEY)のままであること - AutoHotkey v2(未インストールならインストーラが winget で入れる)
git clone https://github.com/beyondhayato/AutoUsLayout.git
cd AutoUsLayout
powershell -ExecutionPolicy Bypass -File .\install.ps1UAC が1回出る。以後は自動起動するので出ない。
インストール後、タスクトレイのアイコンを右クリック →「対象キーボードを選ぶ」 で、 US 配列で使いたいキーボードを選ぶ。接続中のキーボードが分かる名前で並ぶ。
アンインストールは uninstall.ps1。
トレイアイコンの右クリックメニュー:
| 項目 | |
|---|---|
| 対象キーボードを選ぶ... | 接続中のキーボード一覧から選ぶ。VID/PID が config.ini に保存される |
| 常に US にする | デバイスを見ずに常時 US 配列にする(HHKB などを常用する場合) |
| US / JIS を手動で切り替え | Ctrl+Alt+U。挙動が怪しいときの緊急停止 |
| 自動判定に戻す | Ctrl+Alt+A |
| 設定ファイルを開く | config.ini を編集する |
アイコンとツールチップで、いま US と JIS のどちらで入力しているかが分かる。
US(ANSI) の物理キーを押したとき、JIS ドライバ環境で US 配列どおりの文字が出るようにしている。
| 押すキー | 素 | Shift |
|---|---|---|
2 |
2 |
@ |
6 7 8 9 0 |
そのまま | ^ & * ( ) |
- |
- |
_ |
= |
= |
+ |
[ ] |
[ ] |
{ } |
; |
; |
: |
' |
' |
" |
` |
` |
~ |
\ |
\ |
| |
IME のオン/オフは Alt + `(US 配列の作法)。ANSI キーボードには半角/全角キーが無いため。
Ctrl+[(Vim の Esc)のような修飾キーとの組み合わせも通る。
文字を直接送るのではなく「JIS ドライバでその文字が出るキー」を送り、
{Blind} で Ctrl / Alt / Win の状態を維持しているため。
ハードウェアキーボードレイアウトはシステム全体で1つ、しかも起動時に決まる。 接続を検知して切り替えようにも毎回再起動が要る。デバイスごとの出し分けは原理的にできない。 だからソフトウェアでのキー差し替えしか選択肢がない。
cfgmgr32 の CM_Get_Device_ID_ListW で、今つながっているキーボード(デバイスクラス
{4D36E96B-...}、FILTER_PRESENT)だけを列挙し、VID/PID の部分文字列で照合している。
デバイスインスタンス ID の末尾は再ペアリングすると変わるので、ID 全体で覚えると Bluetooth を繋ぎ直した日に動かなくなる。VID/PID で見るのが要点。
判定は WM_DEVICECHANGE を受けて即座に、加えて保険として5秒ごとに走る。
スリープ復帰後などに、Windows が低レベルキーボードフックを黙って外すことがある。 プロセスは生きているのでタスクスケジューラでは Running のまま、トレイアイコンも出たまま、 なのに変換だけ効かない、という壊れ方をする(2026-09-06 に実際に起きた。 2回のスリープ復帰を挟んで1日動かしたインスタンスがこの状態になっていた)。
対策として WM_POWERBROADCAST の復帰通知(PBT_APMRESUMESUSPEND /
PBT_APMRESUMEAUTOMATIC)を受けたらフックを InstallKeybdHook(true, true) で入れ直し、
保険として HookRefreshMin(既定5分)ごとにも入れ直す。トレイメニューの
「フックを入れ直す」で手動でも復旧できる。
HID のキーボードノードは HID キーボード デバイス という汎用名しか持たない。
親デバイスを最大4段さかのぼってフレンドリ名(例 MX MCHNCL M)を拾い、
無ければデバイス説明にフォールバックしている。
- キーボードを区別しない。 対象キーボードが接続されている間は、内蔵キーボードで打っても US 変換がかかる。低レベルフックは入力元のデバイスを見分けられないため。 両方を同時に別配列で使いたい場合は、kanata + Interception のようなデバイス単位で処理する方式が必要になる。
- Raw Input を直接読むアプリ(一部のゲームなど)では効かないことがある。
- CapsLock の扱いは変更していない。
- 対応表は JIS(
kbd106) ドライバであることが前提。既にドライバをkbd101にしている場合は 二重変換になるので、どちらか一方にすること。
「JIS ドライバのままスキャンコードを差し替えて US 配列を再現する」という発想は ULE4JIS(作者: nano / DEZZ Networks, 2009) に学んだ。 コードは共有していない(ULE4JIS はクローズドなバイナリで、本リポジトリは AutoHotkey v2 の 新規実装)。デバイス連動の自動切り替えは本ツール独自のもの。
MIT
English
AutoUsLayout lets you type on a US (ANSI) keyboard while Windows keeps its Japanese
(JIS / kbd106) hardware layout — and it only does so while a keyboard you choose is connected.
Unplug it and your laptop's built-in JIS keyboard behaves normally again.
Changing the layout driver to kbd101 is system-wide and needs a reboot, so it cannot be
switched per device. This remaps scan codes in software instead, and watches device
connect/disconnect events (cfgmgr32 + WM_DEVICECHANGE) to enable itself automatically.
Requires AutoHotkey v2. Run install.ps1 — it registers a scheduled task that starts the
script elevated, which matters: a low-level keyboard hook cannot reach windows owned by
higher-privileged processes, so a non-elevated remapper silently stops working in
Windows Terminal, Task Manager, and similar.
Pick your keyboard from the tray menu. Ctrl+Alt+U toggles manually; Ctrl+Alt+A returns to
automatic detection. MIT licensed.