ぺんちゃん日記

食と歴史と IT と。 Web の旅人ぺんじろうが好奇心赴くままに彷徨います 。

マウスクリックでマウスポインタの座標をクリップボードに取得してみる【AutoHotkey】。

f:id:yasushiito:20190403184928p:plain

事の始まり。

最近になって画像探索などの画面系のスクリプトもいじるようになってきています。
千年戦争アイギスのアシストプレイするスクリプトなどが典型なのですが、マウスポインターが特定の領域に入るなど座標を使って何かを監視する場合はスクリーン上の絶対座標あるいはアクティブウィンドウからの相対座標を範囲指定しなければなりません。
その座標をAutoHotkey付属の Windows SPY を使って参照しても良いのですが、いくつもの座標を覚えきることができない。
はい頭悪いです。
普通の人なら Ctrl + C でコピーしてしまえば良いだけなのですが、私は Windows 上のすべての操作をマウスのみで行なっているので 、コピペしようにもマウスポインターがスクリーンキーボード上に移動してしまっています(涙。
私にとってのベストウェイがマウスクリックした座標を保存する形です。
そこでちょっと面倒ですが、マウスクリックを監視してクリックした座標をクリップボードに保存するスクリプトを作ってみました。

構想を練る。

マウスクリックを検出して何らかのアクションを行う処理を作成するには少しだけ工夫が必要です。
キーボードの入力を感知して特定のキーの組み合わせを入力されたら処理が走る、いわゆるホットキーであるならば AutoHotkey の最も得意とするところです。
しかしホットキーはキーボードの入力を監視するものですから、マウスクリックのイベントを監視することができません。
多分。
となると、左クリックされたら座標を調べるようにするためにはタイマーイベントなどで一定間隔でマウスの押下状態を監視するしかありません。
ループ処理を回してマウスの左ボタンが押下されるまで回り続けるようにすれば、タイマーイベントは使わずにすみませ。
そちらの方が簡単に実装できるのですが、一つの座標を取得するだけで終わってしまっては何度もスクリプトを起動しなければならず面倒です。
かといって、 ダイアログを開いて調べたい座標の数を事前に入力するというのも スクリプトは煩雑になってしまいます。
好みにもよりますが、私はタイマーイベントで監視した方が楽です。
win + i ホットキーでクリックによる座標調査開始です。
もう一度押すと座標調査終了です。
その後はホットキーを入力するごとに開始と終了を繰り返します。

取得した座標ですが、クリップボードに入れることにします。
クリップボードには追加で放り込みます。
つまり前回コピーした内容の後ろに取得した座標が追加されます。
Win+i でスイッチを押した瞬間にクリップボードの内容をクリアするので、利用の際にはクリップボードの状態にご注意ください。
取得した座標をメッセージボックスで通知してくれます。
クリックしても全く反応がないと不安なので PC 側から何らかの応答があった方が良いかなと考えました。
メッセージボックスの OK ボタンをクリックするのが面倒ですし、そこをクリックすると座標を取得されてしまうので一定時間でメッセージボックスを消すようにしてあります。
長時間使うタイプのスクリプトではないので Win + Z でアプリケーション終了できるようにしてあります。
肝心の座標ですが、スクリーン上の絶対座標とアクティブウィンドウ左上からの相対座標の両方を調査できるようになっています。
左から x,y の順番で括弧内は相対座標です。
相対座標はマイナス、つまりウインドウの範囲を超えた座標まで とりうるのですが、このスクリプトの場合はクリックした瞬間に他のウィンドウがアクティブになってしまうためにアクティブウィンドウの枠を超えて相対座標を取得することはできません。

出来上がったスクリプトはこちら。

今回のポイントその1。

マウスの押下状態を検出するには GetKeyState を使います。
次のようにすれば変数statにマウス左ボタンの状態が返されます。

    GetKeyState, stat, LButton, "p"

myahk/mousepos.ahk at master · yasushiito/myahk


押下状態の時は D、 何もしていない場合はUとなります。

今回のポイントその2。

マウスポインタの座標を取得するにはMouseGetPosを使いますが、絶対座標と相対座標を切り替えるにはCoordModeを使います。
screenで絶対座標、Relativeで相対座標となります。

        CoordMode,Mouse,Screen
        MouseGetPos, mx, my
        ;相対座標を括弧内で指定する。
        CoordMode,Mouse,Relative
        MouseGetPos, rx, ry

myahk/mousepos.ahk at master · yasushiito/myahk


各関数の詳しい内容はこちら。
ahkwiki.net


ahkwiki.net


使ってみる。

スクリプトを実行させて OS に常駐します。
座標を調査したいウィンドウをあらかじめアクティブにしておきます。
Win + I します。
マウス座標のためにクリックを監視する旨のメッセージボックスが一定時間表示されますので消えるまで待ちます。
アクティブウィンドウの適当な場所をクリックすると座標がクリップボードに転送されてメッセージボックスで一定時間通知します。
クリックするたびに座標が取得されて、改行区切りでクリップボードに追加されます。
必要な座標を全て調査したら win +iして座標調査を終了します。
2箇所クリックした結果はこんな感じです。

451,704(276,234)。
520,659(345,189)。
183,938(8,468)。

私の場合はスクリーンキーボードでキー入力しているので終了するための Windows キー押下の座標まで取得してしまっています。
最後の1行は差し引いて上の二つをチョイスします。