C# - Vágólapon lévő állományok neveinek kiolvasása

forráskód letöltése
Amikor a Windows Intézőben néhány állományt a vágólapra másolunk, akkor lehetőségünk van arra, hogy ezeknek az állományoknak a neveit, elérési útjait saját alkalmazásunkból kiolvassuk és tetszőleges módon felhasználjuk.
Mellékelt példában erre keressük a megoldást.
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();
      }
    }