Windowsの内蔵USで外部JISをJIS配列で使う

Windowsの海外の面白そうなハードってUS配列ですよね。
US配列とJIS配列を併用しているとキー入力の間違いが多発してしまいます。
ちょっといいJIS配列のキーボードを買ってしまったので、なんとか「内蔵USで外部JISをJIS配列で使う」方法を試行錯誤してみました。

その最終結果をまとめておきます。

AutoHotkey をインストール

AutoHotkey
Free keyboard macro program. Supports hotkeys for keyboard, mouse, and joystick. Can expand abbreviations as you type them (AutoText).

Windowsでキーボード関係を弄るなら必須ソフトですよね。

AutoHotkey の設定

usjis_toggle.ahk

#Requires AutoHotkey v2.0
#SingleInstance Force

;==================================================
; 状態(起動時の配列)と切り替え
;==================================================
JIS := true                     ; true=JIS / false=US(起動時)
Show(msg) => TrayTip("Symbol layout (IME=JP)", msg, 500)

SetMode(state) {
    global JIS
    JIS := state
    Show(JIS ? "JIS" : "US")                 ; トースト表示
}
^!k:: SetMode(!JIS)             ; Ctrl+Alt+K:JIS/USトグル
^!j:: SetMode(true)             ; Ctrl+Alt+J:JIS固定
^!u:: SetMode(false)            ; Ctrl+Alt+U:US固定

;==================================================
; キー送信ヘルパ(IMEの未確定に載せる・Shift制御一元化)
;   reqShift: -1=現状維持 / 0=Shiftなし / 1=Shiftあり
;==================================================
SendSc(sc, reqShift := -1) {
    had := GetKeyState("Shift","P")
    if (reqShift = 1 && !had) {
        Send("{Shift down}{" sc "}{Shift up}")
    } else if (reqShift = 0 && had) {
        Send("{Shift up}{" sc "}{Shift down}")
    } else {
        Send("{Blind}{" sc "}")
    }
}

;==================================================
; JIS時のみ有効にするマッピング
;==================================================
#HotIf JIS && !GetKeyState("Ctrl","P") && !GetKeyState("Alt","P")

;--- 数字列(Shift記号:6〜0) ---
$*+sc003:: SendSc("sc028", -1)  ; Shift+2 → "(US: sc028+Shift)
$*+sc007:: SendSc("sc008", -1)  ; Shift+6 → &(US: 7+Shift)
$*+sc008:: SendSc("sc028", 0)   ; Shift+7 → '(US: Quote)
$*+sc009:: SendSc("sc00A", -1)  ; Shift+8 → ((US: 9+Shift)
$*+sc00A:: SendSc("sc00B", -1)  ; Shift+9 → )(US: 0+Shift)
$*+sc00B:: SendSc("sc00B", 0)   ; Shift+0 → 0(JISは記号なし)

;--- - / = ---
$*sc00C::   SendSc("sc00C", 0)  ; -           (Minus)
$*+sc00C::  SendSc("sc00D", 0)  ; Shift+Minus → =
$*sc00D::   SendSc("sc007", 1)  ; = → ^       (6+Shift)
$*+sc00D::  SendSc("sc029", -1) ; Shift+= → ~ (`+Shift)

;--- 角括弧 ---
$*sc01A::   SendSc("sc003", 1)  ; [  → @      (2+Shift)
$*+sc01A::  SendSc("sc029", 0)  ; {  → `      (` 単体)
$*sc01B::   SendSc("sc01A", 0)  ; ]  → [
$*+sc01B::  SendSc("sc01A", -1) ; }  → {

;--- セミコロン/クオート ---
$*sc027::   SendSc("vkBA", 0)   ; ;  → ;
$*+sc027::  SendSc("sc00D", -1) ; :  → +      (=+Shift)
$*sc028::   SendSc("vkBA", 1)   ; '  → :      (; にShift)
$*+sc028::  SendSc("sc009", -1) ; "  → *      (8にShift)

;--- Yen(JIS ¥|キー) ---
$*sc07D::   SendSc("sc02B", 0)  ; ¥(実体は \ )
$*+sc07D::  SendSc("sc02B", -1) ; |

;--- ろ キー ---
$*sc073::   SendSc("sc02B", 0)  ; ろ → \
$*+sc073::  SendSc("sc00C", -1) ; Shift+ろ → _(- にShift)

;--- K42(sc02B が ]/} として動作) ---
$*sc02B::   SendSc("sc01B", 0)  ; ] 
$*+sc02B::  SendSc("sc01B", -1) ; }

#HotIf

設定の解説

  • 普通、Windowsでキーボード配列を変更すると再起動が必要ですが、US配列のままJIS配列キーボードのキートップの表記の記号になるように変換して出力しています。
  • 設定ファイルで起動すると、JIS配列モードになります。US配列モードにも切替えられるようにしています。
    • Ctrl+Alt+J:JIS配列モード
    • Ctrl+Alt+U:US配列モード
    • Ctrl+Alt+K:JIS⇔US配列トグル切替え
  • JIS配列モードの時にのみJIS配列のキーボード表記の出力になるように変換しています。
    • SendScでキーコード出力を一元化
    • シフト状況を指定できるようにしている。(シフト押下時にシフトを再送しない)

コメント