C# コントロールが重なっているフォームでマウスのEnterとLeaveを正しく拾いたい


お世話になります。

C#.Net4.5で、Windowsフォームアプリを作っているのですが、フォームにマウスが入った(Enter)、フォームから  
マウスが出た(Leave)を拾って処理をさせようとしています。

[![画像の説明をここに入力](https://i.stack.imgur.com/wZ1ON.jpg)](https://i.stack.imgur.com/wZ1ON.jpg)

ただし、上記図のように赤い部分のような別のコントロールが乗っている場合、この赤い部分では  
Form側のマウスイベントは発生しません。

赤いコントロールにOnMouseEnterやonMouseLeaveなどをさせてもみたのですが、その場合、  
画像の赤い部分からグレーの部分に移動しただけでもマウスが離れたと処理してしまい、  
うまくいきません。逆もまた然りです。

フォームの上にどんなコントロールが乗っていようとも、フォームのMouseEnterとMouseLeaveが  
発生するようにするには、どうしたらよいでしょうか。

よろしくお願いいたします。




回答ではありませんが、やや気になるので発言します。  
もちろんマウスメッセージをフックしたり、キャプチャーすれば実装可能な処理ではありますが、そういった設計をすべきではないというお話です。

可能であれば「隠れている親ウィンドウはマウスの侵入と離脱を検知して何をしようとしているのか」を説明すると、別の簡単な解決方法が提示されるかもしれません。

さて、その様な設計や実装をしない方が良い理由はWindowsはそのように設計されていないからです。

・Windowsは見えないウィンドウにマウスメッセージを送付しない様に設計されています(一般的な他のOSも同じです)。

というわけです。  
Windowsではマウスカーソル直下の画面上の重なり順位(Zオーダー)が最も表面にあるウィンドウのみにマウスメッセージが送付されます。  
これは、「マウス操作を処理する権限があるのは見えるウィンドウだけである」という方針を示唆します。  
つまり、その他のウィンドウは何もするなということですね。  
無理やりやるとバグに悩んだり、他のアプリケーションの迷惑になったりする可能性が高いと予測できます。

従って、子ウィンドウのマウスの状態を監視する必要がある場合には、子にその状態を報告させるのが通常の実装となります。  
例えば「赤コントロールからオーナー様に報告です。マウスが侵入しました」という感じです。

・以下は蛇足です。

Windowsの初めの頃にはWM_MOUSEMOVEはありましたが、WM_MOUSEHOVER、WM_MOUSELEAVEなどは有りませんでした。  
NT4.0(or
2000)の頃から利用できましたが、後のOSの変更でアプリ側からTrackMouseEvent()を実行してメッセージの発行を要請する手続きになりました。  
それまでは一般的にはマウスキャプチャーを使ってマウスの侵入と離脱を検知していたわけです。  
ちなみに、侵入を意味するWM_MOUSEENTERの様なメッセージはいまだにWindowsAPIには存在しません。  
アプリ上の内部的な状態から疑似的に作っているわけですね。

これらの状態が比較的重要視されないのは、それが「ユーザーアクションでない可能性のあるマウスメッセージ」であるからではないかとの個人的な考えを持っています。

