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