読者です 読者をやめる 読者になる 読者になる

覚えられませんっ

元「覚えらんない人のためのオンラインソフト備忘録」。遅ればせながらブログ移行してみた次第。

馬鹿は馬鹿なりのAutoHotkey-その2

俺馬鹿なんだから馬鹿なりでいいや、ととりあえず書き始めたものの、やはりわざわざ書く以上は多少なり人のお役に立てるものを、などと考え、iniファイルをあれこれといじり始めるやいなやあっという間にエラーやら不具合の嵐、己の馬鹿さ加減を思い知らされてやりきれない気持ちになりこの鬱憤をどうしてはらそうとふと目を上げるとソファに寝そべった我が家の雑種犬が三白眼で俺をにらんでいた。いやお前にあたったりしねえってば。
今回はアプリケーションごとのキーカスタマイズから行く。

アプリケーションごとのキーカスタマイズ

AutoHotKeyでは、IfWinActiveなどのコマンドにより条件分岐することでアプリケーションごとにキーアサインを変更することができる。これはたとえばキーカスタマイズができないソフトでメニューの深い階層にあるコマンドにショートカットキーを与える場合などに使える。俺はDVD鑑賞の際にMedia Player Classicを使用しているが、言語を日本語にするとか新作のコマーシャルを跳ばしていきなり本編にジャンプするとかいう場合にメニューを辿るのがかったるく、まずはこれにショートカットを与えてみようと思った。bboxさんやなまず日記さんの記述を頼りにiniを書いてみたのだが、俺が書くとどうもうまく動かない。設定したキーが他のソフトで効かなくなったりするのだ。「あっれーバージョンが違うから???」と風邪気味の鼻先から疑問符の形をした鼻提灯を飛び出させながらヘルプの英語を必死で読解し、マジで頭痛と発熱に苦しみながら何とか以下の形のものができた。

;Ctrl+LをMPCで言語の選択に、その他はデフォルトのままに
#IfWinActive, ahk_class MediaPlayerClassicW
^L:: Send, !nu
#IfWinActive,
Send,^L
return
;Ctrl+JをMPCでジャンプに、その他はデフォルトのままに
#IfWinActive, ahk_class MediaPlayerClassicW
^J:: Send, !nj
#IfWinActive,
Send,^j
return

#IfWinActiveというのはWindows2000/XPのNT系でしか動かないらしい。このコマンドは日本語の解説がネット上でなかなか見あたらず、Version 1.0.41.02のヘルプを見よう見まねで使っているだけで大変怖いんですが一応動いています。ヘルプを見る限りでは、1回目の#IfWinActive,でウィンドウを指定、2回目の#IfWinActiveに引数を何も与えないと1回目で指定したウィンドウ以外のすべてを表すようである。!nuはAlt-n-uとメニューを辿る。メニューの深い階層にあるコマンドを指定する場合はこのような書式でいける。{Altdown}とかめんどくさいこと書く必要はありませんし書くと動きません。(経験済み)

マウスの割り当て

AutoHotkeyをせっかく常駐させるのであれば、マウス操作のカスタマイズもしておきたい。だが俺はマウ筋がなんかよくわかんなくて使えなかったほどの男であるうえ、正直ブラウザ以外でのマウスジェスチャとか使わねえよなあ、って感じなので、マウス使用時にタブを見るとタブブラウザの習慣で閉じるために中クリックしてしまうゆえタブは中クリックで閉じるで統一できるといいなあ、くらいしか自分がすべきマウス操作のカスタマイズって思いつかない。
マウス中クリックで秀丸とかのタブを閉じる、というのはとりあえず簡単にできた。秀丸もサクラもタブ右クリック→Cでタブをクローズできるので、中クリックにこの操作を割り当ててやればよい。AutoHotkeyではテキストファイルを書けば一発で設定できてしまうので、俺にとってはXWheel NTとかマウ筋よりもずっと手軽に感じられる。

;マウス中クリック
;秀丸とサクラエディタでタブを閉じる
MButton::
  IfWinActive, ahk_class Hidemaru32Class
  Send, {RButton}c
  IfWinActive, ahk_class TextEditorWindow
    Send, {RButton}c
  else
    Send,{MButton}
return

ポインタの位置を判別するなんて細やかなことは一切してないから、タブ以外の場所で中クリックしても「右クリック-C」を送ってしまうので注意。俺個人は中クリックする習慣がないので大丈夫だが。

右ボタン押し下げによるマウスジェスチャ

マウスジェスチャの方はいちおう流行らせるページ跡地からahkファイルを落としてはみたものの、設定が難しくて挫折。代わりに以前どこかでいただいてきたマウスジェスチャのスクリプトをiniファイルに貼り付けて試しているうちに、何となくどこをいじれば設定変更ができ俺の意図通りの動きができるようになるかがわかってきた。俺が書いたわけではないので信用できると思う。どちらからいただいたのかわからなくなってしまったので、「それ書いたの俺。勝手に貼るな」とかありましたらぜひご連絡下さい。

RButton::
ifWinNotActive,ahk_class TKikiMain ;KIKIがアクティブなときは無効
ifWinNotActive,ahk_class TAfxForm ;同じくあふがアクティブなときは無効
{
 mg_active=1
 mg_executed=0
 mg_rheld=0
 mg_str=
 mg_dir1=
 mg_idletime=0
 MouseGetPos,px,py
 px2=%px%
 py2=%py%
 loop
 {
  GetKeyState,st,RButton,P ;マウス右ボタンを押し下げている場合
  if st=U
  {
   if mg_rheld=0
   {
    mg_active=0
    if mg_executed=0      ;movement action(s)
    if mg_str=L ;マウスを左に動かすと
    {
     Send,!{Left} ;Alt+Leftを送る
    }
    else
    if mg_str=R ;マウスを右に動かすと
    {
     Send,!{Right} ;Alt+Right
    }
    else
    if mg_str=U ;マウスを上に動かすと
     Send,^{Home} ;Ctrl+Home(先頭に移動)
    else
    if mg_str=D ;マウスを下に
     Send,^{End} ;Ctrl+End(末尾に移動)
    else
    if mg_str=RD ;→↓で
     {
     Run, C:\Bin\Env\cltc\cltc.exe ;cltc起動
     }
    else
    if mg_str=DR ;↓→で
    {
     WinClose,A :閉じる
    }
    else
     MouseClick,R
   }
   else
    MouseClick,R,,,,,U
   return
  }
  else
  if mg_idletime<30      ;timeout
  {
   MouseGetPos,dx,dy
   dx-=%px2%
   dy-=%py2%
   powx=%dx%
   powx*=%dx%
   powy=%dy%
   powy*=%dy%
   pow=%powx%
   pow+=%powy%
   if pow>3600       ;sensitivity
   {
    if powx>%powy%
     if dx>0
      mg_dir2=R
     else
      mg_dir2=L
    else
     if dy>0
      mg_dir2=D
     else
      mg_dir2=U
    if mg_dir2<>%mg_dir1%
    {
     mg_str=%mg_str%%mg_dir2%
     mg_dir1=%mg_dir2%
    }
    MouseGetPos,px2,py2
    mg_idletime=0
   }
   else
    mg_idletime++
  }
  else
  if mg_rheld=0
  if mg_executed=0
  {
   MouseGetPos,px2,py2
   if px2<>%px%
   if py2<>%py%
   {
    MouseClick,R,%px%,%py%,,,D
    MouseMove,%px2%,%py2%
    mg_rheld=1
    mg_active=0
   }
  }
  Sleep,10
 }
}
MouseClick,R,,,,,D
loop
{
 GetKeyState,st,RButton,P
 if st=U
  break
 Sleep,10
}
MouseClick,R,,,,,U
return

if mg_str=Lとかの行が右クリックしたままドラッグする方向を指している。もちろんLRUDは左右上下。ここで記述されていない動きもLRUDの組み合わせをたとえば

    else
     if mg_str=URU ;↑→↑
     {
     Send,^o
     }

などとして追加していけばよい。
マウスジェスチャに関して俺はこれで十分すぎるほど。マウスジェスチャ命な人はこんなへなちょこなページでなくもっとちゃんとしたサイトさんがいくらもありますので、そちらで研究なさってください。

ahkファイル

こちらは主にいわゆるスクリプト的な使い方をするためのものである。勉強不足のうえ先天的に知力と根気が不足している俺にはまだまだまともなahkスクリプトなど書けそうもない。練習で習作スクリプトを書いて動いたり動かなかったり動いたとしても不具合があったり。まあまずまともなものは書けない。ゆえに実際に使用するスクリプトはどちらかからの頂き物、ということになる。そんな中で俺が「ぬおおお」と思ったのは2005-04-07 - bboxさんのSearchkiki.ahkBagel メモ - PrincipiaさんのSearchBagel.ahk。前者はKIKIの、後者はBagelの検索ボックスに文字列を流し込んでくれるもの。AutoHotkeyを使う前はSendkeysでショートカットキーを送って文字列を流し込む、ってことをやっており、これだとうまくいったりいかなかったり。AutoHotkeyスクリプトを使えばずっと成功率が高そう。このスクリプトをBlueWindに乗り換える - 覚えらんない人のためのオンラインソフト備忘録で記述したBlueWindの同時検索グループにsendkeysを用いたコマンドの代わりに登録。登録は関連付けされていればahkファイルを指定するだけでよい。これでとにかく快適な複数エンジン同時検索環境ができあがった。
実は俺も最近気づいたのだが、Googleで「Autohotkey kiki」で検索するとうちがトップにヒットするんですよ。これだけでも申し訳ないのにろくな情報がないのでは余計に申し訳ない。そこでbboxさんには申し訳ないのですがスクリプトコピペさせていただきます。問題あればご指摘下さい。

;SearchKiKi.ahk
ifWinNotExist,ahk_class TKikiMain 
{
  Run,D:\Tool\kiki\kiki.exe ;ブラウザの実行ファイルのパスに書き換え
  WinWaitActive, ahk_class TKikiMain, ,5 
}
else
  WinActivate,ahk_class TKikiMain

ControlFocus,Edit2,ahk_class TKikiMain 

paraLen = %0%
Loop,%paraLen%
{
  buf := %a_index%
  sword = %sword% %buf%
}
ControlSetText,Edit2,%sword%,ahk_class TKikiMain
ControlSend,Edit2,{End},ahk_class TKikiMain
ControlSend,Edit2,{Space},ahk_class TKikiMain

ControlSend,Edit2,{Enter},ahk_class TKikiMain

このスクリプトはシンプルなものだけにKIKIやBagel以外のブラウザでも応用が利きそう。

  1. AutoHotkeyのタスクトレイアイコン右クリックからWindow Spyを起動
  2. 使用しているブラウザのクラス名を調べ、ahk_class TKikiMainを置換
  3. 文字列検索ボックスにカーソルを置いたときの( Now Under Mouse Cursor )のClassNN:の名前を調べ、Edit2を置換
  4. D:\Tool\kiki\kiki.exeをブラウザの実行ファイルのパスに書き換え
  5. ControlSendで送るキーを適当なものに書き換え(必要ない場合が多いと思う)

こんな手順で他のタブブラウザでも使えるのではなかろうか。(ためしてないけど。)