Entkoppeln von Drag und Drop-Sources (Explorer) vom eigenen Programm

    • C#

      Entkoppeln von Drag und Drop-Sources (Explorer) vom eigenen Programm

      Wenn bei Drag and Drop von Dateien in das eigene Programm unmittelbar ein Dialog angezeigt wird, z.B. eine MessageBox),
      ist die D&D-Quelle blockiert, zu erkennen am Mauszeiger mit Verknüpfungssymbol.
      Wenn vom explorer dedroppt wird, ist dann der Explorer so lange nicht bedienbar, bis der Dialog beendet wird.
      Mit dieser einfachen Lösung lässt sich dieses Problem elegant beheben:
      Die empfangene Dateiliste wird per BeginInvoke() an die nächste Prozedur übergeben (Invoke() funktioniert nicht!).
      Spoiler anzeigen

      C#-Quellcode

      1. private void MainForm_DragEnter(object sender, DragEventArgs e)
      2. {
      3. if (e.Data.GetDataPresent(DataFormats.FileDrop))
      4. {
      5. e.Effect = e.AllowedEffect;
      6. }
      7. }
      8. private void MainForm_DragDrop(object sender, DragEventArgs e)
      9. {
      10. e.Effect = DragDropEffects.None;
      11. if (!e.Data.GetDataPresent(DataFormats.FileDrop))
      12. {
      13. return;
      14. }
      15. string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
      16. // Entkoppeln der D&D-Source
      17. Action<List<string>> action = new Action<List<string>>(this.DoIt);
      18. this.BeginInvoke(action, files.ToList());
      19. }
      20. private void DoIt(List<string> files)
      21. {
      22. MessageBox.Show(files.Count.ToString());
      23. }
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!