
Declarar :
Para 16 bits :
Declare Function SendMessage Lib "User" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, lParam As Any) As Long
Declare Sub ReleaseCapture Lib "User" ()
Para 32 bits :
Declare Sub ReleaseCapture Lib "User32" Alias "ReleaseCapture" ()
Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Para ambas :
Global Const WM_SYSCOMMAND = &H112
Global Const SC_MOVE = &HF012
En el evento Form_MouseDown escribiremos el código :
Dim res As Long
ReleaseCapture
res = SendMessage(Me.hWnd, WM_SYSCOMMAND, SC_MOVE, 0&)

El mensaje WM_NCLBUTTON es generado por Windows cuando el usuario hace click con el botón derecho del ratón sobre la barra de título de una ventana. Windows emplea este mensaje para saber cuándo la ventana debe moverse por las siguientes acciones del usuario.
Si la ventana no tiene barra de título este mensaje no se genera, pero es útil para mover una ventana que no tiene barra de título.
Una ventana o un formulario de Visual Basic 32 bits no tiene barra de título si :
Visual Basic 5.0
Caption = ""
ControlBox = False
Visual Basic 4.0
Caption = ""
ControlBox = False
MaxButton = False
MinButton = False
El código que viene a continuación muestra cómo mover un formulario sin barra de título pinchando y arrastrándolo desde cualquier parte del formulario.
El código situado en el evento MouseMove del formulario puede ponerse en otro evento si se quiere. Por ejemplo en el evento MouseDown de una etiqueta para permitir mover el formulario pinchando en la misma.
Declaramos en el formulario :
Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub ReleaseCapture Lib "User32" ()
Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2
Y en el evento MouseMove del formulario :
Dim lngReturnValue As Long
If Button = 1 Then 'si es el botón izquierdo
Call ReleaseCapture
lngReturnValue = SendMessage(Me.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
End If
NOTA
Este mismo procedimiento nos sirve para mover cualquier control que tenga la propiedad hWnd, sustituyendo Me.hWnd por Control.hWnd en la función SendMenssage.
Si el control que deseamos mover no tiene esta propiedad siempre podremos crear un UserControl que posea esta propiedad y contenga el control que deseamos mover.

