Ehhez a megoldáshoz néhány Windows függvény híváson keresztül vezet az út. Egész pontosan a DragQueryFile függvény használatára lesz szükségünk, melyhez fel kell használnunk néhány másik függvényt is.
Nézzük sorban: első lépésként megnyitjuk a vágólapot az alkalmazásunk számára az OpenClipboard függvény hívásával. Ennek paraméterként az adott Form-unk azonosítóját adjuk át.
private void button1_Click(object sender, System.EventArgs e)
{
if (Win32.OpenClipboard(Handle))
{
Lekérdezzük a vágólapon lévő adatokat a GetClipboardData függvénnyel. Paraméterként egy konstanst kell megadnunk, mely azt mondja meg a függvénnyel, hogy milyen jellegű adatokra van szükségünk. Számunkra most a CF_HDROP konstans szükséges, mely az állományok mozgatásával, másolásával kapcsolatos. Visszatérési értékként kapunk egy azonosítót, mely ha nem nulla, akkor van értékes adat a vágólapon.
uint handle = Win32.GetClipboardData(Win32.CF_HDROP);
if (handle!=0)
{
Ekkor már csak le kell kérdeznünk, hogy mik is ezek. Ez a művelet két lépésből áll: az elsőben lekérdezzük, hogy hány állományról van szó, melynek adata a vágólapra került. Ehhez szintén a DragQueryFile függvényt kell használnunk, melynek ha a második paraméterében 0xFFFFFFFF értéket adunk meg, akkor visszatérési értékként azt a számot kapjuk, hogy hány állomány került a vágólapra.
StringBuilder filename = new StringBuilder(260);
uint count=Win32.DragQueryFile(handle, 0xFFFFFFFF, filename, 260);
Meghatározva ezt a számot már tudunk egy ciklust írni, mely végigmegy az összes állományon és lekérdezi annak nevét, az elérési útjával együtt. Itt a DragQueryFile-nál a második paraméterben az adott állomány sorszámát kell megadnunk, majd a harmadik paraméterbe kapjuk vissza az állománynevet, melyet tetszés szerint felhasználhatunk.
for (uint i=0; i<count; i++)
{
if (Win32.DragQueryFile(handle, i, filename, 260)>0)
{
listBox1.Items.Add(filename);
}
}
}
A lekérdezés végén a CloseClipboard függvény hívásával zárjuk a vágólapot.
Win32.CloseClipboard();
}
}