' Trapping double-clicks in a listview ' By Brent D. Thorn, 12/2007 ' PUBLIC DOMAIN 'Define a few structs Struct LVITEM, _ mask As ULong, _ iItem As Long, _ iSubItem As Long, _ state As ULong, _ stateMask As ULong, _ pszText As Ptr, _ cchTextMax As Long, _ iImage As Long, _ lParam As Long, _ iIndent As Long Struct NMHDR, _ hwndFrom As ULong, _ idFrom As ULong, _ code As Long Struct NMITEMACTIVATE, _ hdr.hwndFrom As ULong, _ hdr.idFrom As ULong, _ hdr.code As Long, _ iItem As Long, _ iSubItem As Long, _ uNewState As ULong, _ uOldState As ULong, _ uChanged As ULong, _ ptAction.x As Long, _ ptAction.y As Long, _ lParam As Long, _ uKeyFlags As ULong Open "WMLiberty" For DLL As #wmlib Open "Listview NM_DBLCLK Demo" For Window As #1 #1 "TrapClose Quit" 'Get instance handle CallDLL #kernel32, "GetModuleHandleA", _ _NULL As Long, _ hInst As Long 'Create listview control hLV = CreateWindowEx(_WS_EX_CLIENTEDGE, "SysListview32", "", _ _WS_CHILD Or _WS_VISIBLE Or 3, _ 5, 5, 300, 300, _ HWnd(#1), 0, hInst, 0) 'Add a few items to play with For i = 0 To 4 Call ListView.InsertItem hLV, i, "Double-click me" Next 'Set up "notify" event trapping Callback lpfn, OnNotify( ULong, ULong, ULong, ULong ), Long Call SetWMHandler HWnd(#1), _WM_NOTIFY, lpfn, -1 Call DoEvents Sub DoEvents [Loop] Scan CallDLL #kernel32, "Sleep", 50 As Long, r As Void GoTo [Loop] End Sub Sub Quit Me$ Close #Me$ Close #wmlib End End Sub 'Callback function to handle WM_NOTIFY messages Function OnNotify( hWnd, uMsg, wParam, lParam ) NMHDR.struct = lParam Select Case NMHDR.code.struct Case -3 'NM_DBLCLK NMITEMACTIVATE.struct = lParam iItem = NMITEMACTIVATE.iItem.struct If iItem < 0 Then Print "Double-clicked listview background" Else 'For some reason, placing a NOTICE here causes problems. Print "Double-clicked item #"; iItem End If End Select End Function '*** Wrapper Functions *** Function CreateWindowEx( dwExStyle, ClassName$, lpWindowName$, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam ) CallDLL #user32, "CreateWindowExA", _ dwExStyle As ULong, _ ClassName$ As Ptr, _ lpWindowName$ As Ptr, _ dwStyle As ULong, _ x As Long, _ y As Long, _ nWidth As Long, _ nHeight As Long, _ hWndParent As ULong, _ hMenu As ULong, _ hInstance As ULong, _ lpParam As ULong, _ CreateWindowEx As ULong End Function Sub ListView.InsertItem hWnd, iItem, Text$ LVITEM.mask.struct = 1 'LVIF_TEXT LVITEM.iItem.struct = iItem LVITEM.iSubItem.struct = 0 LVITEM.pszText.struct = Text$ CallDLL #user32, "SendMessageA", _ hWnd As long, _ 4103 As long, _ 'LVM_INSERTITEM 0 As long, _ LVITEM As struct, _ r As long End Sub Sub SetWMHandler hWnd, uMsg, lpfnCB, lSuccess CallDLL #wmlib, "SetWMHandler", _ hWnd As ULong, _ uMsg As ULong, _ lpfnCB As ULong, _ lSuccess As Long, _ r As Long End Sub