・2018//05/30 マウスカーソル位置判定の HitTest   *マウスカーソルの ウィンドウ位置確認 について。 プログラムをしていると マウスカーソルが 現在 何処に有るか が問題になって来る事が多々有ります。 位置としては スクリーンの 絶対座標だったり ターゲットウィンドウのどの部分に有るか等の相対座標です。 今回の HitTest 話は ターゲットウィンドウが 自分のウィンドウや 他のプログラムのウィンドウ等の どの位置に マウスカーソルが有るかと言う話です。位置としては 左上の アイコンや 右上の Close ボタンや タイトルバー上 等に マウスカーソルが有るかどうかの判定が必要な時です。 此までは 自分や 相手の ウィンドウの矩形座標を求めて マウスカーソルがそこからどれぐらい離れているか 各システムパラメーター値を 取得しながら測っていましたが 此だと 大体は合うのですが ボーダー付近は 不正確に なってしまうし 適切な システムパラメーター取得もそれなりに多くなってしまうし 決定的なのは ターゲットウィンドウの 様子が 解らないと 見当違いの所を設定して測っているかも知れません。 それで 統一して 自分でも 相手でも メッセージ WM_NCHITTEST を送って マウスカーソルが今 ウィンドウの どの部分に有るか返してもらう事にしました。 此の WM_NCHITTEST メッセージは マウスカーソルが NCR Area に有る時には MouseMove ぐらいの頻度で 各 Window Procedure を Call して 出現しています。その都度 DefWindowProc はそれなりの値を返しているようです。 マウス マウスカーソル位置が ( cx, cy ) で 位置を確認したいウィンドウハンドルが hWnd なら SendMessage( hWnd, WM_NCHITTEST, 0, cy * 0x10000 + cx ); で リターン値としては HTCAPTION:2 HTCLIENT:1 HTCLOSE:20 HTMENU:5 HTSYSMENU:3 等 色々返ってきますが 詳しくは 検索して下さい。 Windows のバージョンや マウスボタンの ON OFF で多少の違いは 出るのですが 自分で 推し量るよりも正確で コールも簡単です。もちろん DefWindowProc では結構な事をしている のでしょうが 何にしても 使用する方は 楽で正確ですから これからは 機会が有れば WM_NCHITTEST を使用していこうと思います。 ただし SendMessage( hWnd, WM_NCHITTEST も UAC の制限を受けますから コール側が通常権限で 位置リクエストをされる方が 管理者権限で走っていると リターン値は すぐに返りますが 常に 0 でまともな値は返してくれません。逆に言えば リターン値が 0 なら多分このウィンドウに対して 次の何かは出来ない判断にもなるかも知れません。 2018/05/30 SerchWin に マウスカーソルが オーバーしているウィンドウのどの位置に有るかを 表示する HitTest の 項目を新設しました。