WebBrowserコントロールを拡張し、ファイルのドラッグアンドドロップをサポート

2224 ワード

    public partial class UserControl1 : WebBrowser

    {

        private const int WmDropfiles = 0x233;



        [DllImport("shell32.dll")]

        private static extern uint DragQueryFile(IntPtr hDrop, uint iFile, StringBuilder lpszFile, uint cch);



        [DllImport("shell32.dll")]

        private static extern void DragAcceptFiles(IntPtr hWnd, bool fAccept);



        protected override void OnHandleCreated(EventArgs e)

        {

            base.OnHandleCreated(e);



            // 

            if (!DesignMode)

            {

                DragAcceptFiles(Handle, true);

            }

        }



        protected override void WndProc(ref Message m)

        {

            if (m.Msg == WmDropfiles)

            {

                #region  

                // 

                var count = DragQueryFile(m.WParam, 0xffffffff, null, 0);

                // 

                var filePaths = new string[count];

                for (uint i = 0; i < count; i++)

                {

                    var sb = new StringBuilder();

                    DragQueryFile(m.WParam, i, sb, 1024);

                    filePaths[i] = sb.ToString();

                }

                #endregion



                // 

                var isCancel = false;



                #region  

                if (DragFile != null)

                {

                    var args = new DragFileEventArgs(filePaths);

                    DragFile(this, args);

                    isCancel = args.IsCancel;

                }

                #endregion



                if (isCancel) return;

            }

            base.WndProc(ref m);

        }



        public event EventHandler<DragFileEventArgs> DragFile;



        public class DragFileEventArgs : EventArgs

        {

            private readonly string[] _filePaths;

            public bool IsCancel { get; set; }



            public DragFileEventArgs(string[] filePaths)

            {

                _filePaths = filePaths;

            }



            public string[] FilePaths

            {

                get { return _filePaths; }

            }

        }

    }