实现拖放功能WebBrowser控件Winforms C#

时间:2009-09-01 07:22:33

标签: winforms drag-and-drop webbrowser-control

我需要在WinForm C#中捕获WebBrowser控件的拖放事件。有什么办法吗?

5 个答案:

答案 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)

拖放的标准方式不起作用吗?

http://www.codeproject.com/KB/cs/dragdrop.aspx

答案 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