Posted at

Windowsで英字配列のApple Wireless KeyboardをMac風キーバインドにする

More than 3 years have passed since last update.

Apple Wireless Keyboardが好きでWindowsでもApple Wireless KeyboardでMac風のキーバインドで使うために色々ツールを導入したのでその時の個人的なメモ。


環境


  • Windows 8.1 64bit

  • Apple Wiress Keyboard (US) MC184LL/B


やりたいこと


  • 英字配列のApple Wireless KeyboardでWindowsでMac風のキーバインドにする

  • FnキーをCtrlキーに変更

  • CommandキーでIMEのOn/Off切り替え(Toggle)

  • Command+Tabでウィンドウの切り替え

  • Caps LockキーをCtrlキーに切り替え


使ったツール


事前準備

レジストリをいじる


  • Win+Rかファイル名を指定して実行でregeditを入力してレジストリエディタを起動


  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parametersを開く


  • LayerDriver JPNの値をkbd101.dllに変更


参考: Apple Wireless Keyboard トラブル&Tips | Suinasia


WinA1314

FnキーとCtrlキーの入れ替え、CmdキーとAltキーの入れ替え等が出来る。

Github からダウンロードしたらBinariesフォルダ内にWinA1314 Setup.exeがあるのでインストールウィザードに従ってキーバインドの変更をする。今回はFnキーとCtrlキーの入れ替えのみ実行した。CmdキーはCtrlとしてバインドされるのでCmd + C、Cmd + V等のMac風のキーバインドはそのまま実行出来る。


AutoHotKey

メインになるautohotkeyのスクリプトを作成する。

apple_keyboard.ahk

#Include ./IME.ahk

; Ctrl + TabでAlt + Tabを再現(※要EnableUIAccess.ahk)
LControl & Tab::AltTab ; AltTab Emulation

; ショートカット
^+]::Send ^{Tab} ; Ctrl + Tab
^+[::Send ^+{Tab} ; Ctrl + Shift + Tab
^+v::Send +{Insert} ; Insert
^q::WinClose, A ; Quit Window like Cmd + Q
^Backspace::Send {Delete} ; Send Delete
^+Backspace::Send +{Delete} ; Send Delete completely

; キー交換
RAlt::RCtrl ; Swap Right Alt key with Right Ctrl key
RCtrl::RWin ; Swap Right Ctrl key with Right Windows key
Capslock::Ctrl ; Swap capslock with Ctrl key

; CmdキーでIMEのOn/OffをToggle
Ctrl::
getIMEMode := IME_Get()
if (%getIMEMode% = 0)
{
IME_SET(1)
return
}
else
{
IME_SET(0)
return
}

Windows 8ではAltTabがセキュリティの関係上デフォルトでは使えないので こちら からEnableUIAccess.ahkをダウンロードし#Include ./EnableUIAccess.ahkという行をスクリプトに追記してからスクリプトを起動しAutoHotKey.exeを署名済みの.exeファイルに置き換える。一度exeファイルを上書きしたら以降はIncludeは削除して問題ない。

参考: Enable interaction with administrative programs

また事前にIME.ahkをダウンロードしておく。(リンク先zipフォルダ内lib/IME.ahkをコピー。リンク切れの場合は以下のコードをコピペしてapple_keyboard.ahkと同じフォルダに入れておく)

IME.ahk

/*----------------------------------------------------------------------------

IME 制御用 Functuion (コピペ用)
動作確認環境 2005/09/12
WinNT4 SP6 / WinXP SP2 (98系でもおそらくはOK)

IME_Func.ahk からよく使う IME状態取得/セット部のみ抽出
各関数間に依存関係はありません。
関数間の依存関係は無いので
必要な関数単体で

2008.07.11 v1.0.47以降の 関数ライブラリスクリプト対応用にファイル名を修正
-----------------------------------------------------------------------------
*/

IME_GET(WinTitle="")
;-----------------------------------------------------------
; IMEの状態の取得
; 対象: AHK v1.0.34以降
; WinTitle : 対象Window (省略時:アクティブウィンドウ)
; 戻り値 1:ON 0:OFF
;-----------------------------------------------------------
{
ifEqual WinTitle,, SetEnv,WinTitle,A
WinGet,hWnd,ID,%WinTitle%
DefaultIMEWnd := DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hWnd, Uint)

;Message : WM_IME_CONTROL wParam:IMC_GETOPENSTATUS
DetectSave := A_DetectHiddenWindows
DetectHiddenWindows,ON
SendMessage 0x283, 0x005,0,,ahk_id %DefaultIMEWnd%
DetectHiddenWindows,%DetectSave%
Return ErrorLevel
}

IME_SET(setSts, WinTitle="")
;-----------------------------------------------------------
; IMEの状態をセット
; 対象: AHK v1.0.34以降
; SetSts : 1:ON 0:OFF
; WinTitle: 対象Window (省略時:アクティブウィンドウ)
; 戻り値 1:ON 0:OFF
;-----------------------------------------------------------
{
ifEqual WinTitle,, SetEnv,WinTitle,A
WinGet,hWnd,ID,%WinTitle%
DefaultIMEWnd := DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hWnd, Uint)

;Message : WM_IME_CONTROL wParam:IMC_SETOPENSTATUS
DetectSave := A_DetectHiddenWindows
DetectHiddenWindows,ON
SendMessage 0x283, 0x006,setSts,,ahk_id %DefaultIMEWnd%
DetectHiddenWindows,%DetectSave%
Return ErrorLevel
}

;===========================================================================
; IME 入力モード 取得 / セット
;
; 0000xxxx かな入力
; 0001xxxx ローマ字入力
; xxxx0xxx 半角
; xxxx1xxx 全角
; xxxxx000 英数
; xxxxx001 ひらがな
; xxxxx011 カナ/カナ
;
; 0 (0x00 0000 0000) かな 半英数
; 3 (0x03 0000 0011) 半カナ
; 8 (0x08 0000 1000) 全英数
; 9 (0x09 0000 1001) ひらがな
; 11 (0x0B 0000 1011) 全カタカナ
; 16 (0x10 0001 0000) ローマ字半英数
; 19 (0x13 0001 0011) 半カナ
; 24 (0x18 0001 1000) 全英数
; 25 (0x19 0001 1001) ひらがな
; 27 (0x1B 0001 1011) 全カタカナ

IME_GetConvMode(WinTitle="")
;-------------------------------------------------------
; IME 入力モード取得
; in WinTitle (省略時アクティブウィンドウ)
; 戻り値: 入力モード
;--------------------------------------------------------
{
ifEqual WinTitle,, SetEnv,WinTitle,A
WinGet,hWnd,ID,%WinTitle%
DefaultIMEWnd := DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hWnd, Uint)

;Message : WM_IME_CONTROL wParam:IMC_GETCONVERSIONMODE
DetectSave := A_DetectHiddenWindows
DetectHiddenWindows,ON
SendMessage 0x283, 0x001,0,,ahk_id %DefaultIMEWnd%
DetectHiddenWindows,%DetectSave%
Return ErrorLevel
}

IME_SetConvMode(ConvMode,WinTitle="")
;-------------------------------------------------------
; IME 入力モードセット
; in ConvMode 入力モード
; WinTitle (省略時アクティブウィンドウ)
;--------------------------------------------------------
{
ifEqual WinTitle,, SetEnv,WinTitle,A
WinGet,hWnd,ID,%WinTitle%
DefaultIMEWnd := DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hWnd, Uint)

;Message : WM_IME_CONTROL wParam:IMC_SETCONVERSIONMODE
DetectSave := A_DetectHiddenWindows
DetectHiddenWindows,ON
SendMessage 0x283, 0x002,ConvMode,,ahk_id %DefaultIMEWnd%
DetectHiddenWindows,%DetectSave%
Return ErrorLevel
}

;===========================================================================
; IME 変換モード
; 0:無変換
; 1:人名/地名
; 8:一般
; 16:話し言葉優先

IME_GetSentenceMode(WinTitle="")
;-------------------------------------------------------
; IME 変換モード取得
; in WinTitle (省略時アクティブウィンドウ)
; 戻り値: 0:無変換 1:人名/地名 8:一般 16:話し言葉優先
;--------------------------------------------------------
{
ifEqual WinTitle,, SetEnv,WinTitle,A
WinGet,hWnd,ID,%WinTitle%
DefaultIMEWnd := DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hWnd, Uint)

;Message : WM_IME_CONTROL wParam:IMC_GETSENTENCEMODE
DetectSave := A_DetectHiddenWindows
DetectHiddenWindows,ON
SendMessage 0x283, 0x003,0,,ahk_id %DefaultIMEWnd%
DetectHiddenWindows,%DetectSave%
Return ErrorLevel
}

IME_SetSentenceMode(SentenceMode,WinTitle="")
;-------------------------------------------------------
; IME 変換モードセット
; in SentenceMode 0:無変換 1:人名/地名 8:一般 16:話し言葉優先
; WinTitle (省略時アクティブウィンドウ)
;--------------------------------------------------------
{
ifEqual WinTitle,, SetEnv,WinTitle,A
WinGet,hWnd,ID,%WinTitle%
DefaultIMEWnd := DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hWnd, Uint)

;Message : WM_IME_CONTROL wParam:IMC_SETSENTENCEMODE
DetectSave := A_DetectHiddenWindows
DetectHiddenWindows,ON
SendMessage 0x283, 0x004,SentenceMode,,ahk_id %DefaultIMEWnd%
DetectHiddenWindows,%DetectSave%
Return ErrorLevel
}


まとめ

レジストリの変更、AutoHotKey、WinA1314等を使い、Apple Wiress Keyboard (英字配列) でWindowsでMac風のキーバインドで扱えるようにした。

多少面倒だけどMacとほぼ同じ操作感になったのでAutoHotKeyさまさまといったところ。