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; }
}
}
}