マウス操作をグローバルフックする
C#でのグローバルフックですが、すでに多くの情報がネット上にありますし、他と差別化できるような情報は持っていませんごめんなさい、というのが本音です。
何で書いたかというと、テスト自動化においての肝となる「AutomationElement」について触れる前に、グローバルフックの話をしておいた方が分かりやすのでは、と思ったからです。
ちょっと脱線しますが、自動化というと主に2つのやり方があるかと思います。
1.スクリプトを実行する
2.ユーザ操作を再現する
1は「スクリプト」を書く必要があるので利用者への敷居は高くなります。
2は「ウィンドウズ座標の(x, y)位置でマウス右クリックして3秒後にEnterキー押して、、、」みたいな、ユーザ操作そのまま記録・再生だと、結果の再現率が低くなりがちです。
私もテストアプリを作成しながら、この点はかなり考えさせられました。
最初は何にも考えずに「操作の記録・再生」でプロトタイプを作ってみたのですが『「マウスダウン・アップ」と「クリック」』『「クリック」と「ダブルクリック』等の曖昧さを回避するために、各操作ごとに判定の時間を外部ファイルに持たせて、、とか色々やった結果、「操作の記録・再生」は、いったん諦めました。
じゃあ、スクリプトを丸々書かせるだと「自動化のために時間をたくさん使う」という自動化の意義、みたいなところが弱くなってしまう。これも避けたい。
今のところは「ユーザ操作の再現」ではなく「ユーザ操作の対象と操作をデータとして記録」し「静的なスクリプトでデータを解釈してユーザ操作を疑似再現」という形式にしています。
だいぶ脱線が長くなりましたが、この「ユーザ操作の対象と操作をデータとして記録」というときにグローバルフックを利用しております。
マウス操作のグローバルフックのサンプルコードをGitHubにアップしました。
https://github.com/hatarabo/hook-mouse
VisualStudioでビルド実行すると、こんな画面が表示されます。
開始を押すと Corsor Locaiton に カーソルのデスクトップ座標位置が表示されます。
適当なアプリ画面上でマウス左ボタンを押すと、アプリのタイトルと画面サイズが表示されます。以下は電卓アプリ上でマウス左ボタンを押した結果です。
これで、カーソル位置上にあるアプリケーションの識別ができました。
次回以降、グローバルフックが使えるという前提でAutomationElementに触れたいと思います。