Prevent dragging elements in a ListView control

Prevent dragging elements in a ListView control

The ListView control doesn’t expose any property that lets you disable the dragging of its elements. To do so, you must trap the WM_NOTIFY message that the ListView control sends its parent form when the drag operation begins, and “eat” it. Using the MSGHOOK.DLL subclassing library it’s easy to accomplish it:

' REQUIRES THE MSGHOOK.DLL LIBRARYConst WM_NOTIFY = &H4EConst LVN_FIRST = -100&Const LVN_BEGINDRAG = (LVN_FIRST - 9)Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As _    Any, source As Any, ByVal bytes As Long)Private Type NMHDR   hwndFrom As Long   idFrom As Long   code As LongEnd TypeDim WithEvents FormHook As MsgHookPrivate Sub Form_Load()    ' start subclassing the current form    Set FormHook = New MsgHook    FormHook.StartSubclass Me    ' fill the ListView1 control with data    ' ... (omitted) ...End Sub' this event fires when the form is sent a messagePrivate Sub FormHook_BeforeMessage(uMsg As Long, wParam As Long, lParam As Long, _    retValue As Long, Cancel As Boolean)        ' the ListView might be notifying something to its parent form    If uMsg = WM_NOTIFY Then        ' copy the MNHDR structure pointed        ' to by lParam to a local UDT        Dim nmh As NMHDR        CopyMemory nmh, ByVal lParam, Len(nmh)        ' check whether the notification is from the ListView1 control        ' and whether it's the beginning of a drag operation        If nmh.hwndFrom = ListView1.hWnd And nmh.code = LVN_BEGINDRAG Then            ' yes, cancel this operation            retValue = 1            Cancel = True        End If    End IfEnd Sub


Share the Post: