A megoldást egy Windows üzenet figyelése adja. Amikor a WM_DROPFILES üzenetet kapja az alkalmazásunk, akkor biztosak lehetünk abban, hogy valamely másik programról Drag and Drop érkezett.
Azonban ezt az üzenetet nem kapja meg bármely alkalmazás, hanem csak azok, melyek ezt kérik a Windows-tól. E kéréshez a DragAcceptFiles függvény hívása szükséges, melynek első paraméterében annak az ablaknak az azonosítóját (Handle) kell megadni, mely képes fogadni a WM_DROPFILES-t, amikor egy Drag and Drop érkezik. A második paraméterben arról rendelkezhetünk, hogy kérjük, illetve nem kérjük a WM_DROPFILES üzenetet.
Win32.DragAcceptFiles(Handle, True)
Most már csak azt kell megvalósítanunk, hogy figyelve legyen a WM_DROPFILES üzenet. Ehhez felülírjuk a WndProc függvényt.
Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = Win32.WM_DROPFILES Then
label1.Text = ""
Dim filename As New StringBuilder(260)
Ha a WM_DROPFILES üzenetet megkaptuk, akkor meg kell állapítanunk, hogy milyen állományok lettek Drag and Drop-al a programunkra húzva. Mivel a Windows Intézőben több állomány is kijelölhető és áthúzható, így elsőnek ezt a darabszámot állapítjuk meg. Ehhez a DragQueryFile függvényt kell úgy meghívnunk, hogy második paramétere 0xFFFFFFFF értéket kapjon. Ennek hatására a függvény visszatérési értéke az áthúzott objektumok számával lesz egyező.
Dim count As Integer = Win32.DragQueryFile(m.WParam, -1, filename, 260)
Most már indíthatunk egy ciklust, melyben végigmegyünk az összes állományon. Az egyes állományneveket szintén a DragQueryFile függvénnyel tudjuk lekérdezni, csak most a második paraméterben a kérdéses objektum sorszámát kell megadnunk. Az adott állománynév a harmadik paraméterben átadott StringBuilder-be kerül.
Dim i As Integer
For i = 0 To count - 1
If Win32.DragQueryFile(m.WParam, i, filename, 260) > 0 Then
label1.Text += filename.ToString + ControlChars.Lf.ToString
End If
Next i
m.Result = IntPtr.Zero
A műveletet lezárásához a DragFinish függvény hívása szükséges.
Win32.DragFinish(m.WParam)
Else
MyBase.WndProc(m)
End If