[C#] BorderlessのWindows Formをドラッグする方法(Panel利用)


はじめに

前回は、フラットなWindows Formの作成(Borderess)を投稿しました、

しかし、前回のままだとWindowを移動することができません。

今回は、Header部分(パネル部分)を押下した状態で移動する方法の備忘録です。

前回の投稿は下記参照

[C#] Windows Formにてタイトルバーなしのフラットなおしゃれフォームを作成する方法

IMessegeFilterを利用する

では早速ごりごり書いていきたいと思います。

ドラッグ対象の「Panel」に名前を付けます(ここでは「pnl_header」としました。

public pertial class Form1 : Form, IMessageFilter
{
    public const int WM_NCLBUTTONDOWN = 0xA1;
    public const int HT_CAPTION = 0x2;
    public const int WM_LBUTTONDOWN = 0x0201;

    private HashSet<Control> controlsToMove = new HashSet<Control>();
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern bool ReleaseCapture();

    public Form1()
    {
        Application.AddMessageFilter(this);
        controlsToMove.Add(this.pnl_Header);
    }

    public bool PreFilterMessage(ref Message m) {
        if (m.Msg == WM_LBUTTONDOWN && controlsToMove.Contains(Control.FromHandle(m.HWod))) 
        {
            ReleaseCapture();
            SendMessage(this.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
            return true
        }
        return false;
    }
}

上記で、移動させることができました。

最後に

移動するところまでの備忘録を投稿しました。

是非、試してみてください。