#region Using directives using System; using System.Windows.Forms; #endregion namespace DocToolkit { /// /// DragDropManager class allows to open files dropped from /// Windows Explorer in Windows Form application. /// /// Using: /// 1) Write function which opens file selected from MRU: /// /// private void dragDropManager_FileDroppedEvent(object sender, FileDroppedEventArgs e) /// { /// // open file(s) from e.FileArray: /// // e.FileArray.GetValue(0).ToString() ... /// } /// /// 2) Add member of this class to the parent form: /// /// private DragDropManager dragDropManager; /// /// 3) Create class instance in parent form initialization code: /// /// dragDropManager = new DragDropManager(this); /// dragDropManager.FileDroppedEvent += dragDropManager_FileDroppedEvent; /// /// public class DragDropManager { private Form frmOwner; // reference to owner form // Event raised when drops file(s) to the form public event FileDroppedEventHandler FileDroppedEvent; public DragDropManager(Form owner) { frmOwner = owner; //// ensure that parent form allows dropping //frmOwner.AllowDrop = true; //// subscribe to parent form's drag-drop events //frmOwner.DragEnter += OnDragEnter; //frmOwner.DragDrop += OnDragDrop; } /// /// Handle parent form DragEnter event /// /// /// private void OnDragEnter(object sender, System.Windows.Forms.DragEventArgs e) { // If file is dragged, show cursor "Drop allowed" if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy; else e.Effect = DragDropEffects.None; } /// /// Handle parent form DragDrop event /// /// /// private void OnDragDrop(object sender, System.Windows.Forms.DragEventArgs e) { // When file(s) are dragged from Explorer to the form, IDataObject // contains array of file names. If one file is dragged, // array contains one element. Array a = (Array)e.Data.GetData(DataFormats.FileDrop); if (a != null) { if (FileDroppedEvent != null) { // Raise event asynchronously. // Explorer instance from which file is dropped is not responding // all the time when DragDrop handler is active, so we need to return // immidiately (especially if OpenFiles shows MessageBox). FileDroppedEvent.BeginInvoke(this, new FileDroppedEventArgs(a), null, null); frmOwner.Activate(); // in the case Explorer overlaps parent form } } // NOTE: exception handling is not used here. // Caller responsibility is to handle exceptions // in the function invoked by FileDroppedEvent. } } public delegate void FileDroppedEventHandler(object sender, FileDroppedEventArgs e); public class FileDroppedEventArgs : System.EventArgs { private Array fileArray; public FileDroppedEventArgs(Array array) { this.fileArray = array; } public Array FileArray { get { return fileArray; } } } }