Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AutoUsLayout

日本語版 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 が Windows 11 で「効いているのに効かない」ように見える件

これは 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.ps1

UAC が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 の状態を維持しているため。


仕組み

なぜドライバを kbd101 に変えないのか

ハードウェアキーボードレイアウトはシステム全体で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 にしている場合は 二重変換になるので、どちらか一方にすること。

Credits

「JIS ドライバのままスキャンコードを差し替えて US 配列を再現する」という発想は ULE4JIS(作者: nano / DEZZ Networks, 2009) に学んだ。 コードは共有していない(ULE4JIS はクローズドなバイナリで、本リポジトリは AutoHotkey v2 の 新規実装)。デバイス連動の自動切り替えは本ツール独自のもの。

License

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.

About

日本語版Windows(JISドライバ)のまま、指定したキーボードを繋いでいる間だけUS(ANSI)配列で打つ。外すとJISに戻る。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages