AutoHotKeyでOne Shot Modifier
2007.10.29 Monday 23:30
窓使いの憂鬱(以下mayu)がWindows Vistaをサポートしないとのことなので,AutoHotKeyでこれまで使ってきたキーの機能変更を設定してみた.特にOne Shot Modifier機能を使って「無変換」+キー に特殊キーの機能を割り当てるとSHIFTとの組み合わせで奇妙な動きをするので,状態管理用フラグを工夫して実現した.
スクリプトダウンロード ご自由にお使いください.
今回設定した機能
「無変換」+キー →制御機能
IME OFFの時に限り「変換」でIME ON
スクリプトダウンロード ご自由にお使いください.
今回設定した機能
「無変換」+キー →制御機能
IME OFFの時に限り「変換」でIME ON
準備
まずAutoHotkeyの配布サイトからダウンロード&インストール
最初にAutoHotKeyをスタートメニュー→プログラムから起動すると,スクリプト作ったよ!と言われて,マイドキュメントの中に「AutoHotkey.ahk」が作られる.けど,中身はコメントしかないのでこの行為は意味がない.自分で新規ファイルを作成して始めましょう.
拡張子がahkであればスクリプトのダブルクリックでAutoHotKeyを起動できる.
IMEのON
実装したいこと
* IMEがoffなら変換キーでIMEをONにする
* IMEがonなら通常の変換キーとして動作する
ラッキーなことにAutoHotKeyでIME制御ができるライブラリと解説がこのページにあったので,このライブラリを使って以下のように記述.
#Include IME_Func.ahk
; 変換でIME=ON
vk1Csc079::
ret := IME_CHECK("A")
if( !ret ){
IME_ON("A")
IME_SetConvMode( "A", 25 ) ; R漢
}
else {
Send {Blind}{vk1Csc079}
}
return
IMEがONになったとき,必ず日本語入力モードになるようにした.
One Shot Modifier
実装したいこと
* 無変換+キー: 割り当てられた機能を実行.無変換を押し下げたまま複数の機能キーを入力可能.最後に無変換を放しても無変換自身の機能は働かない.
* 無変換単独 : 無変換キーとして動作する
* Shift/Ctrl+無変換: 機能通り動作する
実装
まず「無変換」+機能キーの部分
#UseHook on
; diamond cursor
vk1Dsc07B & a::Send {Blind}{Home}
vk1Dsc07B & f::Send {Blind}{End}
vk1Dsc07B & s::Send {Blind}{Left}
vk1Dsc07B & d::Send {Blind}{Right}
vk1Dsc07B & e::Send {Blind}{Up}
vk1Dsc07B & x::Send {Blind}{Down}
vk1Dsc07B & w::Send {Blind}{PgUp}
vk1Dsc07B & c::Send {Blind}{PgDn}
vk1Dsc07B & g::Send {Blind}{Del}
; vi like
vk1Dsc07B & h::Send {Blind}{Left}
vk1Dsc07B & j::Send {Blind}{Down}
vk1Dsc07B & k::Send {Blind}{Up}
vk1Dsc07B & l::Send {Blind}{Right}
無変換の機能を殺してShiftのように使うならこれだけでOK.
次に無変換の機能を生かすために次のように記述してみた
; 無変換+...
vk1Dsc07B::return
vk1Dsc07B Up::Send {Blind}{vk1Dsc07B}
~*vk1Dsc07B::return
無変換+別のキーを組み合わせて押した場合はvk1Dsc07B Upの部分は実行されないのでうまくいくかと思ったが,Shiftを組み合わせると,キーを話したときにShift+無変換の機能が動いてしまい,残念ながらこれでは不足.
どうも挙動が怪しいのでUpとDownを組み合わせて試したら,以下のことが判明.
無変換を押して操作: Down/Upともイベント発生なし
無変換→Shiftの順に押して操作: Down/Upともイベント発生なし
Shift→無変換の順に押して操作: Down/Upともに*vk1Dsc07Bのイベント発生
無変換を押して離す: vk1Dsc07BのUp発生
無変換→Shiftの順に押して離す: vk1Dsc07BのUp発生
Shift→無変換の順に押して離す: *vk1Dsc07BのDown/Up発生
しかも,無変換→Shiftの順に押してShift→無変換の順に離すと*vk1Dsc07BのUpのみ発生.なんじゃこりゃ~.
結局こんな感じで実装した.
フラグの初期値は0
1. Modifier+無変換のDownイベントで1にする
2. 無変換+キーで,フラグが1なら2にする
3. Modifier+無変換のUpイベントでフラグが1ならキー送出
4. 無変換単独のUpなら無条件でキー送出
これによって,
無変換を押して離す→4
無変換+Shiftで機能キー→イベントなし
Shift+無変換で機能キー→1,2,3
無変換+機能キー→2だが,1を通ってないのでフラグ変化なし
Comments