C#フォームを移動できないようにする

スポンサーリンク

フォームを移動できないようにするには、WndProc メソッドをオーバーライドし SC_MOVE を捕捉します。Windows API を使用しても良いのであれば DeleteMenu 関数から SC_MOVE を削除する方法でも可能です。この方法であれば、コントロール ボックスの「移動」を非活性化できます。今回は前者の方法を紹介します。

サンプルコード

以下にサンプルコードを示します。

C# 全般
// WndProc メソッドをオーバーライドする
protected override void WndProc(ref Message m) {
    const int WM_SYSCOMMAND = 0x0112;
    const int SC_MOVE       = 0xF010;
    const int SC_MASK       = 0xFFF0;

    // フォームの移動を捕捉したら以降の制御をカットする
    if ((m.Msg == WM_SYSCOMMAND) && ((m.WParam.ToInt32() & SC_MASK) == SC_MOVE)) {
        return;
    }

    // 基本クラスのメソッドを実行する
    base.WndProc(ref m);
}

VB6 に倣って移動できるかどうかを示す Moveable プロパティを実装したい場合は以下のようになります。

C# 全般
// 以下の名前空間をインポートする
using System.Windows.Forms;
using System.ComponentModel;

public class MyForm : System.Windows.Forms.Form {

   Windows フォーム デザイナで生成されたコード 

    private bool _Moveable = true;

    /// ------------------------------------------------------------------------------
    /// <summary>
    ///     フォームが移動することが可能かどうかを示す値を取得または設定します。
    /// </summary>
    /// ------------------------------------------------------------------------------
    [Category    ("配置")]
    [Description ("フォームが移動することが可能かどうかを判断します。")]
    [DefaultValue(true)]
    public bool Moveable {
        get {
            return this._Moveable;
        }

        set {
            this.Moveable = value;
        }
    }

    // WndProc メソッドをオーバーライドする
    protected override void WndProc(ref Message m) {
        if (! this.Moveable) {
            const int WM_SYSCOMMAND = 0x0112;
            const int SC_MOVE       = 0xF010;
            const int SC_MASK       = 0xFFF0;

            // フォームの移動を捕捉したら以降の制御をカットする
            if ((m.Msg == WM_SYSCOMMAND) && ((m.WParam.ToInt32() & SC_MASK) == SC_MOVE)) {
                return;
            }
        }

        // 基本クラスのメソッドを実行する
        base.WndProc(ref m);
    }

}

関連するリファレンス

準備中です。

スポンサーリンク