「右ボタンを押しながらカーソルを上に移動」や「右ボタンを押しながらホイールクリック」のようなマウスジェスチャ機能を実現する常駐スクリプト。
マウスジェスチャには、通常のメニューやツールバーを用いたマウス操作と比べて、小さなボタンなどにカーソルを合わせる必要がないため、カーソル位置を意識することなく素早くコマンドを実行できるという利点がある。
本スクリプトのジェスチャは、ボタン押し下げ、カーソル移動、ボタンを放す操作などの組み合わせで定義する。
動作割り当ては、アプリケーションなどの条件ごとに設定可能。条件には、AutoHotkeyの式を使用できる。
割り当てる動作は、AutoHotkeyのスクリプトで指定する。
ジェスチャ、条件別割り当ての条件、動作の割り当てなどは設定画面から行える。
MouseGesture.zipに含まれるファイル・フォルダは下記の通りである。
AutoHotkeyをインストールした状態でMouseGesture.ahkを起動すれば使用できる。
アップデート時は、アーカイブの中身を丸ごと上書きしてしまって構わない。
設定情報が記述された「MouseGesture.ini」や、追加のスクリプトを記述する「MG_User.ahk」は、配布アーカイブには含まれていないので、上書きされる心配はない。
スクリプトを再起動する事で、更新後のスクリプトを使用できる。
実行するとタスクトレイにアイコンが表示され、各種の操作を行える。
各コマンドの概要は、以下の通りである。
アイコンダブルクリック時には、「設定編集」の動作が行われる。
初回起動時には自動的に設定画面が表示される。ジェスチャは何も登録されていないので、何らかのジェスチャを登録する必要がある。
MouseGesture.ahkでは、対象ウィンドウなどの条件に応じて、一つのジェスチャに違う動作を割り当てられる。
特定のソフトでのみ割り当てを有効にしたい場合や、「通常はウィンドウを閉じる操作、タブ型MDIのソフトではタブを閉じる操作」とか、「通常はCtrl+Cを、コピーがAlt+CのソフトではAlt+Cを送信」のような似た動作を割り当てる事を想定している。
同じジェスチャに全く違う動作を割り当てるのは、割り当てを忘れがちになるので推奨されない。
通常は、ターゲットウィンドウはジェスチャの入力開始時にマウスカーソルの下にあったウィンドウ、ターゲットコントロールはカーソル下にあったコントロールとなる。
また、ターゲットウィンドウ・コントロールを所有するプロセスはターゲットプロセスとなる。
「設定」で「アクティブウィンドウをターゲットにする」を選択することで、ジェスチャの入力開始時にアクティブだったウィンドウをターゲットウィンドウ、入力フォーカスがあったコントロールをターゲットコントロールとすることも可能である。
設定画面の「条件定義」ページで、マウスカーソル下のウィンドウなどの条件に応じた割り当てを行うための条件定義を登録できる。
初期状態では、いくつかの標準的な条件が登録されている。
「↑」「↓」ボタンでは、エントリの並び替えが、「-」では削除が行える。
新たな定義を追加するには、まず「+」ボタンで新規エントリを作成する。
「C」ボタンでは、条件定義をテキスト化した文字列がクリップボードにコピーされる。「クリップボードからインポート」を実行すれば、逆にクリップボード上の定義文字列を設定に追加できる。
これにより、掲示板などで他のユーザーとの定義情報の受け渡しを円滑に行える。
なお、特別な条件である「Disable」には、ジェスチャの認識を無効にしたいプログラムの条件を登録する。
ゲームなどで、ジェスチャが有効になっていると不具合が発生する場合や、プログラムが独自に搭載しているジェスチャ機能を利用したい場合などに使用する。
新規の条件定義を作成したら、「定義名」に分かりやすい名称を入力して「変更」を実行する。
なお、設定がAutoHotkeyのスクリプトに変換される際、定義名は関数名として使用されるため、半角英数字や「_」以外の文字は使用できない。
動作割り当てで使用されている定義の名前を変更しようとした場合は、動作割り当て側の名前を置き換えるかどうかを問い合わせるダイアログが表示される。
動作割り当て側の名前を置き換えなかった場合は、手動で動作割り当てを変更・解除するか、新たに変更前の名前で条件を作成する必要がある。
次に、条件を判別する方法を選択し、条件値を入力する。
条件種別は、それぞれ以下のような意味がある
「入力補助」を押して、条件として登録したいウィンドウを右クリックすると、条件値が取得され「値」の欄に入力される。
「カスタム条件式」、「他定義との一致」では、ポップアップメニューが表示され、クリックした項目が条件値として入力される。
「追加」ボタンを押すことで、右のリストに条件が追加される。
条件は複数登録することが出来る。
リストの右の「×」ボタンで条件の削除、「↑」「↓」ボタンで並び替えが行える。
ここでの並び順通りに判別処理が行われるが、基本的に判別結果には影響しない。
リストの右下のドロップダウンリストでは、複数の条件が登録された場合の扱いを「どれかに一致」と「全てに一致」から選択できる。
「どれかに一致」は、「IEとFirefoxとOpera」など複数の違うプログラムにまとめて同じ動作を割り当てたい場合などに使用する。
「全てに一致」は、「Hoge.exeのForm1クラスのウィンドウ」や「エクスプローラのツリー部分」など、複数の条件で絞り込み対場合に使用する。
MouseGesture.ahkでは、ジェスチャは「特定のボタンの押し下げ」「押されているボタンをどれか一つ放す」「ホイール回転などの操作」「カーソルを特定の方向へ一定以上移動(ストローク)」などの操作の連続として定義される。
例えば、一般的なジェスチャツールでの「右ボタンを押しながら左クリック」は「右ボタンを押し下げ、左ボタンを押し下げ、ボタンをどれか一つ(この場合は左ボタン)放す」、「右ボタンを押しながらカーソルを左に移動」は、「右ボタンを押し下げ、カーソルを左に移動し、ボタンをどれか一つ(この場合は右ボタン)放す」という操作として表される。
新たなジェスチャを定義するには、「ジェスチャ定義」タブで「+」ボタンを押して新規作成し、適当な名称を入力して「変更」を押す。
ジェスチャ定義の定義名には、日本語も使用できる。
次に、右下のパレットでジェスチャのパターンを入力していく。
入力中のパターンは、中央の編集欄に表示される。編集欄を直接編集して指定する事も可能。
右のリストをダブルクリックすれば、パターンの末尾にボタン操作が追加される。
一つ以上のボタン押し下げが入力された状態では、「カーソル移動」のボタンを押す事で、カーソル移動を追加できる。
ボタンのクリックなどを表すには、最後に「ボタンをどれか一つ放す」をつける必要がある。
なお、放すボタンの順番を区別する事は出来ない。「右ボタンを押しながら左ボタンを押して放す」と、「右ボタンを押しながら左ボタンを押して右ボタンを先に放す」は同じジェスチャとみなされる。
高度な機能については、「高度なジェスチャ定義」を参照。
「追加」ボタンを押すことで、定義が追加される。
一つの定義に複数のジェスチャを登録する事も可能。
「←↑→↓」「↑→↓←」のような似たジェスチャを一つの定義にまとめて、どれが入力されても意図した動作が実行されるようにできる。
「×」ボタンで削除が行えるほか、「↑」「↓」で並び替えも可能だが、並び順で動作に違いが現われる事はない。
「動作割り当て」のタブでは、ジェスチャ定義で作成したジェスチャに対して動作の割り当てを登録する。
左のリストでジェスチャを選択したら、「条件」で条件を選択する。
特別な条件「Default」には、他のどの条件にも一致しなかった場合に実行される動作を指定する。
どの条件にも一致せず、Defaultにも動作が割り当てられていない場合は、何の動作も行われない。
Default以外の複数の条件に一致する場合は、リストで一番上になっている条件に割り当てられた動作のみが実行される。
下部の大きな入力欄に、実行される動作をAutoHotkeyのスクリプトで記述する。
なお、ドロップダウンリストからテンプレートを選択し、「入力補助」を押せば、スクリプトが自動入力される。
代表的なテンプレートには、以下のようなものがある。
「キー操作を発生させる」などの入力補助では、動作の詳細を指定するパラメータを入力するダイアログが表示される。
入力補助の処理が完了すると、このようにスクリプトが入力される。
「追加」ボタンを押すことで、動作割り当てが追加される。
「×」で割り当ての削除、「↑」「↓」で優先順位の並び替えを行える。
右下の「OK」ボタンを押すと、設定が「MG_Config.ahk」というスクリプトファイルに変換され、スクリプトが再起動し、設定が有効になる。
MouseGesture.ahkには、オプションとしてデスクトップの外周にカーソルが触れたことを検出して動作を実行させる機能も用意されている。
外周へ接触する事がボタンの押し下げ、離れる事が押し上げとして扱われる。
通常のボタン操作やストロークと組み合わせたジェスチャも定義可能。
「MG_ScreenEdge」フォルダ内の「buttons」フォルダに格納されているボタン定義ファイルを、「MG_Buttons」フォルダに移動することで、ジェスチャ定義で使用できるようになる。
ボタン定義は、四隅と各辺、各辺2等分、3等分の合計28種類が用意されている。
全てをMG_Buttonsに入れると、ジェスチャ定義のボタン一覧が増えすぎて邪魔なので、必要な物だけを入れる。
各辺の「全体」と「半分」や「1/3」など重複する部分が同時に有効化されている場合、「1/3」「半分」「全体」の順で優先的に認識される。
例えば、上端系のうち「上端全体」と「上端左1/3」のみが有効になっている場合、上端の左1/3は「上端左1/3」、残り2/3は「上端全体」として認識される。
角は辺よりも優先されるが、「右上角」と共に「上端全体」「右端全体」などが有効化されている場合、角に触れるより先に辺に接触して認識されてしまうことが多く、角への接触を認識させるのが難しくなってしまう。
角への接触を使いたい場合、角と繋がっている辺は使用しないようにすればいい。
それぞれのボタン名と、認識箇所の対応は以下の通り。
|
|
|
|
|
下記のようなINIファイル形式のテキストは、クリップボードにコピーした状態で「クリップボードからインポート」ボタンを押すことで、簡単に設定に追加できる。
同梱のReadme.txt内に、いくつかの利用例が掲載されている。
[右↑] G=RB_U_ [右↓] G=RB_D_ [右←] G=RB_L_ [右→] G=RB_R_ [右+←→] G=RB_LR_ [右+左クリック] G=RB_LB__ [右+中央クリック] G=RB_MB__ [右ホイール↑] G=RB_WU_ [右ホイール↓] G=RB_WD_
iniファイルの仕様は、テキストエディタなどでも編集しやすいように、直感的な最小限の記述で動作を定義できるように設計されている。
キーボードのみで移動や記述を行え、検索、置換、コピー&ペーストなどの機能を利用できるため、慣れれば編集画面を使用するより効率的に設定を行える。
トレイメニューの「設定編集」で、前述の設定画面の代わりにテキストエディタを起動するようにするには、MouseGesture.iniの「[Settings]」セクション以下に、以下のような記述を追加すればいい。下記例の場合、iniファイルに標準で関連づけられたエディタで開かれる。
iniファイルを直接編集した場合は、トレイメニューから「再起動」を実行するか、ホットキーなどから「GoSub,MG_Reload」を実行することにより、手動で設定を反映させる必要がある。
EditCommand="edit " . A_ScriptDir . "\MouseGesture.ini"
条件定義セクションでは、条件定義画面の定義名に相当するものをセクション名とする。
エントリ名は、条件一覧の「条件種別」に表示されるもの(「WClass」「CClass」「Title」「Exe」「Custom」「Include」)、で、エントリの値は「条件値」に表示されるものを記述する。同じ名前のエントリは、いくつでも記述して構わない。
また、「全てに一致」を指定するには、「And=1」というエントリを記述する。
例えば、エクスプローラのツリーを「ExplorerTree」という条件名で登録するには、下記のように記述する。
[ExplorerTree] WClass=ExploreWClass CClass=SysTreeView32 And=1
ジェスチャ定義と動作割り当ては、同じセクションに記述する。セクション名は、なんでも良い。
「G」という名前のエントリで、ジェスチャ文字列を定義する。このエントリは、いくつでも記述して構わない。
動作割り当ては、割り当てたい条件定義名や「Default」をエントリ名として、割り当てるスクリプトを値として記述する。
スクリプトを複数行にする必要がある場合は、改行の代わりにTab文字を使用し、1行で記述する。
何行にも及ぶ複雑なスクリプトを割り当てたい場合は、MG_User.ahkにサブルーチンや関数として記述して、それを呼び出す処理を動作割り当てに記述した方がよい。
MG_User.ahkの部分を変更した場合も、メニューの「再起動」や「MG_Reload」サブルーチンで再読み込みする必要がある。
「Settings」セクションには、「設定」画面で設定する情報を記述する。
チェックボックスは、OFFは0、ONは1と記述する。
条件定義の「カスタム条件式」では、条件値としてAutoHotkeyの条件式を記述することで、様々な条件によるターゲット判別が行える。
MouseGesture.ahkに用意されている変数や関数を利用すれば、通常では他のウィンドウと区別しづらいウィンドウでもプログラム別の動作割り当てが実現可能。
また、コントロールやウィンドウの部位に応じて、細かく条件を分けることも出来る。
なお、値の比較時は、移植性を高めるため「=」「<>」演算子ではなく「==」「!=」演算子を使うようにすること。
AutoHotkeyのスクリプトやJava製のプログラムなどは、どのプログラムでも「実行ファイル名」が「AutoHotkey.exe」や「javaw.exe」になってしまい、どのプログラムのウィンドウかが判別できない。
また、ウィンドウクラスやコントロールクラスも、「AutoHotkeyGUI」や「SunAwtFrame」のような一定の名前になっていて、判別に使えないことが多い。
このような場合は、タイトルバーに表示されるウィンドウタイトルで判別するとよい。
しかし、ウィンドウタイトルは、開いているファイル名などが表示されて、一定ではなくなっている場合がある。
この場合でも、「C:\Program Files\AutoHotkey\AutoHotkey.ini SomeEditor」のように、タイトルに付加されるプログラム名などを目印にすれば判別できる。
タイトルの部分一致で判定するには、条件種別の「カスタム条件式」で、「InStr(MG_Title,"検索する文字列")」のようにすればいい。
ただし、単に「InStr(MG_Title," SomeEditor")」の条件だけで判別すると、「 SomeEditor」を含むタイトルになっている他のソフトにも一致してしまう。
これを防ぐには、ウィンドウクラスやプログラム名などの条件と組み合わせて、「全てに一致」を選択して、条件を狭めればいい。
また、正規表現を用いれば、タイトルの先頭や末尾に含まれる場合にのみ一致とみなすなどの高度な条件定義も可能である。
先頭にのみ一致させるには、「RegExMatch(MG_Title,"^検索する文字列")」、末尾にのみ一致させるには「RegExMatch(MG_Title,"検索する文字列$")」とする。
タイトルにも目印になるような文字列がない場合でも、プログラム実行時のコマンドラインで判別できる場合がある。
例えば、AutoHotkeyのスクリプトを実行しているプロセスは、「"(フォルダパス)\AutoHtkey.exe" "(スクリプトファイルのパス).ahk"」のようなコマンドラインで起動される。
ターゲットプロセスの起動に使われたコマンドラインは、「MG_CommandLine()」関数で取得できる。
カスタム条件式で、「InStr(MG_CommandLine(),"MG_Edit.ahk")」のようにして使えばいい。
この条件だけだと、スクリプトファイルを編集しているエディタなども一致とみなされてしまうので、実行ファイル名と組み合わせて「全てに一致」で判別するか、正規表現を利用して「RegExMatch(MG_CommandLine(),"\\AutoHotkey\.exe.*MG_Edit\.ahk")」のように実行ファイル名部分とスクリプトファイル名部分の両方をチェックするようにするといい。
タイトルやコマンドラインによる判別を応用すれば、「Googleを表示しているときのみ有効」や「HTMLファイルの編集中のみ有効」というような割り当ても実現できる。
タイトルバーや枠など、ウィンドウの部位を判別する関数として「MG_HitTest()」「MG_TreeListHitTest()」などの関数が用意されている。
これらの関数を利用した条件式は、「入力補助」で表示されるテンプレートメニューの「ウィンドウの部位」から入力できる。
これにより、「タイトルバーをホイルクリックで最小化」などの動作割り当てが実現できる。
マウスカーソルのハンドルを取得する「MG_GetCursor()」を使うことで、ブラウザのリンクなど、コントロール上の部位を判別できる場合がある。
入力補助メニューには、Windowsで標準定義されているカーソル種別や、標準カーソルであるかどうかの判別を行う条件式が用意されている。
Windowsの標準カーソルでないソフト固有のカーソルは、ハンドルが一定ではないので判別は難しい。
しかし、コントロール上の大部分では標準のカーソル(矢印など)で、特定の部分でのみ非標準のカーソルになるというような場合なら、テンプレートの「不明(ソフト固有など)」で判別できる。
なお、カーソルの取得と判別は、ジェスチャの開始時ではなく、ジェスチャが認識された時点で行われる。
その為、ストロークを含むジェスチャでは正しく判別できない事がある。
カーソルによる判別は、ボタンのみで構成されるジェスチャで使用するべきである。
一つのウィンドウに同じクラス名のコントロールが複数有り、それぞれのコントロールで別の動作割り当てを行いたい場合は、コントロールの横・縦座標、幅、高さを得る「MG_ControlX()」「MG_ControlY()」「MG_ControlW()」「MG_ControlH()」を利用するといい。
例えば、左右にならんだ2つの入力欄の左側を判別するには、「MG_ControlX()<50」のようにする。
SunのJava実行環境で実行されているプログラムのように、コントロールを全て独自に描画していて、Windowsのウィンドウ管理からは一つのウィンドウとしてしか認識されないような場合も、カーソルがウィンドウ上のどの位置にあるかを調べることである程度の判別が行える。
ターゲットウィンドウの横・縦座標、幅、高さは、それぞれ「MG_WinX()」「MG_WinY()」「MG_WinW()」「MG_WinH()」で得られる。
また、マウスカーソルの座標は「MG_X」「MG_Y」変数に格納されている。
よって、ターゲットウィンドウ上でのカーソル座標を表す式は「MG_X-MG_WinX()」となる。
例えば、ウィンドウの左から200ピクセルまでの領域を判別するには、「MG_X-MG_WinX()<200」という式を指定すればいい。
ジェスチャの認識が開始された時点でのマウスカーソル座標を格納しているMG_X、MG_Y変数を使用することで、ジェスチャ開始位置に応じた動作割り当ても可能。
例えば、仮想デスクトップソフトと組み合わせて、画面の右半分では次のデスクトップに切り替え、左半分では前のデスクトップに切り替えというような動作を実現できる。
MouseGesture.ahkでは、一般的なジェスチャツールで利用できる「ボタンを押しながらカーソル移動」や「ボタンを押しながら別のボタンをクリック」のようなジェスチャ以外にも、様々なジェスチャを定義可能である。
以下では、それらの特殊なジェスチャについて説明する。
なお、「RB_LR_」などは、ジェスチャ定義画面などで表示されるジェスチャ文字列を表す。
「右ボタン、左ボタンの順に押し下げた状態でカーソルを移動」のような、複数のボタンを押しながらのストロークにも割り当て可能である。
例えば、「RB_LB_LR_」では、「右ボタン、左ボタンの順に押し下げた状態でカーソルを左、右と移動し、どちらかのボタンを放す」というジェスチャを定義できる。
また、「RB_LB_LR__」では、ボタンが二つとも放された時点で発動するようになる。
ウィンドウをまとめて閉じるなど、誤発動すると困る動作を割り当てるといいだろう。
カーソル移動(ストローク)の認識は、「設定」タブの「通常ストローク」で指定した以上の移動であれば、同じ方向にどれだけ移動しても一つのストロークとみなされるが、他3つの設定で指定した距離を超えるごとに追加でストロークが認識され、「LL」「RR」「UU」「DD」のように認識される。
例えば、「R_LL_」は、右ボタンを押しながらカーソルを左に大きく移動してボタンを放したときに発動する。
Lでは最小化、LLでは全て最小化のように、上位版の動作を割り当てるなどの使い方をするとよいだろう。
設定値の2倍以上移動すれば、「LLL」のように3段階以上の長距離ストロークも認識される。
「RB_MB__」や「RB_L」のようなジェスチャに割り当てられた動作が発動すると、押されているボタン以外の内容がリセットされ、「RB_」まで認識された状態から認識処理が続行される。
その状態で更に中央ボタンクリックを行えば「RB_MB__」が、左にカーソルを動かせば「RB_L」が再度認識され、動作が発動する。
これにより、これらのジェスチャは、ボタンを押したまま何度でも連続発動できる。
なお、「RB_MB_」に動作が割り当てられている場合、ホイールボタンが押された時点でジェスチャが発動し、その後「RB_MB_」の状態から認識が続行される。
その後ホイールボタンを放すと「RB_MB__」の状態になる。
「RB_MB__」に動作が割り当てられていなければ、続けてジェスチャの入力が可能である。
この場合、もう一度中央ボタンを押しても「RB_MB__MB_」となって、「RB_MB_」は発動しない。
連続して「RB_MB_」を発動させたければ、「RB_MB__」に空のスクリプトを割り当てて、リセットのみを発生させるようにするといい。
入力中のジェスチャが、登録されているどのジェスチャ文字列よりも長くなると、入力ミスであるとみなされ、自動的に入力内容がリセットされる。
これにより、「RB_LDRU」のようなジェスチャを連続実行しているときに「RB_LDU」のような不完全なジェスチャが入力されてしまっても、そのまま「RB_LDULDRU……」と入力し続けることで「RB_」にもどり、再び「RB_LDRU」の認識が可能になる。
ボタンを押していた長さに応じて動作を変えたい場合は、ボタンを押し下げた時点の動作に、「MG_Hold()」関数を使ったスクリプトを記述する。
この関数は、ジェスチャの発動時には、ボタンを監視するタイマーをセットして空文字列を返す。
ボタンが放されたとき、ジェスチャに割り当てたスクリプトが再実行される。
再実行されたときのこの関数の返値は、ボタンが押されていた長さ(ミリ秒)になる。ボタン押し下げ時の動作として以下のようなスクリプトを割り当てる事で、ボタンを長押しして放したときに動作を実行させられる。
if(MG_Hold()>500){ ;長押しクリック時の動作を記述 }
MG_Hold()を利用すれば、ボタンを押してすぐに放したときだけ動作を実行させる事も出来る。
しかし、単に「MG_Hold()<500」とすると、押し下げ時に実行されたときにも条件が成立してしまう。
そこで、以下のようにする。
if(MG_Hold() && MG_Hold()<500){ ;短クリック時の動作を記述 }
なお、長押しと短クリックに別の動作を割り当てるには、以下のようにすればいい。
if(MG_Hold()){ if(MG_Hold()>500){ ;長押し時の動作 }else{ ;短クリック時の動作 } }
「MB_」と「MB__」にそれぞれ動作を割り当てる事でも、押し下げと押し上げにそれぞれ動作を割り当てる事は可能だが、ボタンを押しているときにストロークが認識されると「MB_L_」のようになってしまうし、押し下げ時と押し上げ時の動作を別のジェスチャに記述するので管理しづらいなどの難点がある。
ボタン押し下げ時の動作に、以下のようなスクリプトを記述する事で、押し上げ時の動作を同時に定義できる。
この場合、押し下げている間にストロークが認識されても、押し上げ時の動作は発動する。
if(!MG_Hold()){ ;押したときの動作 }else{ ;放したときの動作 }
「MG_While()」関数では、ボタンを押している間定期的に同じ動作が実行される。
その際、MG_While()の返り値は「1」になる。
引数として、定期実行の間隔をミリ秒で指定できる。未指定時は20ミリ秒。
以下のようにして、ボタンを押している間キーの連打を発生させたりするのに利用できる。
if(MG_While(100)){ Send,{PageDown} }
なお、ボタンを放した後にも一度だけ同じ動作が実行される。
この時は、MG_While()の返り値が「0」になる。
以下のようにして、押している間と放した時の動作を定義できる。
if(MG_While(100){ ;押している間の動作 }else{ ;放した時の動作 }
なお、繰り返し間隔が長いと、放した時の動作の発生が遅れる事がある。
放した時の動作を利用する場合は、間隔は200ミリ秒を超えない程度にとどめておくのがよい。
ボタンの監視状態は、「MG_WhileState」変数に格納されている。
以下のようにすることで、「押し下げ時」「押し下げ中に繰り返し実行」「押し上げ時に実行」の3通りの動作を実行させられる。
「押し下げ時の動作」の後の「MG_While(100)」で間隔を指定して監視登録を行う。
後の「if(MG_While())」は、繰り返し呼び出されるときにのみ実行されるので、間隔を指定する必要はない。
if(!MG_WhileState){ ;押し下げ時の動作 MG_While(100) }else if(MG_While()){ ;押し下げている間の動作 }else{ ;放したときの動作 }
MG_Hold()は、ボタン押し下げ以外の瞬間に発動するジェスチャで使用されると、その時点で押し下げているボタンが放されたときに、割り当てられたスクリプトの再呼び出しを行う。
下記のようなスクリプトを「RB_WD_」などに割り当てておけば、右ボタンを押しながらホイールを回したときにAlt+Tabを実行し、Altはそのまま押しっぱなしにして、右ボタンが放されたときにAltを放す操作を発生させるという動作を実現できる。
if(!MG_Hold()){ Send,{Alt Down}{Tab} }else{ Send,{Alt Up} }
ジェスチャに割り当てるスクリプト中で、「Menu,Show」や「MsgBox」のようなスクリプトの実行が停止される動作を直接呼び出すのは望ましくない。
そこで、「MG_Defer()」で、ジェスチャの認識処理が終了した後に実行されるようにする。
「MG_Defer()」は、登録時には「0」、認識処理の終了後に呼び出されたときには「1」を返す。
「RB_LR_」のような、全てのボタンが放された時点で発動するジェスチャも、ジェスチャ認識処理が完全に終了する前に実行されるので、MsgBoxなどを割り当てるときはこの処置が必要となる。
if(MG_Defer()){ MsgBox,% MG_Title }
ボタンを押し下げてから、ボタンを放さずに一定時間が経過した瞬間に動作を発動させたい場合は、「MG_Timer()」関数を使う。
この関数が実行されると、タイマーが登録時されて、「1」が返される。
引数で指定された時間が経過すると、ジェスチャ内容が変化していない場合のみ、同じスクリプトが再実行される。この時、MG_Timer()の返り値は「0」になる。
時間経過前にボタンが放されたり、ストロークや他のボタン操作が認識された場合は、再実行は行われない。
画面端接触認識への割り当てで使用すれば、誤って触れたときには発動しないようにすることが出来る。
以下のような形で使用する。
if(!MG_Timer(500)){ ;指定時間経過後に実行される動作 }
単に「右ボタンを押しながら左ボタンでダブルクリック」に割り当てたいなら、「RB_LB__LB__」というジェスチャを定義すればいい。
しかし、「RB_LB__」に動作が割り当てられていた場合、その動作が実行された時点でジェスチャ内容が「RB_」にリセットされてしまうため、「RB_LB__LB__」の状態になる事が無くなってしまう。
「RB_LB__」の動作に、「MG_Wait()」を追加することで、ジェスチャ内容の破棄を無効化し、追加の入力を受付させる事が出来る。
なお、このようにして単独クリックとダブルクリックに動作を割り当てた場合、ダブルクリック時には単独クリックの動作とダブルクリックの動作が順番に実行される事になる。
「単独クリックで選択、ダブルクリックで実行」のように、ダブルクリックには、単独クリックの動作から繋がる形の動作を割り当てるようにするといい。
Send,{Home}+{End} MG_Wait()
ジェスチャの途中で全てのボタンが放された状態になると、ストロークの認識処理が終了すると共に、入力中のジェスチャ内容は破棄される。
このため、「RB__RB__」のような単独のダブルクリック操作や、「RB_R_RB_D_」のような途中でボタンを放す複数ストロークジェスチャは、認識できない。
しかし、「設定」タブのダブルジェスチャの間隔上限を設定していた場合や、ボタンが放される操作に「MG_Wait(500)」のような動作が割り当てられていた場合は、ボタンが全て放されてからも、指定された時間(ミリ秒)だけジェスチャの追加入力が可能となる。
多くのジェスチャで使用したい場合は、いちいち「MG_Wait(500)」を記述するのは面倒なので、設定画面で一括指定するといい。
「ダブルクリックの1回目」ではなく、1回だけしかクリックされなかったときにのみ動作を実行させたい場合も、「MG_Timer()」を利用すればいい。
MG_Timer()の引数を負の値にすると、MG_Wait()で待機時間を指定したときと同様に、ジェスチャ内容破棄の無効化と、追加入力の受付が実行される。
例えば、「MB__」に以下のようなスクリプトを割り当て、「MB__MB__」等に別のスクリプトを割り当てれば、ホイールボタンがクリックされ、その後500ミリ秒間他のボタンが認識されなかった場合のみ、記述された動作が実行される。
この場合、「MB__MB__」には、普通に動作を割り当てればいい。
if(!MG_Timer(-500)){ ;クリックが1回のみだった場合の動作 }
上記の方法を応用すれば、「RB_LB__LB__LB__」のようなボタンを押しながらの3回以上クリックや、「MB__MB__MB__」のような単独での3回以上クリックも定義可能である。
「1回のみ」「2回のみ」「3回」にそれぞれ動作を割り当てる場合は、「MB__MB__」にもMG_Timer()を使った動作を割り当てる。
Altなどの修飾キーと組み合わせたジェスチャを使用したい場合は、新規ボタン定義で修飾キーをボタンとして登録する。
修飾キーの本来の機能を有効にしたい場合は、「~Alt」のようにキー名に「~」をつける。
CtrlやShiftのような、元々マウス操作と組み合わせることが多いキーをジェスチャに使用すると、誤発動が起こりやすくなるので推奨されない。
左右にある内の片側しか使っていないなら、「RShift」「LCtrl」のようにして、左右どちらかのキーに限定するといい。
例えば、WindowsキーをWKボタンとして登録した場合、「WK_RB_U_」でWindows+右ボタン+上ストロークのジェスチャを定義できる。
「WK_U」のような、キー+ストロークのジェスチャも定義可能。ノートPCのタッチパッドなどで使うと便利かも知れない。
動作割り当てでは、AutoHotkeyの各種コマンド・関数を利用する事で、様々な動作を実現できる。
以下では、AutoHotkeyのスクリプトやMouseGesture.ahkに用意された関数を利用して実現できる特殊な動作について説明する。
ジェスチャの認識が行われても、割り当てられた動作が実行されなかった場合は、極力元のマウス操作が(一瞬で)再現されるようになっている。
例えば、「R__」に動作が割り当てられていない状態で右ボタンを押して放せば、普通に右クリックをしたときと同じ動作が行われる。
カーソルをある程度動かしてから、一定時間停止させれば、その時点でジェスチャの認識が打ち切られ、それまでのマウス操作が再現される。
これにより、右ボタンが開始ボタンに使われている状態でも、右ボタンでのドラッグなどを利用できる。
動作に「MG_Abort()」を割り当てて発動させた場合も、ジェスチャの認識は打ち切られる。
「RB_L」のように、ストロークジェスチャに使っていない方向のストロークが認識された瞬間に発動するジェスチャに割り当てれば、即座に右ドラッグ&ドロップを開始できて便利である。
あるソフトでは右ボタンはジェスチャに使用せず普通に使いたいけど、他のボタンのジェスチャは使いたいというような場合、「RB_」のようなボタン押し下げ操作の動作割り当てで、そのソフトを表す条件に「MG_Abort()」を割り当てる。
この場合、「Disable」条件に一致した場合とほぼ同様に、ジェスチャの認識処理が行われることなく、ボタン本来の動作が行われる。
マウスホイールの回転では、通常はアクティブなウィンドウのフォーカスのあるコントロールが操作される。
これをカーソル下のコントロールに転送するには、以下のような割り当てを行う。
[WheelRedirectUp] G=WU_ Default=PostMessage,0x020A,% 0x00780000|GetKeyState("LButton")|GetKeyState("RButton")<<1|GetKeyState("Shift")<<2|GetKeyState("Ctrl")<<3|GetKeyState("MButton")<<4|GetKeyState("XButton1")<<5|GetKeyState("XButton2")<<6,% MG_Y<<16|MG_X,,ahk_id %MG_HCTL% [WheelRedirectDown] G=WD_ Default=PostMessage,0x020A,% 0xFF880000|GetKeyState("LButton")|GetKeyState("RButton")<<1|GetKeyState("Shift")<<2|GetKeyState("Ctrl")<<3|GetKeyState("MButton")<<4|GetKeyState("XButton1")<<5|GetKeyState("XButton2")<<6,% MG_Y<<16|MG_X,,ahk_id %MG_HCTL%
「MG_Move()」関数を使用すると、マウスカーソルを指定座標に移動できる。
引数に横・縦の座標を指定するとその座標に、引数を省略するとジェスチャ開始位置に移動する。
「RB_L」のようにカーソルを移動するごとに繰り返し発生するジェスチャは、連続して実行し続けるといずれ画面端に到達してしまうため、連続実行できる数に限りがある。
しかし、動作の後に「MG_Move()」を付ければ、動作が実行される度にカーソル位置が元に戻るため、ボタンを押したままいくらでも繰り返し実行できる。
MouseGesture.ahkには、ターゲットコントロールをスクロールさせる関数が用意されている。
スクロール関数は、「MG_Scroll()」「MG_InstantScroll()」「MG_DragScroll()」の3種類がある。
いずれも「MG_While()」と合わせて、以下のようにして使用する
if(MG_While()){ MG_Scroll(-3) }
チルトなどのボタンを押している間、一定量ずつスクロールさせるには、「LT_」などのボタン押し下げ時の動作に上記のようなMG_Scroll()を使用したスクリプトを割り当てる。
MG_Scrooll()の引数には、横と縦のスクロール量を整数で指定する。横スクロールだけの場合は、第1引数だけでよい。
1単位辺りでスクロールするピクセル数は、コントロールによって違う。1単位で1文字/1行ずつスクロールするコントロールもあれば、1単位で1ピクセルスクロールするコントロールもある。
上記の例では、ボタンを押している間、ターゲットコントロールを左にスクロールする。
if(MG_While(60)){ MG_InstantScroll(0) }
IEのホイールスクロールのように、ボタンを押し下げた位置と現在のカーソル位置の距離に応じてスクロール方向・量を変化させたい場合には、ボタンの押し下げ動作に「MG_InstantScroll()」を使用した動作を割り当てる。
この場合、スクロール速度を調整するには、上記のようにMG_While()の引数で実行間隔を指定する。
第1引数は、「1」ならスクロールさせた分だけカーソルが戻る。この場合、スクロールさせ続けるには、カーソルを移動し続ける必要がある。
第1引数を「0」にした場合、IEのホイールスクロールと同じような動作になる。ボタンを押して、スクロールさせたい方向に適量カーソルを移動すれば、ボタンを押し続けるだけでスクロールするようになる。
第2/第3引数は、何ピクセルの移動で1単位スクロールさせるかの比率(縦と横)。
if(MG_While()){ MG_DragScroll() }
MG_DragScroll()では、コントロールを掴むような感じで、マウスカーソルの動きに合わせてスクロールさせられる。
第1/第2引数で、移動ピクセル数とスクロール単位の比率を指定する。
それ以外の使い方はMG_InstantScroll()と同じ。
なお、これらのスクロール機能は、標準のスクロールメッセージを無視するコントロール(Geckoエンジンのブラウザなど)には使用できない。
これらの未対応のコントロールは、条件別割り当てで矢印キーなどを送信するしかない。
ファイルを指定する手段がウィンドウへのドロップのみのソフトで、ファイルの指定を自動実行させたいときなどのために、「MG_DropFiles()」関数が用意されている。
この関数は、第1引数にドロップするファイルのパスの改行(`n)区切りリスト、第2引数にタイトル等のウィンドウ指定文字列を指定する。
第2引数を省略した場合は、ターゲットウィンドウにドロップされる。
第1引数を省略した場合は、クリップボード内のファイル名が使用される。
ファイル選択ダイアログで表示されているフォルダにファイルをコピーしたい場合、ファイルをクリップボードにコピーしてCtrl+Vを送信して貼り付けるという方法が考えられる。
このような場合のために、指定ファイルをクリップボードにコピーする「MG_FilesToClipboard()」関数が用意されている。
この関数は、第1引数としてファイルパスの改行(`n)区切りリストを指定する。
通常は普通のコピーだが、第2引数に「1」を指定すると「切り取り」と同じ状態になり、貼り付けを行ったときにコピーではなく移動が行われるようになる。
「PostMessage」コマンドや「ControlSend」コマンドを使うことで、音楽プレイヤーソフトの操作のように、カーソル下のウィンドウではなく、実行中の任意のプログラムを操作することも出来る。
タスクトレイに格納されたりして非表示になっているウィンドウを操作するには、事前に「DetectHiddenWindows,On」を実行する必要がある。
呼び出された回数を記録する「MG_Counter()」を利用する事で、奇数回目の実行時はA、偶数回目の実行時はBというように、実行回数による動作の振り分けが可能。
引数未指定時は、同じジェスチャの実行ごとに、「0」「1」が交互に返される。
if(MG_Counter()){ ;奇数回目の実行時の動作 }else{ ;偶数回目の実行時の動作 }
MG_Counter()の第一引数は、カウンタの名前を指定する。
未指定時は、現在のジェスチャ名になる。
条件別実行のターゲットごとにカウンタを独立させたい場合や、複数のジェスチャで共通のカウンタを利用したい場合に指定する。
3つ以上の動作振り分けを行いたい場合は、第2引数で数を指定する。
この場合、「1,2,0,1,2,0」と、呼び出し回数を第2引数で割った値が返される。
しかし、複数回呼び出されると、そのたびにカウンタが増加してしまうので、正しく動作しない。
値を別の変数に格納してから判定するか、2つめ以降の呼び出しの第2引数を負にすればいい。
第2引数が負の場合は、呼び出し回数のカウントは変化せず、現在の値が返される。
なお、countが「1」の場合は呼び出し回数が0にリセットされ、「0」の場合はカウントを増やした上で通算の呼び出し回数が返され、「-1」の場合はカウントを増やさずに呼び出し回数が返される。
if(1=MG_Counter("",3)){ ;3の倍数+1回目の呼び出し }else if(2=MG_Counter("",-3)){ ;3の倍数+2回目の呼び出し }else{ ;3の倍数回目の呼び出し }
#Includeで他のスクリプトに組み込む場合は、組込先スクリプトと同じフォルダに
全てのファイル・フォルダを置く必要がある。
また、MouseGesture.ahkの初期処理が実行されるように、#Includeの行を起動時に通過する位置に書くか、起動時に実行される箇所で「Gosub,MG_Init」を実行すること。
なお、設定画面の「トレイメニューをサブメニュー化」にチェックを入れて、「MG_MenuParent」変数にメニュー名を格納してからMouseGesture.ahkの初期処理を実行すると、指定したメニュー内にMouseGesture.ahkのサブメニューが追加される。
メニューコマンドに割り当てられているサブルーチンは、それぞれ以下のような名前になっている。
ホットキーからGoSubで呼び出すなどすれば、よく使う機能を素早く実行させられる。
条件定義のカスタム条件式や、動作割り当てのスクリプトには、関数やサブルーチンは記述できない。
条件定義で複雑な判定処理を行いたい場合や、動作としてポップアップメニューの表示やタイマー割り当てなどを使用したい場合は、スクリプトの別の場所に記述する事になる。
このようなスクリプトを記述するために、「拡張スクリプト」が用意されている。
タスクトレイメニューの「拡張スクリプト編集」を実行すれば、テキストエディタでスクリプト(MG_User.ahk)が開かれる。
「初期化処理」の中には、ポップアップメニューの生成など、スクリプト起動時に実行させたい処理を記述する。
「サブルーチン定義」には、関数やその他のサブルーチンを記述する。
他のスクリプトを#includeで組み込みたい場合は、スクリプトの使用に応じて、適切な方に記述する。
初期化処理とサブルーチン定義の両方があるスクリプトは、MG_User.ahkのようにサブルーチン定義部分をGotoで飛び越すようにして、初期化処理部分に組み込む必要がある。
通常、「ナビ表示」を有効にしていると、入力中のジェスチャ文字列が表示されるが、あらかじめ設定したテキストを表示する事も出来る。
操作割り当てなどの覚え書きを表示するのに使用する。
「RB_」の状態になったときに表示されるテキストを設定するには、MG_User.ahkに以下のように記述する。
なお、「矢印ナビ」はOFFにしておく必要がある。
MG_Tooltip_RB_= ( ああああああ ↑ いいい← →ううう ↓ えええええええ )
条件に応じて表示されるテキストを変えたい場合には、ジェスチャの動作割り当てに以下のように記述する。
これは「MG_CommandLine()」などの情報を表示するのにも利用できる。
ジェスチャの認識が終了するとツールチップは消えるので、「RB_」などボタンを押している間に発動するジェスチャに割り当てる必要がある。
MG_Tooltip= ( ああああああ ↑ いいい← →ううう ↓ えええええええ ) MG_Wait()