我们在Winform支持网页通常增加WebBrowser控件实现,相当于内嵌浏览器浏览网页使用,
而此WebBrowser默认情况是文件拖入功能是不支持的,
如何才能支持呢。在这里介绍如何实现方法
一.直接上源码吧,
下载后直接用,其实不要了解太深入,会用就行了啦(用之前,网页需有加入JS drop功能)
下载地址 http://pcbren.cn/ShareFiles/WebbrowserDemoDrop.zip
二.实现拖拽是重构WebBrowser浏览器Drag事件,让浏览器支持拖拽功能,以下为部份代码:
public partial class ExtendedWebBrowser : System.Windows.Forms.WebBrowser, MsHtmHstInterop.IDocHostUIHandler, MsHtmHstInterop.IDropTarget, IEInterface.IWebBrowser2 { public event Events.DragEnterEventHander ExDragEnter; private Events.DragEnterEventArgs dragEnterEventArgs; public event Events.DragOverEventHander ExDragOver; private Events.DragOverEventArgs dragOverEventArgs; public event Events.DragLeaveEventHander ExDragLeave; public event Events.DragDropEventHander ExDragDrop; private Events.DragDropEventArgs dragDropEventArgs; private bool registerAsDropTarget = true; private bool registerAsBrowser = true; private bool slient = true; MsHtmHstInterop.IDropTarget pDropTarget;//保存原有的拖放对象 private bool isDragToInputBox = false;//判断是否是在向输入框中拖放 public ExtendedWebBrowser() { InitializeComponent(); this.AllowWebBrowserDrop = true; Navigate("about:blank"); MsHtmHstInterop.ICustomDoc idoc = this.Document.DomDocument as MsHtmHstInterop.ICustomDoc; idoc.SetUIHandler(this as MsHtmHstInterop.IDocHostUIHandler); dragEnterEventArgs = new Events.DragEnterEventArgs(); dragOverEventArgs = new Events.DragOverEventArgs(); dragDropEventArgs = new Events.DragDropEventArgs(); } #region 获取新窗口Url AxHost.ConnectionPointCookie cookie; WebBrowserExtendedEvents events; //This method will be called to give you a chance to create your own event sink protected override void CreateSink() { //MAKE SURE TO CALL THE BASE or the normal events won't fire base.CreateSink(); events = new WebBrowserExtendedEvents(this); cookie = new AxHost.ConnectionPointCookie(this.ActiveXInstance, events, typeof(LuckyPang.ControlLibrary.IEInterface.DWebBrowserEvents2)); } protected override void DetachSink() { if (null != cookie) { cookie.Disconnect(); cookie = null; } base.DetachSink(); } //This new event will fire when the page is navigating public event EventHandler<WebBrowserExtendedNavigatingEventArgs> ExtendedNavigating; protected void OnExtendedNavigating(string url, string frame, out bool cancel) { EventHandler<WebBrowserExtendedNavigatingEventArgs> h = ExtendedNavigating; WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, frame); if (null != h) { h(this, args); } //Pass the cancellation chosen back out to the events cancel = args.Cancel; } public event EventHandler<WebBrowserExtendedNewWindowEventArgs> ExtendedNewWindow; protected void OnExtendedNewWindow(string url,out bool cancel) { EventHandler<WebBrowserExtendedNewWindowEventArgs> h = ExtendedNewWindow; WebBrowserExtendedNewWindowEventArgs args = new WebBrowserExtendedNewWindowEventArgs(url); if (null != h) { h(this, args); } //Pass the cancellation chosen back out to the events cancel = args.Cancel; } public event EventHandler<Events.WebBrowserExtendedWindowClosingEventArgs> ExtendedWindowClosing; protected void OnExtendWindowClosing(out bool cancel) { EventHandler<Events.WebBrowserExtendedWindowClosingEventArgs> h = ExtendedWindowClosing; Events.WebBrowserExtendedWindowClosingEventArgs args = new Events.WebBrowserExtendedWindowClosingEventArgs(); if (null != h) { h(this, args); } //Pass the cancellation chosen back out to the events cancel = args.Cancel; } //This class will capture events from the WebBrowser class WebBrowserExtendedEvents : System.Runtime.InteropServices.StandardOleMarshalObject, LuckyPang.ControlLibrary.IEInterface.DWebBrowserEvents2 { ExtendedWebBrowser _Browser; private bool m_bPop; public WebBrowserExtendedEvents(ExtendedWebBrowser browser) { _Browser = browser; } //Implement whichever events you wish public void BeforeNavigate2(object pDisp, ref object URL, ref object flags, ref object targetFrameName, ref object postData, ref object headers, ref bool cancel) { _Browser.OnExtendedNavigating((string)URL, (string)targetFrameName, out cancel); } public void NewWindow3(ref object ppDisp, ref bool Cancel, uint dwFlags, string bstrUrlContext, string bstrUrl) { _Browser.OnExtendedNewWindow(bstrUrl, out Cancel); } #region DWebBrowserEvents2 成员 public void StatusTextChange(string Text) { throw new NotImplementedException(); } public void ProgressChange(int Progress, int ProgressMax) { throw new NotImplementedException(); } public void CommandStateChange(int Command, bool Enable) { throw new NotImplementedException(); } public void DownloadBegin() { m_bPop = false; } public void DownloadComplete() { m_bPop = true; } public void TitleChange(string Text) { throw new NotImplementedException(); } public void PropertyChange(string szProperty) { throw new NotImplementedException(); } public void NewWindow2(ref object ppDisp, ref bool Cancel) { Cancel = m_bPop; } public void NavigateComplete2(object pDisp, ref object URL) { throw new NotImplementedException(); } public void DocumentComplete(object pDisp, ref object URL) { throw new NotImplementedException(); } public void OnQuit() { throw new NotImplementedException(); } public void OnVisible(bool Visible) { throw new NotImplementedException(); } public void OnToolBar(bool ToolBar) { throw new NotImplementedException(); } public void OnMenuBar(bool MenuBar) { throw new NotImplementedException(); } public void OnStatusBar(bool StatusBar) { throw new NotImplementedException(); } public void OnFullScreen(bool FullScreen) { throw new NotImplementedException(); } public void OnTheaterMode(bool TheaterMode) { throw new NotImplementedException(); } public void WindowSetResizable(bool Resizable) { throw new NotImplementedException(); } public void WindowSetLeft(int Left) { throw new NotImplementedException(); } public void WindowSetTop(int Top) { throw new NotImplementedException(); } public void WindowSetWidth(int Width) { throw new NotImplementedException(); } public void WindowSetHeight(int Height) { throw new NotImplementedException(); } public void WindowClosing(bool IsChildWindow, ref bool Cancel) { _Browser.OnExtendWindowClosing(out Cancel); } public void ClientToHostWindow(ref int CX, ref int CY) { throw new NotImplementedException(); } public void SetSecureLockIcon(int SecureLockIcon) { throw new NotImplementedException(); } public void FileDownload(ref bool Cancel) { throw new NotImplementedException(); } public void NavigateError(object pDisp, ref object URL, ref object Frame, ref object StatusCode, ref bool Cancel) { throw new NotImplementedException(); } public void PrintTemplateInstantiation(object pDisp) { throw new NotImplementedException(); } public void PrintTemplateTeardown(object pDisp) { throw new NotImplementedException(); } public void UpdatePageStatus(object pDisp, ref object nPage, ref object fDone) { throw new NotImplementedException(); } public void PrivacyImpactedStateChange(bool bImpacted) { throw new NotImplementedException(); } #endregion } #endregion #region IDocHostUIHandler 成员 void MsHtmHstInterop.IDocHostUIHandler.EnableModeless(int fEnable) { throw new NotImplementedException(); } void MsHtmHstInterop.IDocHostUIHandler.FilterDataObject(MsHtmHstInterop.IDataObject pDO, out MsHtmHstInterop.IDataObject ppDORet) { ppDORet = pDO; } void MsHtmHstInterop.IDocHostUIHandler.GetDropTarget(MsHtmHstInterop.IDropTarget pDropTarget, out MsHtmHstInterop.IDropTarget ppDropTarget) { this.pDropTarget = pDropTarget;//保存默认的对象 ppDropTarget = this as MsHtmHstInterop.IDropTarget ;//把当前对角注册为拖放对象 } void MsHtmHstInterop.IDocHostUIHandler.GetExternal(out object ppDispatch) { if (this.ObjectForScripting != null) { ppDispatch = this.ObjectForScripting; } else { ppDispatch = null; } } void MsHtmHstInterop.IDocHostUIHandler.GetHostInfo(ref MsHtmHstInterop._DOCHOSTUIINFO pInfo) { pInfo.dwFlags = 0x00040000; } void MsHtmHstInterop.IDocHostUIHandler.GetOptionKeyPath(out string pchKey, uint dw) { throw new NotImplementedException(); } void MsHtmHstInterop.IDocHostUIHandler.HideUI() { throw new NotImplementedException(); } void MsHtmHstInterop.IDocHostUIHandler.OnDocWindowActivate(int fActivate) { throw new NotImplementedException(); } void MsHtmHstInterop.IDocHostUIHandler.OnFrameWindowActivate(int fActivate) { throw new NotImplementedException(); } void MsHtmHstInterop.IDocHostUIHandler.ResizeBorder(ref MsHtmHstInterop.tagRECT prcBorder, MsHtmHstInterop.IOleInPlaceUIWindow pUIWindow, int fRameWindow) { throw new NotImplementedException(); } void MsHtmHstInterop.IDocHostUIHandler.ShowContextMenu(uint dwID, ref MsHtmHstInterop.tagPOINT ppt, object pcmdtReserved, object pdispReserved) { throw new NotImplementedException(); } void MsHtmHstInterop.IDocHostUIHandler.ShowUI(uint dwID, MsHtmHstInterop.IOleInPlaceActiveObject pActiveObject, MsHtmHstInterop.IOleCommandTarget pCommandTarget, MsHtmHstInterop.IOleInPlaceFrame pFrame, MsHtmHstInterop.IOleInPlaceUIWindow pDoc) { if (pActiveObject != null) { pActiveObject.GetWindow((IntPtr )0); } } void MsHtmHstInterop.IDocHostUIHandler.TranslateAccelerator(ref MsHtmHstInterop.tagMSG lpmsg, ref Guid pguidCmdGroup, uint nCmdID) { throw new NotImplementedException(); } void MsHtmHstInterop.IDocHostUIHandler.TranslateUrl(uint dwTranslate, ref ushort pchURLIn, IntPtr ppchURLOut) { throw new NotImplementedException(); } void MsHtmHstInterop.IDocHostUIHandler.UpdateUI() { throw new NotImplementedException(); } #endregion #region IDropTarget 成员 public new void DragEnter(MsHtmHstInterop.IDataObject pDataObj, uint grfKeyState, MsHtmHstInterop._POINTL pt, ref uint pdwEffect) { pDropTarget.DragEnter(pDataObj, grfKeyState, pt, ref pdwEffect);//调用默认方法 //获取拖动的参数 if (ExDragEnter != null) { DataObject dobj = null; if (pDataObj != null) { dobj = new DataObject(pDataObj);//拖动数据 Point p = new Point(pt.x, pt.y);//鼠标在容器上的位置 dragEnterEventArgs.SetParameters(dobj, grfKeyState, p, pdwEffect); ExDragEnter(this, dragEnterEventArgs);//此处为自定义事件 if (dragEnterEventArgs.handled)//自定义事件的返回值 { pdwEffect = dragEnterEventArgs.pdwEffect; } } } } public new void DragLeave() { pDropTarget.DragLeave();//调用默认的方法 if (ExDragLeave != null) { ExDragLeave(this);//自定义事件 } } public new void DragOver(uint grfKeyState, MsHtmHstInterop._POINTL pt, ref uint pdwEffect) { uint temp = pdwEffect;//保存原有的拖放效果,当调用默认的 //操作时此参数会改变,并根据此来判 //断是否向输入框中拖放 pDropTarget.DragOver(grfKeyState, pt, ref pdwEffect);//调用默认方法 if (pdwEffect > 0)//如果值变为了零,那么是向输入框中拖放了 { isDragToInputBox = true;//标记设为true temp = 0; } else { isDragToInputBox = false;//否则标记设为false pdwEffect = temp; } if (ExDragOver != null)//自定义事件处理 { Point p = new Point(pt.x, pt.y); dragOverEventArgs.SetParameters(grfKeyState, p, temp); if (dragOverEventArgs.handled) { pdwEffect = dragOverEventArgs.pdwEffect; } } } public void Drop(MsHtmHstInterop.IDataObject pDataObj, uint grfKeyState, MsHtmHstInterop._POINTL pt, ref uint pdwEffect) { if (ExDragDrop != null)//自定义事件处理 { if (pDataObj != null && !isDragToInputBox )//如果没有向输入框中拖放则触发此事件 //否则按默认处理 { DataObject dobj = new DataObject(pDataObj); Point p = new Point(pt.x, pt.y); dragDropEventArgs.SetParameters(dobj, grfKeyState, p, pdwEffect); ExDragDrop(this, dragDropEventArgs); if (dragDropEventArgs.handled) { pdwEffect = dragDropEventArgs.pdwEffect; } } } pDropTarget.Drop(pDataObj, grfKeyState, pt, ref pdwEffect);//调用默认方法 } #endregion #region IWebBrowser2 成员 public bool RegisterAsDropTarget { get { return registerAsDropTarget; } set { registerAsDropTarget = value; } } public bool Silent { get { return slient; } set { slient = value; } } public bool RegisterAsBrowser { get { return registerAsBrowser; } set { registerAsBrowser = value; } } #endregion }
三.拖拽界面展示: