75111


たとえば以下のコードを追加しただけのフォームの時、タイトルバー上にマウスが移動すると  
フォームは消えてしまいますが、消えないようにしたいのです。  
また、ほかにタイトルバー上でのイベントを取得する方法など教えていただけると助かります。  
よろしくお願いいたします。

[code]

    private void Form1_MouseEnter(object sender, EventArgs e)
    {
      this.Visible = true;
    }
    
    private void Form1_MouseLeave(object sender, EventArgs e)
    {
      this.Visible = false;
    }
    
[/code]


CC BY-SA 4.0
2021-04-05T21:26:55.960
75109
2021-04-06T00:01:20.257
2021-04-05T22:47:25.330
3060
42735
question
c# winforms event
C# Form でタイトルバーのマウスイベントを取得したい


メインの回答の前に：

マウスの移動でフォーム自身の表示/非表示を制御するのは、筋が悪い感じです。  
いったんフォームを非表示にしたら、それ以後のイベントを受け取る対象が(タスクバーのアイコンくらい？しか)無いのでは？

その処理の目的が何かは分かりませんが、[XY問題](https://ja.meta.stackoverflow.com/q/2701/26370)のような気がします。

* * *

回答としては：

この辺の記事を参考に、FormのWndProcをオーバーライドして、WM_NCxxxxといったメッセージの処理を組み込めば出来るでしょう。  
`NC`はnonclient area(非クライアント領域)の略号でタイトルバー、メニューバー、ウィンドウフレームなどのことです。

2つ目の掲示板記事のように、単純に1つのメッセージ通知だけに閉じた処理では済まない場合もあるようですが。

[WindowsフォームでWindowsメッセージを直接処理するには？](https://www.atmarkit.co.jp/ait/articles/0606/30/news131.html)

>
> だが、すべてのWindowsメッセージがWndProcメソッドでイベントに置き換えられるわけではない。このため少し特殊な処理をフォームに実装したい場合などでは、プログラムで直接Windowsメッセージを取得し処理しなければならないこともある。

> **WndProcメソッドのオーバーライド**  
>
> フォームに送られてくるWindowsメッセージを直接プログラムで処理したい場合には、Formクラス（System.Windows.Forms名前空間）のWndProcメソッドを自分のフォームでオーバーライドすればよい。

[フォームタイトルバーのマウスイベント取得について](http://bbs.wankuma.com/index.cgi?mode=al2&namber=82488&KLOG=141)

[How to handle Form caption right
click](https://stackoverflow.com/q/1948014/9014308)  
[Capture mouse touch the title bar of win
form](https://stackoverflow.com/q/15324482/9014308)

[Mouse Input Notifications](https://docs.microsoft.com/en-
us/windows/win32/inputdev/mouse-input-notifications)  
[非クライアント領域](https://docs.microsoft.com/ja-jp/windows/win32/gdi/nonclient-area)

> The system sends a WM_NCPAINT message to the window whenever a part of the
> nonclient area of the window, such as the title bar, menu bar, or window
> frame, must be updated.

> ウィンドウの非クライアント領域 (タイトルバー、メニューバー、ウィンドウフレームなど) の一部が更新されるたびに、システムからウィンドウに WM _
> NCPAINT メッセージが送信されます。

* * *

あるいはこちらの記事の私の回答のようにもう一段低レベルのSetWindowsHookExのLowLevelMouseProc(WH_MOUSE_LL)登録でマウスイベント処理を行うという手も出来ないことでは無いでしょう。  
[C#
コントロールが重なっているフォームでマウスのEnterとLeaveを正しく拾いたい](https://ja.stackoverflow.com/q/63549/26370)


CC BY-SA 4.0
2021-04-05T23:38:43.163
75111
2021-04-06T00:01:20.257
2021-04-06T00:01:20.257
26370
26370
75109
answer