質問: 困っていること -------- C#/WPFでデスクトップアプリを開発しています。 Windowsにて、マウスホバーされているウィンドウの情報を取得する方法を探しています。 Windows10より、非アクティブなウィンドウに対しマウスカーソルを乗せ、アクティブにすることなくホイールを使って画面をスクロールすることができるようになりました。 つまり、カーソルが非アクティブのウィンドウに乗った/ホイール操作をした瞬間に、何らかのウィンドウの情報を取得していると考えられます。 この仕組みを使って、自作のアプリケーションでも非アクティブなウィンドウの情報を取得したいと思っています。 最終的には、ウィンドウがアクティブ/非アクティブを問わず特定のアプリケーションのウィンドウにホバーしたら何らかの処理を行う、ということを実現したいと考えています。 どのような方法を取ればこれが実現できるのでしょうか。
回答: ウィンドウを作ると、メッセージを受け取ることができます。 例えば、自作ウィンドウの上にマウスが移動すると、WM_MOUSEMOVE メッセージが送られます。この時、WPF では MouseMove イベントが起こります。 WM_MOUSEMOVE はウィンドウが非アクティブでも送られるので、非アクティブウィンドウでもマウスの移動は捕まえることができます。 ホイールを回した時の WM_MOUSEWHEEL に関しても同じです。 つまり、質問者さんは根本的に誤解されています。マウスがウィンドウの情報を得ているのではなく、ウィンドウがマウスの情報を得ているのです。 自作アプリが作っていないウィンドウのメッセージを受け取るには、メッセージフックという手法を使います。自プロセスのメッセージをフックするのは比較的簡単で、他プロセスのメッセージをフック(マウスの場合はグローバルフックで OK)するには技術が必要です。まずは自プロセスのメッセージをフックするところから学習を進められたら良いと思います。 参考 C#にてマウスとキーボードを操りし者