「AHKで文字列をくくる」
Googleなんかで検索するとき、複数の単語をひとまとめにしたくてダブルクォーテーションでくくることありますよね。 "Google Japan" とか。
けっこう多用する割に一手間かかるので AutoHotKey でスクリプト書いてみました。IMEがONでもOFFでもきちんと動作するのが売り。
- SettleSearch() ……文字列を "" でくくってEnter
- IsImeOn() ……IMEがONかどうか
- IsImeOff() ……IMEがOFFかどうか
- SetImeOn() ……IMEをONにセット
- SetImeOff() ……IMEをOFFにセット
ちなみに、IME制御の部分はかの有名な IME.ahk そのままです*1。多謝!
(クリップボード経由で " を貼り付ければ、IME制御する必要ないけど)
具体的なコードは以下の通りです。
;----------------------------------------------------------- ; 文字列をダブルクォーテーションでくくってEnter ; 文字列を未選択状態 → 全体を "" でくくる ; 文字列を選択状態 → 選択文字列を "" でくくる ;----------------------------------------------------------- SettleSearch() { beforeText := clipboard ;クリップボードの中身を保存 clipboard = ;クリップボードを空に send,^{c} ;コピー isImeOn := IsImeOn() ;IMEはONか if( isImeOn ) ;もともとIMEがONだったなら { SetImeOff() ;IMEをOFFに sleep, 100 ;IMEの切り替わり待ち } if( StrLen(clipboard) = 0 ) ;文字列を未選択だったなら { send,{Home}"{End}"{Enter} } else ;文字列を選択していたなら { send,"^{v}"{Enter} } if( isImeOn ) ;もともとIMEがONだったなら { SetImeOn() ;IMEをONに戻す } clipboard := before ;クリップボードを元に戻す return }
;----------------------------------------------------------- ; IMEの状態の取得 ; WinTitle="A" 対象Window ; 戻り値 1:ON / 0:OFF ;----------------------------------------------------------- GetIme(WinTitle="A") { VarSetCapacity(stGTI, 48, 0) NumPut(48, stGTI, 0, "UInt") ; DWORD cbSize; hwndFocus := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI) ? NumGet(stGTI,12,"UInt") : WinExist(WinTitle) return DllCall("SendMessage" , UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwndFocus) , UInt, 0x0283 ;Message : WM_IME_CONTROL , Int, 0x0005 ;wParam : IMC_GETOPENSTATUS , Int, 0) ;lParam : 0 }
;----------------------------------------------------------- ; IMEがONかどうか ; 戻り値 true:ONである / false:ONでない ;----------------------------------------------------------- IsImeOn() { if( GetIme() = 1 ) { return 1 } else { return 0 } }
;----------------------------------------------------------- ; IMEがOFFかどうか ; 戻り値 true:OFFである / false:OFFでない ;----------------------------------------------------------- IsImeOff() { if( GetIme() = 0 ) { return 1 } else { return 0 } }
;----------------------------------------------------------- ; IMEの状態をセット ; SetSts 1:ON / 0:OFF ; WinTitle="A" 対象Window ; 戻り値 0:成功 / 0以外:失敗 ;----------------------------------------------------------- SetIme(SetSts, WinTitle="A") { VarSetCapacity(stGTI, 48, 0) NumPut(48, stGTI, 0, "UInt") ; DWORD cbSize; hwndFocus := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI) ? NumGet(stGTI,12,"UInt") : WinExist(WinTitle) return DllCall("SendMessage" , UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwndFocus) , UInt, 0x0283 ;Message : WM_IME_CONTROL , Int, 0x006 ;wParam : IMC_SETOPENSTATUS , Int, SetSts) ;lParam : 0 or 1 }
;----------------------------------------------------------- ; IMEをONにセット ;----------------------------------------------------------- SetImeOn() { SetIme(1) }
;----------------------------------------------------------- ; IMEをOFFにセット ;----------------------------------------------------------- SetImeOff() { SetIme(0) }