フォーム上のどこでもウィンドウの移動ができるようにするには

フォーム上のどこでもウィンドウの移動ができるようにしてみます。
キーワードは「WM_NCHITTESTメッセージ」です。
Windowsはマウスカーソルがウィンドウ上にあるとき、「その位置に何があるのか」を
マウスカーソルが移動するたびに調べます。
そのメッセージがWM_NCHITTESTです。
ですから、そのメッセージの戻り値をちょっとごまかしてWindowsに
「キャプションバー(タイトルバー)の上だ」と教えてあげれば、Windowsは勘違いしてくれます。

実行時の様子
'----------------------------- Form1 -----------------------------
Private Sub Form_Load()
    'ウィンドウプロシージャのアドレスを変更する
    hOldWndProc = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf WndProc)
End Sub

Private Sub Form_Unload(Cancel As Integer) '変更したウィンドウプロシージャを元に戻す Call SetWindowLong(Me.hWnd, GWL_WNDPROC, hOldWndProc) End Sub
'----------------------------- Module1 -----------------------------
'ウィンドウに関するデータを取得
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
    (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    'nIndexの定数
    Public Const GWL_WNDPROC = (-4)                 'ウィンドウ関数のアドレス
'Windowsメッセージを指定のウィンドウプロシージャに渡す
Public Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" _
    (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal msg As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long
Public hOldWndProc As Long                          '変更する前のウィンドウ関数のアドレスを保存する
'キーボードのキーが押されているかどうか調べる
Public Declare Function GetAsyncKeyState Lib "user32.dll" _
    (ByVal vKey As Long) As Integer
Public Const HTCAPTION = 2                      'キャプションバーの上

Public Function WndProc(ByVal hWnd As Long, ByVal msg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long If msg = WM_NCHITTEST Then 'マウスの左ボタンを押していたらドラッグできるようにする If GetAsyncKeyState(vbKeyLButton) < 0 Then Form1.Label3.Caption = "移動中" WndProc = HTCAPTION Exit Function Else Form1.Label3.Caption = "" End If End If '通常のメッセージを処理 WndProc = CallWindowProc(hOldWndProc, hWnd, msg, wParam, lParam) End Function
ダウンロード