気まま研究所ブログ

ITとバイク、思ったことをてきとーに書きます。

ウィンドウ透過と透過部分のイベント処理

TwitterをしているとTLでふと見かけたので備忘録。

Windownsフォームアプリケーションを作る際、背景を透過したくなることが稀にあります。
単純にTransparentを指定してもサポートされてない旨のメッセージとともに失敗します。

その場合、TransparencyKeyに背景色を指定すれば透過されます。

this.TransparencyKey = Color.FromKnownColor(KnownColor.Control);

このことは結構な記事で言われてることなんですが、その場合に透過部分のマウスイベントが取得できません。
その部分がすっぽり空いてるので当たり前かもしれませんが、必要な時もあります。
この場合は常にマウスカーソルを追って条件分岐でフォームの中に入った時に特定の処理を走らせることで期待の動作をさせます。

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);
    int mouseX = Cursor.Position.X;
    int mouseY = Cursor.Position.Y;
    int width = this.Size.Width;
    int height = this.Size.Height;
    int formX = this.Location.X;
    int formY = this.Location.Y;

    if (mouseX >= formX && mouseX <= (formX + width) && mouseY >= formY && mouseY <= (formY + height))
    {
        Console.WriteLine("領域内です");
    }
}

上のコードの参考例です。
How to get mouse over event, when form is transparent. · GitHub

もっといい方法がありましたらコメントしていただけるとありがたいです。