Jump to content

Need help with drag and drop onto mutiple form targets

Recommended Posts



I found a good drag and drop example here: https://www.autoitscript.com/forum/topic/28062-drop-multiple-files-on-any-control/
I have been searching but not finding a way to do a variant of this example.

I want to have a form with 2 or more list box controls on the form that have $GUI_DROPACCEPTED enabled. I then want to be able to drop separate groups of files on each list box  so that I have 2 separate list of dropped items that I can act upon independently rather than this example which only has one target.

I have modified the example to add the 2nd list box but I am not sure how to determine which control hwnd got the drop event and then only add the files to that list box. In the current example both controls add the files to $hList1


Apparently $hWnd  in WM_DROPFILES_FUNC() is not the control that triggers the event as I compared its value to the hwnd of each control.

hwnd from $hList1 = 0x002F0BB8
hwnd from $hList2 = 0x003C06E0
hwnd from WM_DROPFILES_FUNC = 0x002F1180
hwnd from WM_DROPFILES_FUNC = 0x002F1180


Any ideas?


;Example from https://www.autoitscript.com/forum/topic/28062-drop-multiple-files-on-any-control/

#include <GUIConstants.au3>

;~ Global $WM_DROPFILES = 0x233
Global $gaDropFiles[1], $str = ""

### Koda GUI section start ###
;~ $hGUI = GUICreate("Test", 400, 200, 219, 178, -1, BitOR($WS_EX_ACCEPTFILES, $WS_EX_TOPMOST))
;~ $hList = GUICtrlCreateList("", 5, 5, 390, 190)
;~ GUICtrlSetState (-1, $GUI_DROPACCEPTED)

Global $hGUI = GUICreate("Test", 573, 419, 219, 178, -1, BitOR($WS_EX_ACCEPTFILES, $WS_EX_TOPMOST, $WS_EX_WINDOWEDGE))
Global $hList1 = GUICtrlCreateList("", 5, 5, 390, 188)
GUICtrlSetData(-1, "List1")

Global $hList2 = GUICtrlCreateList("", 42, 205, 390, 188)
GUICtrlSetData(-1, "List2")

ConsoleWrite("hwnd from $hList1 = " & GUICtrlGetHandle($hList1) & @CRLF)
ConsoleWrite("hwnd from $hList2 = " & GUICtrlGetHandle($hList2) & @CRLF)

### Koda GUI section end   ###


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            $str = ""
            For $i = 0 To UBound($gaDropFiles) - 1
                $str &= "|" & $gaDropFiles[$i]
            GUICtrlSetData($hList1, $str)

Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)

    ConsoleWrite("hwnd from WM_DROPFILES_FUNC = " & $hGUI & @CRLF)

    Local $nSize, $pFileName
    Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
        $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
        $nSize = $nSize[0] + 1
        $pFileName = DllStructCreate("char[" & $nSize & "]")
        DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
        ReDim $gaDropFiles[$i + 1]
        $gaDropFiles[$i] = DllStructGetData($pFileName, 1)
        $pFileName = 0



Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Create New...