我需要在WinForm C#中捕获WebBrowser控件的拖放事件。有什么办法吗?
答案 0 :(得分:2)
我的工作:
使用布尔成员变量来检测是否从内部代码调用导航,或者从外部代码调用导航。实施“导航”(BeforeNavigating)事件并检查它是否是来自外部的呼叫。
示例:
从内部调用导航:
private void NavigateLocal(string htmlFileName)
{
this.localNavigate = true;
this.webBrowser.Navigate(htmlFileName);
}
事件方法:
private void WebBrowser_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
if (this.localNavigate)//inside call
{
this.localNavigate = false;
}
else //call from outside
{
this.DoDragDrop(e.Url.ToString());
}
}
答案 1 :(得分:1)
"修正"我用的是让浏览器告诉你它被拖拽,弹出带有屏幕截图的图片,并处理正常的c#事件。
[ComVisible(true)]
public class Communicator
{
private static frmMain m_mainWindow = null;
public Communicator(frmMain mainWindow)
{
m_mainWindow = mainWindow;
}
public void exit()
{
m_mainWindow.Close();
}
public void DragStarted(object e)
{
m_mainWindow.DoDragEnterFromScript();
}
}
private void frmMain_Load(object sender, EventArgs e)
{
webBrowser1.ObjectForScripting = new Communicator(this);;
webBrowser1.Navigate(@"about:blank");
}
public void DoDragEnterFromScript()
{
// Is this an executable, shortcut or batch?
Rectangle rect = new Rectangle(0, 0, webBrowser1.Size.Width, webBrowser1.Size.Height);
Bitmap bmp = new Bitmap(rect.Width, rect.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
Point ptCon;
ptCon = webBrowser1.PointToScreen(new Point(0, 0));
g.CopyFromScreen(ptCon, new Point(0, 0), webBrowser1.Size, CopyPixelOperation.SourceCopy);
pictureBox2.BackgroundImage = bmp;
//pictureBox2.BackColor = Color.Red;
webBrowser1.Visible = false;
pictureBox2.Visible = true;
pictureBox2.Location = new Point(0, 0);
pictureBox2.Size = webBrowser1.Size;
}
public void frmMain_DragEnter(object sender, DragEventArgs e)
{
if (!e.Data.GetDataPresent(DataFormats.FileDrop))
return;
string[] arrfiles = (string[])e.Data.GetData(DataFormats.FileDrop);
// SUCCESS
}
在html文件中
var holder = document.getElementsByTagName('body')[0];
holder.ondragover = function () {
window.external.DragStarted(event);
return true;
};
不要忘记在DragLeave / DragDrop
之后隐藏图片框答案 2 :(得分:0)
拖放的标准方式不起作用吗?
答案 3 :(得分:0)
WebBrowser Customization 如果要控制WebBrowser控件在拖放操作期间执行的操作,您还可以查看IDocHostUIHandler :: GetDropTarget。
连接IDocHostUIHandler实现的最简单方法是连接ICustomDoc接口及其所有SetUIHandler方法(请参阅http://www.codeproject.com/csharp/advhost.asp)。 This method has memory leak但是。另一种方法是跳过Windows Form的webbrowser类和use the ActiveX host support directly。
答案 4 :(得分:0)
我发现的最好方法是通过主机处理控件中的Navigating
事件。当您在控件上删除文件时,此事件将触发,您可以在此时获取文件名。诀窍在于你必须知道什么构成 legal 导航(即直接导航的文档与被删除的文件)。处理丢弃事件的大多数应用程序都使用特定文档或一组已知文档,这应该不是问题。
另一种选择是使用JavaScript代码通过HTML文档内的window.ondrop
处理放置操作,但是您只能获取文件数据和文件名,而不是完整路径。
有关这两种方法的更多信息,请查看此博客文章: https://weblog.west-wind.com/posts/2017/Mar/10/Dragging-and-Dropping-Images-and-Files-into-the-Web-Browser-Control