VB.NETフォームを移動できないようにする

スポンサーリンク

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

サンプルコード

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

VB.NET 全般
' WndProc メソッドをオーバーライドする
Protected Overrides Sub WndProc(ByRef m As Message)
    Const WM_SYSCOMMAND As Integer = &H0112
    Const SC_MOVE       As Integer = &HF010
    Const SC_MASK       As Integer = &HFFF0

    ' フォームの移動を捕捉したら以降の制御をカットする
    If (m.Msg = WM_SYSCOMMAND) AndAlso ((m.WParam.ToInt32() And SC_MASK) = SC_MOVE) Then
        Return
    End If

    ' 基本クラスのメソッドを実行する
    MyBase.WndProc(m)
End Sub

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

VB.NET 全般
Option Strict On

' 以下の名前空間をインポートする
Imports System.Windows.Forms
Imports System.ComponentModel

Public Class Form1 : Inherits System.Windows.Forms.Form

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

    Private _Moveable As Boolean = True

    ''' ------------------------------------------------------------------------------
    ''' <summary>
    '''     フォームが移動することが可能かどうかを示す値を取得または設定します。
    ''' </summary>
    ''' ------------------------------------------------------------------------------
    <Category    ("配置 "), _
     Description ("フォームが移動することが可能かどうかを判断します。"), _
     DefaultValue(True)> _
    Public Property Moveable() As Boolean
        Get
            Return Me._Moveable
        End Get

        Set
            Me._Moveable = Value
        End Set
    End Property

    Protected Overrides Sub WndProc(ByRef m As Message)
        If Me.Moveable = False Then
            Const WM_SYSCOMMAND As Integer = &H0112
            Const SC_MOVE       As Integer = &HF010
            Const SC_MASK       As Integer = &HFFF0

            ' フォームの移動を捕捉したら以降の制御をカットする
            If m.Msg = WM_SYSCOMMAND AndAlso (m.WParam.ToInt32() And SC_MASK) = SC_MOVE Then
                Return
            End If
        End If

        ' 基本クラスのメソッドを実行する
        MyBase.WndProc(m)
    End Sub

End Class

関連するリファレンス

準備中です。

スポンサーリンク