扩展WebBrowser控件,使其支持拖放文件
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; } } } }
勉強心を持てば、生活は虚しくない!