«前の日記(2006-05-31 [水]) 最新 次の日記(2006-06-27 [火])» 編集
RSS: href="http://endoh-namazu.tierra.ne.jp/diary/index.rdf"


半期 四半期 全カテゴリ

新・なまず日記


2006-06-15 [木]

_ [デスクトップ][カスタマイズ][ソフト][AHK]DDwinをポップアップ辞書にする

パソコンに辞書ソフトを入れておくと、何かと便利です。仕事でも趣味でも、辞書を引きたくなるときは沢山あります。今はgooなどで提供されているインターネット辞書サービスもありますが、検索の速さという点では、やはりローカルのPCに辞書ソフトをインストールしているのにはかないません。

なまずは、もう10年ほど前に買った、「辞典盤」(アスキー)というソフト(これのさらに旧版)を未だに愛用しています。このソフトは"岩波国語辞典"、"新英和・和英中辞典"、"知恵蔵"、"マイペディア"の4つの辞書が一枚のCD-ROMに入ったものです。現代用語辞典である"知恵蔵"や、百科事典である"マイペディア"は、記述が古くなったのでさすがに使えませんが、国語辞書や英語辞書は、なまずの使用レベルではまったく問題なく、毎日現役で使っています。

それにしても、10年前のパソコンのソフトが現役で使えるというケースも、珍しいことだと思います。生き馬の目を抜くパソコン業界、1年もたったらソフトもハードも陳腐化するのが常識だからです。「辞典盤」は10年もつほどの素晴らしいソフトだった?いえいえ、もちろん、これにはカラクリがあります。辞書のデータ部分は、EPWINGという標準規格で作られているので、そのデータの閲覧ソフトは、この標準規格に対応したものであればなんでも良く、したがって閲覧ソフトは時代に応じてどんどん進化しているのです。

なまずは、最初は、「辞典盤」に同梱されていた、DDwinという閲覧ソフトを使っていたのですが、すぐに、バージョンアップしたDDwinに乗り換え、さらにBuckingham EB Player(すでに入手不可能)という別のフリーソフトにしばらく浮気し、さらに最近、DDwinの最新のバージョン(Ver.2.66)に帰ってきた、という経緯をたどっております。辞書データの方は変わらなくても、閲覧ソフトが時代に合わせて進化しているし、しかもありがたいことにフリーで公開されているので、10年前のソフトがいまだに使える、というわけです。いい買い物をしたものだと思います。

さて、閲覧ソフトを使うときは、通常、閲覧ソフトに検索語を打ち込んで検索させるということになります。それだけでも、手で本の辞書をペラペラするよりは圧倒的に便利なのですが、せっかくパソコンで使っているのだから、検索したい単語はすでにパソコンで表示されているわけで、それを指定するだけで検索してくれれば、打ち込む手間が省けて便利なのにな、ということは、誰でも考えることです。例えば、画面に表示されている単語にマウスカーソルを持っていってクリックすると、その単語の意味をポップアップウインドウで教えてくれる、このような機能は、よく"ポップアップ辞書"などと呼ばれていて、皆さんいろいろと工夫されるところです。

Buckingham EB Playerのポップアップ辞書機能は、単語を選択状態にした後に、マウスの右ボタンを、しばらく押しっぱなしにするというもので、なかなか便利で愛用しておりました。しかし、この手の機能は、ようするに他のアプリに送られるボタンダウンイベントを閲覧ソフトが横取りして動作する、というものだから、アプリによっては、横取りに失敗して機能しない、ということが起こります。Buckingham EB Playerでは、なまずの愛用のWebブラウザ"Sleipnir(1.66)"では動かないという欠点があり、その点が非常に残念でした。

DDwinでは、DDpopという別のお助けアプリがあります。このDDpopを起動しておいて、単語の上で、Ctrlキーを押しながら左クリックをすると、DDwinで検索してくれる、という機能があります。しかし、このDDpopですが、なまずの環境ではどうもうまく動かなかったし、また、Ctrlを押しながら左クリックというやり方が、あまり好みではありませんでした。だって、両手が塞がってしまうので、コーヒーを左手に持ちながら、右手でマウス操作→検索、といったことができないではないですか。

一方、他のアプリへのイベントを横取りする、ということは、AutoHotkeyの得意技です。ということで、例によって例のごとく、AutoHotkeyで、DDwinを用いたポップアップ辞書機能を作ってみることにしました。やり方は、Buckingham EB Playerのマネをして、右クリック長押しで、単語検索、ということにしました。AutoHotkeyで、右クリックをフックして、マウスカーソルの位置にある単語をクリップボードにつっこみ、それを、DDwinで検索させるわけです。DDwinには、もともと、"クリップボード自動検索"という機能があり、クリップボードに新たに文字列が入ってくると、それを検索して、マウスカーソルのところに検索結果をポップアップウインドウで表示してくれます。これを使えば簡単です。

問題なのは、DDwinの"クリップボード自動検索"を、AutoHotkeyからオン/オフするにはどうしたらいいのか、ということでした。DDwinの"クリップボード自動検索"をいつもオンにしていたら、別に単語の意味を知りたくないときまで、クリップボードを使ったら、ポップアップウインドウが出てきてしまいます。つまり、いついかなる時でも、Ctrl-cを押したら、ポップアップウインドウがポンと出る。これはいただけません。単語の上で右クリック長押しをしたときだけ、ポップアップウインドウが出てきて欲しいのです。

"クリップボード自動検索"の機能は、メニュー項目でオン/オフできるのですが、
クリップボード自動検索

検索前にいちいち手でオン/オフを切替るのはダサすぎます。キーストロークを送り込めば自動化はできますが、そのためには、DDwinのウインドウをアクティブ(一番上)にしなければなりません。これもイマイチです。右クリック長押しのときだけDDwinを起動して、終わったら、DDwinを終了する、ということも考えたのですが、単語検索の時に毎回DDwinが起動するのを待っているものイライラします。

さて、どうしたものかと考えたのですが、こんなとき頼りになるのは、やっぱり lukewarmさんの「Autohotkeyを流行らせるページ」です。ここに、SendMessageを使ってWM_COMMANDメッセージを送ると、メニューを選択したのと同じ効果があると書いてあります。メニュー項目はすべて通し番号がつけられており、その番号を引数にWM_COMMANDを送れば、その項目が実行されたことになるのです。

通し番号を調べるのには、HAYAZOさんの窓コンを使いました。このツールは、任意のアプリを自動実行するためのものですが、その機能の一環として、メニュー項目の番号を調べてくれるというツールがついています。窓コンをたちあげて、"作成"ボタンを押して、"新規作成"ウインドウの"取り込み"ボタンを押してから、対象のアプリのメニューを実際に実行します。すると、そのメニュー項目の番号が窓コンに取り込まれます。このアプリのおかげで、DDwinの"クリップボード自動検索"のメニュー番号は、34番であることがあっと言う間にわかりました。ありがとうHAYAZOさん!

窓コン

実際にAHKから、

 SendMessage, 0x111, 34,,,ahk_id %ddwin% ; 0x111は"WM_COMMAND"

とやってみると、DDwinを最小化したままで、メニューの"クリップボード自動検索"が選択されました。

ここまでわかればこっちのもの。サクサクっとスクリプトを書いて、ようやく、なまずの理想のポップアップ辞書を実現することができました。
以下、具体的なやり方をご説明します。なお、下記のスクリプトの動作には、AutoHotkeyのVer1.0.43.11以降が必要です。

  1. まず、EPWING対応の辞書を入手します。
  2. 次に、ここから、DDwinの最新版(なまずはVer2.66を使っています)をダウンロードして、インストールします。
  3. まずは普通にDDwinを起動して、辞書検索を行って、普通に辞書を使える状態にします。"ツール"メニューの"語尾補正"は、是非チェックした方がよい項目です。また、"ツール"メニューの、"クリップボード自動検索"は、この段階ではチェックしないでください。
  4. "ツール"メニューの"オプション"を選択し、オプション設定ウインドウの中の"他ソフトからの検索"タブでの設定を、以下のようにします。
    設定例
  5. あなたのautohotkey.iniに、以下のようなスクリプトを書き込みます。赤字の部分は、あなたのパソコンにおけるddwin.exeのパスに書き換えてください。そして、スクリプトをリロードします。
$RButton::
  ; マウスの右ボタンが離された秒数を計測、0.3秒待っても離されなかったら、
  ; ポップアップ辞書モードへ。
  KeyWait, RButton, T0.3
  if(ErrorLevel == 1){
    ; ポップアップ辞書モード
    ; アクティブなウインドウを覚えておく
    actWin := WinActive("A")
    ; クリップボードを空に
    Clipboard = 
    ; まず、選択文字列があるかどうかチェック
    ; (Ctrl-cを送ってクリップに入るか)
    Send, ^c
    ClipWait,0.01
    if(ErrorLevel == 1){
      ; 選択文字列はなかった。
      ; ダブルクリックを送って単語を選択して、もう一度Ctrl-c
      Send, {LButton}{LButton}
      Send, ^c
      ClipWait,0.01
      if(ErrorLevel == 1)
        ; なにも選択できなかったので、リターンする
        return
    }
    ; クリップに入った単語を取り出す
    word = %Clipboard%
    ; DDWinが存在するかどうか確認。存在しなかったら、起動してすぐ最小化
    DetectHiddenWindows, On
    ddwin := WinExist("ahk_class TDDwin")
    if(!ddwin){
      ; 環境に合わせて、ddwin.exeのパスを書く
      Run, C:\Program Files\DDWIN\ddwin.exe 
      ; ウインドウが出てくるまで待つ
      WinWait, ahk_class TDDwin,,3
      if(ErrorLevel == 1)
        ; DDWinが起動しないようなので、リターンする
        return
      ddwin := WinExist("ahk_class TDDwin")
      ; DDwinは、WinMinimizeがダメで0x112のメッセージもダメなので、
      ; いったんActiveにして、キーストロークで最小化する
      WinActivate, ahk_id %ddwin%
      WinWaitActive, ahk_id %ddwin%
      Send, !{Space}n
      WinWaitNotActive, ahk_id %ddwin%
    }
    ; DDWinに対して、「クリップボード自動検索」に
    ; するように、メッセージを送る
    SendMessage, 0x111, 34,,,ahk_id %ddwin%
    ; 改めて クリップボードを空に
    Clipboard = 
    ; クリップボードにさっきの単語を書き込む。
    ; これで語義ウインドウが出るはず
    Clipboard = %word%
			
; 右ボタンを離したら、「クリップボード自動検索」を ; オフにするように、メッセージを送る KeyWait, RButton SendMessage, 0x111, 34,,,ahk_id %ddwin%
; マウスカーソルの現在の位置を調べる。 ; 語義ウインドウの上じゃなかったら、語義ウインドウを消去する。 MouseGetPos, , , win WinGetClass, winClass, ahk_id %win% if(winClass != "TDefForm") WinActivate, ahk_id %actWin% ; 語義ウインドウがActiveじゃなくなったら自動的に消すように、 ; タイマハンドラを起動 SetTimer, DDWinPopUpClose, 100
; 最後に一発クリックする。これで選択状態が消える。この仕様はお好みで... Send, {LButton} } else ; マウスの右ボタンは普通に離された。普通の右クリックを出力 Send,{RButton} return
; DDwinの語義ウインドウを消去するためのタイマハンドラ DDWinPopUpClose: if(!WinExist("ahk_class TDefForm")){ SetTimer, DDWinPopUpClose,Off return } if(!WinActive("ahk_class TDefForm")){ WinClose, ahk_class TDefForm SetTimer, DDWinPopUpClose,Off return } return

上記のスクリプトで、下記のような動作をします(この動作は、Buckingham EB Playerのパクリです)。

  1. 英単語のように、両側に空白がある単語の上にマウスカーソルを持っていって、右ボタンを押しっぱなしにします。日本語のように、両側に空白がない単語を検索する場合は、検索したい単語を選択状態にしてから、右ボタンを押しっぱなしにします。
  2. 押しっぱなしにして0.3秒たつと、DDwinの"語義ウインドウ"が、マウスの近くに表示されます。もし、右ボタンを押しっぱなしにしたときに、DDwinが起動されてなかったら、DDwinを起動し、すぐ最小化してから、"語義ウインドウ"を表示します
  3. 右ボタンを離したら、"語義ウインドウ"はすぐに消えます。単語の意味がわかったらすぐに"語義ウインドウ"が消せるので、手間がかかりません。もし、もう少し調べてみないと単語の意味がよくわからないや、ということだったら、右ボタンを離さずに、マウスカーソルを"語義ウインドウ"の中に入れて、それから右ボタンを離してください。その場合は、"語義ウインドウ"は消えませんので、スクロールなどさせて、単語の意味をみっちり調べましょう。調べ終わったら、"語義ウインドウ"以外をクリックすれば、"語義ウインドウ"はすぐに消えます。

さすが、AutoHotkeyといったところでしょうか。なまず愛用の"Sleipnir(1.66)"でも、キチンと右クリックが横取りできていて、非常に単語検索が楽になりました。AHKのスクリプトを使って単語検索しながら、AHKの本家サイトを読む、これがまたオツなんだよね。

語義ウインドウ

と、いうことで、今回も小ネタの紹介といった感じになりました。しかし、今回のスクリプト開発は、なまずとしては、WM_COMMANDの使い方がわかったのが、非常に大きな収穫となりました。これでまた、アプリの自動実行の幅が広がったと、ワクワクしています。じゃ、今後ともよろしく!

本日のツッコミ(全1件) [ツッコミを入れる]
_ なお (2015-01-15 [木] 11:10)

はじめまして。AHTを使ってDDwinで検索する方法を探していました。とても参考にさせていただいてます! <br> <br>ただ私の場合はポップアップではなくて、DDwinの画面のまま検索がしたいので四苦八苦しています。アドバイスをいただければうれしいです。 <br> <br>まずいろいろ検索して、RUNのあとに下のコードを書くと、ある程度?上手くいきました。でも「グループ1」の辞書を全部検索することができません。 <br>どのように改善すればいいでしょうか? <br> <br>Run, C:\Program Files\DDwin\ddwin.exe `,2`,グループ1`,3`, %word% <br> <br>この「2」の意味は謎のままなのですが、「3」は「グループ1」の3番目の辞書だということがわかりました。でもグループ内のすべての辞書を指定するようにあれこれ試しているのですが、謎です。(辞書は全部で5つ入れています)。 <br> <br>初心者なので、分かりにくい質問をしていたらごめんなさい。 <br>お時間のあるときにお返事をいただけたらうれしいです。

[]