マウス操作をグローバルフックする

C#でのグローバルフックですが、すでに多くの情報がネット上にありますし、他と差別化できるような情報は持っていませんごめんなさい、というのが本音です。

 

何で書いたかというと、テスト自動化においての肝となる「AutomationElement」について触れる前に、グローバルフックの話をしておいた方が分かりやすのでは、と思ったからです。

 

ちょっと脱線しますが、自動化というと主に2つのやり方があるかと思います。

 1.スクリプトを実行する

 2.ユーザ操作を再現する

 

1は「スクリプト」を書く必要があるので利用者への敷居は高くなります。

2は「ウィンドウズ座標の(x, y)位置でマウス右クリックして3秒後にEnterキー押して、、、」みたいな、ユーザ操作そのまま記録・再生だと、結果の再現率が低くなりがちです。

 

私もテストアプリを作成しながら、この点はかなり考えさせられました。

最初は何にも考えずに「操作の記録・再生」でプロトタイプを作ってみたのですが『「マウスダウン・アップ」と「クリック」』『「クリック」と「ダブルクリック』等の曖昧さを回避するために、各操作ごとに判定の時間を外部ファイルに持たせて、、とか色々やった結果、「操作の記録・再生」は、いったん諦めました。

じゃあ、スクリプトを丸々書かせるだと「自動化のために時間をたくさん使う」という自動化の意義、みたいなところが弱くなってしまう。これも避けたい。

 

今のところは「ユーザ操作の再現」ではなく「ユーザ操作の対象と操作をデータとして記録」し「静的なスクリプトでデータを解釈してユーザ操作を疑似再現」という形式にしています。

 

だいぶ脱線が長くなりましたが、この「ユーザ操作の対象と操作をデータとして記録」というときにグローバルフックを利用しております。

 

マウス操作のグローバルフックのサンプルコードをGitHubにアップしました。

 

https://github.com/hatarabo/hook-mouse

 

VisualStudioでビルド実行すると、こんな画面が表示されます。

 

f:id:hatarabo:20200607165538p:plain

 

開始を押すと Corsor Locaiton に カーソルのデスクトップ座標位置が表示されます。

適当なアプリ画面上でマウス左ボタンを押すと、アプリのタイトルと画面サイズが表示されます。以下は電卓アプリ上でマウス左ボタンを押した結果です。

 

f:id:hatarabo:20200607165948p:plain

 

これで、カーソル位置上にあるアプリケーションの識別ができました。

次回以降、グローバルフックが使えるという前提でAutomationElementに触れたいと思います。