「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)
}