C# - Drag and Drop alkalmazások között

forráskód letöltése
Nagyon sok alkalmazás képes arra, hogy ha a Windows Intézőjéből állományokat kijelölünk és Drag and Drop-al az adott programra húzzuk, akkor ezek az állományok valamilyen módon felhasználásra kerülnek az alkalmazásban.
Ha saját programunkban is szeretnénk ezt a lehetőséget megvalósítani, akkor a mellékelt példából megtudhatjuk, ennek a módját.
A Drag and Drop nem csak a Windows Intézőből indulhat, hanem bármely olyan alkalmazásból, mely képes erre.
A megoldást egy Windows üzenet figyelése adja. Amikor a WM_DROPFILES üzenetet kapja 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 override void WndProc(ref Message m)
    {
      if (m.Msg==Win32.WM_DROPFILES)
      {
        label1.Text="";
        StringBuilder filename = 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 e 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ő.
        uint count=Win32.DragQueryFile(m.WParam,  0xFFFFFFFF, filename, 260);
Most már indíthatunk egy ciklust, melyben végigmegyünk az összes állományon. Az egyes állomány neveket 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ány név a harmadik paraméterben átadott StringBuilder-be kerül.
        for (uint i=0; i<count; i++)
        {
          if (Win32.DragQueryFile(m.WParam, i, filename, 260)>0)
          {
            label1.Text+=filename+"\n";
          }
        }
        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
      {
        base.WndProc(ref m);
      }