[AHK] Win版Logophileで検索モードの組み合わせを一括設定するスクリプト

2016年07月25日

今更ながら、辞書ブラウザ「Logophile」の使用環境を最近やっと整え始めました。これまで使ってきたJammingとPASORAMA(X10001)を引き続きメインに据えつつ、LogophileやEBWin4を適材適所で組み合わせる環境を構築していこうかなと思っています。

さて、JammingからLogophileに移ったときに戸惑う点の1つが、検索で使うインデックスを指定するためのプッシュボタン 190714_logophile_mode.png です。

Jammingでは、「基本的な見出し語検索は『前方一致』(Ctrl+4)」「成句などの細かい検索は『一網打尽』(Ctrl+1)」というように、ざっくりとモードを選択したうえで、必要に応じて「一網打尽」の条件を調整するという使い方ができました。

しかし、Logophileにはそのような区別がないみたいで、160725_logophile_mode.png のプッシュボタンですべて制御しなくてはならないようです。個別のボタンのオン/オフは、ショートカットキーの Ctrl+1〜0 で操作できるものの、Jammingなら Ctrl+1/4 の一発で済んだ切り替えの際に、いくつもキーを押さなくてはならず、ちょっと面倒です。

そこで、Logophileの検索モードをショートカットキー一発で切り替えるためのスクリプトをAHK(AutoHotkey)で作ってみました。

機能と設定方法

このスクリプトでは、特定のショートカットキーを押したときに、プッシュボタンの組み合わせを特定の状態に一発で設定できるようになります。

ショートカットキーと、プッシュボタンの組み合わせは、後述のコードで赤字になっている次の部分で指定します。

^F1::LogophileBtnSet(1,0,0,0,2,0,1,1)

このコードの場合、Logophile上でショートカットキー Ctrl+F1 を押したときに、ボタンが 160725_logophile_mode.png の状態になります。

上のコードと、ボタンの画像とを見比べるとわかるように、右辺のカッコの中で指定する8個の数字が、8個のプッシュボタンの状態とそれぞれ対応しており、「0=オフ、1=オン」という意味になります。ただし、5番目の数字だけは、「0=成句、1=And、2=Or」という意味になります。

この要領で、お好みに合わせてキーとボタンを修正したうえで、お使いください。

なお、下記のスクリプトでは2種類のショートカットキーだけを設定していますが、もっと増やしても もちろん構いません。「見出し語検索用」「成句検索用」「全文検索用」みたいな感じで、よく使うボタンの組み合わせをすべて登録しておくと、便利なのではないかと思います。

スクリプト

以下のスクリプトを、お好きなフォルダにお好きなファイル名で保存してください(拡張子は「.ahk」)。このスクリプトを起動している状態のときに、Logophile上で検索モード一発切り替えのショートカットキーが使えます。

※Windows 10(64ビット版)上のLogophile 1.6で動作を確認しました。他の環境では試しておりません。

#IfWinActive ahk_class TLogophileMainForm
^F1::LogophileBtnSet(1,0,0,0,2,0,1,1)
^F2::LogophileBtnSet(1,1,1,0,1,0,1,1)
#IfWinActive

; ==== ここから下は 特に理由がなければ いじる必要はありません ====

; 一連のボタンのオン・オフを設定するための関数
; 引数の並びはボタンの並びと同じで、全・後・キ・全・成句/And/Or・完・語・字の順
; 各ボタンの状態をオン(1)/オフ(0)で指定する (ただし成句ボタンだけは、0=成句、1=And、2=Or)
LogophileBtnSet(zenpou, kouhou, keywd, zenbun, andor, kanzen, gobi, moji)
{
    ; 最新の状態を正しく取得するために、「検索」メニューを一瞬表示
    WinActivate, ahk_class TLogophileMainForm
    Send, !s{Esc}{Esc}

    ; 「検索」メニューのハンドルを取得
    mh := DllCall("GetMenu", "UInt", WinExist("A"))
    smh := DllCall("GetSubMenu", "UInt", mh, "UInt", 3) ; 3=「検索」メニュー

    ; 「詳細検索モード」になっている場合は「通常検索モード」に戻す
    if(MenuChecked(smh, 3)) {
        Send, ^[
    }

    ; 各ボタンのオン/オフを設定(「成句/And/Or」ボタンは除く)
    BtnToggle(MenuChecked(smh, 5),  zenpou, "^1") ; 「前」
    BtnToggle(MenuChecked(smh, 6),  kouhou, "^2") ; 「後」
    BtnToggle(MenuChecked(smh, 7),  keywd,  "^3") ; 「キ」
    BtnToggle(MenuChecked(smh, 8),  zenbun, "^4") ; 「全」
    BtnToggle(MenuChecked(smh, 12), kanzen, "^8") ; 「完」
    BtnToggle(MenuChecked(smh, 13), gobi,   "^9") ; 「語」
    BtnToggle(MenuChecked(smh, 14), moji,   "^0") ; 「字」

    ; 「成句/And/Or」ボタンを切り替え
    if( andor == 0 ) {
        Send, ^5
    } else if( andor == 1 ) {
        Send, ^6
    } else if( andor == 2 ) {
        Send, ^7
    }

    return
}

; 個別のボタンのオン・オフを切り替えるためのサブルーチン
; chked:現在の状態(0=オフ/1=オン)、mode:設定する状態(0=オフ/1=オン)、key:モード切り替えのためのショートカットキー
BtnToggle(chked, mode, key)
{
    if (chked ^ mode) {
        Send, %key%
    }
    return
}

; メニューの特定の項目がチェックされているかどうかを調べて返す関数
; menuh=メニューのハンドル、itempos=調べる項目の位置(先頭が0)
MenuChecked(menuh, itempos)
{
    return DllCall("GetMenuState", "UInt", menuh, "UInt", itempos, "UInt", 0x400) & 0x8 == 0x8 ? 1 : 0 ; 0x400=MF_BYPOSITION、0x8=MF_CHECKED
}

2016/07/30更新:記事タイトルを一部変更しました

posted by 内山卓則 at 20:49 | スクリプト・プログラム