Реализация функции перетаскивания и управления WebBrowser Winforms C # - PullRequest
4 голосов
/ 01 сентября 2009

Мне нужно захватывать события перетаскивания элемента управления WebBrowser в WinForm C #. Есть ли способ?

Ответы [ 5 ]

2 голосов
/ 06 июля 2010

Мой Workarond:

используйте переменную логического члена, чтобы определить, вызываете ли вы навигацию из внутреннего кода или навигация вызывается из другого кода. Реализуйте событие «Навигация» (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 голос
/ 28 июня 2014

«Исправить», которое я использую, чтобы браузер сообщал вам, что его перетаскивают, отображает снимок экрана и обрабатывает обычные события 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

0 голосов
/ 15 марта 2017

Лучший способ, который я нашел, - обрабатывать событие Navigating в элементе управления через хост. Когда вы сбрасываете файлы на элемент управления, это событие срабатывает, и вы можете выбрать имена файлов в это время. Хитрость заключается в том, что вы должны знать, что составляет легальная навигация (т. Е. Документ, который перемещается напрямую по сравнению с файлом, который удален). Большинство приложений, которые обрабатывают события отбрасывания, используют определенный документ или набор известных документов, с которыми это не должно быть проблемой.

Другим вариантом является обработка операции перетаскивания через window.ondrop внутри документа HTML с помощью кода JavaScript, но вы можете выбрать только данные файла и имя файла, а не полный путь.

Для получения дополнительной информации об обоих подходах посмотрите этот пост в блоге: https://weblog.west -wind.com / сообщений / 2017 / Март / 10 / Перетаскивание и сбрасывая-изображения-и-Files-в-The-Web-Browser-Control

0 голосов
/ 21 ноября 2009

Настройка веб-браузера Вы также можете заглянуть в IDocHostUIHandler :: GetDropTarget, если хотите контролировать действия WebBrowser во время операций перетаскивания.

Самый простой способ подключить реализацию IDocHostUIHandler - подключить интерфейс ICustomDoc и весь его метод SetUIHandler (см. http://www.codeproject.com/csharp/advhost.asp). Хотя этот метод имеет утечку памяти . Другой метод заключается в пропустите класс веб-браузера Windows Form и напрямую использует поддержку хоста ActiveX .

0 голосов
/ 01 сентября 2009

Не работает ли стандартный способ перетаскивания?

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

...