Visual Basic или C# перетащите исходный URL-адрес изображения

Я хочу создать и скомпилировать небольшую программу, которая позволяет кому-то запускать, перетаскивать изображение из браузера. Затем я хочу, чтобы эта программа выбрала исходный URL-адрес для этого изображения и вставила его в форму текстового поля. Мне нужно сделать это, потому что позже я собираюсь заставить программу загружать указанное URL-изображение в Imgur одним нажатием кнопки с помощью API, но сейчас я ищу способ использовать перетаскивание для мое преимущество. Я также не знаю, будет ли проще использовать VB.net или C#.

Может ли кто-нибудь дать мне какие-либо подсказки, как я могу это сделать?

Вот что у меня пока есть..

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Imgur_Album_Upload
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            WireDragDrop(this.Controls);
        }
        private void WireDragDrop(Control.ControlCollection ctls)
        {
            foreach (Control ctl in ctls)
            {
                ctl.AllowDrop = true;
                ctl.DragEnter += ctl_DragEnter;
                ctl.DragDrop += ctl_DragDrop;
                WireDragDrop(ctl.Controls);

            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void ctl_DragDrop(object sender, DragEventArgs e)
        {
            var textData = e.Data.GetData(DataFormats.Text) as string;

            if (textData == null)
                return;

            messagebox.Text = textData;
            // Validate the URL in textData here
        }
        private void ctl_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.Text))
            {
                e.Effect = DragDropEffects.Move;
            }
            else
            {
                e.Effect = DragDropEffects.None;
            }
        }
    }
}

person user4191887    schedule 14.02.2016    source источник
comment
в этом случае вам понадобится помощь самого браузера.   -  person Fᴀʀʜᴀɴ Aɴᴀᴍ    schedule 14.02.2016
comment
Я провел много исследований, и ничего не сработало, просто интересно, есть ли у кого-нибудь какие-нибудь идеи, так как мне не повезло   -  person user4191887    schedule 14.02.2016
comment
Я думал, что это будет работать как захват буфера обмена, но на этот раз перетаскивание   -  person user4191887    schedule 14.02.2016
comment
Приходит ли URL-адрес в виде метаданных с перетаскиваемым изображением?   -  person user4191887    schedule 14.02.2016
comment
Формы Windows с использованием Visual Studio 2013   -  person user4191887    schedule 14.02.2016
comment
Я вижу этот пример, но не знаю, возникнут ли у меня те же проблемы, что и у него stackoverflow.com/questions/11055965/   -  person user4191887    schedule 14.02.2016
comment
Ах я вижу. Я ошибся с форматом. Ответ работает для вас? Что, если вы получите данные как DataFormats.Text?   -  person cbr    schedule 14.02.2016
comment
И куда бы вы это положили?   -  person user4191887    schedule 14.02.2016
comment
Обработчик событий DragEnter или DragDrop вашего элемента управления. Вот пошаговое руководство: msdn.microsoft.com/en- us/library/za0zx9y0%28v=vs.110%29   -  person cbr    schedule 14.02.2016


Ответы (1)


Решение в вопросе, который вы связали, только кажется работать с некоторыми браузерами. Использование «FileContents» в GetData у меня не работает в Chrome, но работает с Firefox. DataFormats.Dib позволит вам работать с растровым изображением напрямую, но, к сожалению, Chrome, похоже, тоже не поддерживает это.

Указание DataFormats.Text кажется надежным решением для разных браузеров, поскольку оно возвращает URL-адрес изображения во всех браузерах, которые я тестировал. DataFormats.UnicodeText может и лучше, но я не проверял.

Во-первых, установите для свойства AllowDrop значение true в любом элементе управления, который вы хотите реагировать на перетаскивание. Затем добавьте эти обработчики событий к событиям DragEnter и DragDrop:

private void DragEnterHandler(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.Text))
    {
        e.Effect = DragDropEffects.Move;
    }
    else
    {
        e.Effect = DragDropEffects.None;
    }
}

private void DragDropHandler(object sender, DragEventArgs e)
{
    var textData = e.Data.GetData(DataFormats.Text) as string;

    if (textData == null)
        return;

    MessageBox.Show(textData);
    // Validate the URL in textData here
}

Дизайнер Visual Studio может сделать это за вас. Кроме того, вы можете добавить обработчики самостоятельно, например, в конструкторе формы:

this.DragEnter += DragEnterHandler;
this.DragDrop += DragDropHandler;
// someControl.DragEnter += DragEnterHandler;
// ...
person cbr    schedule 14.02.2016
comment
Как бы вы сделали так, чтобы вы могли перетаскивать изображение в любое место формы, и оно вводило его в окно сообщения? Я не думаю, что этого будет достаточно, чтобы потребовать, чтобы вы перетащили его в окно сообщения. - person user4191887; 15.02.2016
comment
@ user4191887 Надеюсь, этот ответ поможет. - person cbr; 15.02.2016
comment
Я пробовал, и это все еще не работает, когда я перетаскиваю его в текстовое поле, он просто открывает диалог с URL-адресом изображения в нем. - person user4191887; 15.02.2016
comment
@user4191887 user4191887 Это был просто пример, чтобы показать вам данные, которые вы вставили в форму. Замените MessageBox.Show на что хотите. - person cbr; 15.02.2016
comment
Нет, это не дает мне возможности перетаскивать - person user4191887; 15.02.2016
comment
Хорошо, у меня это работает, поэтому, когда вы перетаскиваете его в текстовое поле, оно вставляет данные, и это работает. Но я использовал код из другого примера, и он не позволяет мне перетаскивать что-либо еще, только окно сообщения - person user4191887; 15.02.2016
comment
@user4191887 user4191887 Можете ли вы отредактировать свой ответ, чтобы включить текущий код? О каком окне сообщений вы говорите? - person cbr; 15.02.2016
comment
Я установил его для ввода URL-адреса в текстовое поле, но это работает только при перетаскивании изображения поверх текстового поля. Я хочу, чтобы вы могли поместить изображение в любое место, и оно поместит URL-адрес в текстовое поле. - person user4191887; 15.02.2016
comment
@user4191887 user4191887 Можете ли вы добавить MessageBox.Show или что-то в обработчик DragDrop, чтобы подтвердить, что он вообще запущен? То, что вы описали, похоже на поведение текстового поля по умолчанию. Попробуйте запустить программу без отладки — я слышал, что отладка программы прерывает перетаскивание, поскольку хост-процесс работает с повышенными разрешениями. - person cbr; 15.02.2016
comment
Он срабатывает, я уже протестировал его, и он отображает окно сообщения с URL-адресом, но когда я устанавливаю его для ввода этого URL-адреса в текстовое поле. Это не сработает, если вы перетащите его в другое место, кроме самого текстового поля. - person user4191887; 15.02.2016
comment
Я также проверил, что он позволяет мне перетаскивать только изображение на объекты, а не фактическую форму. - person user4191887; 15.02.2016
comment
@ user4191887 Вы не подключили обработчик событий к самой форме. - person cbr; 15.02.2016
comment
@ user4191887 Ну, у вас уже есть код для добавления обработчиков событий к событию элемента управления (WireDragDrop). Просто сделайте то же самое с this. Смотрите конец этого ответа. - person cbr; 15.02.2016
comment
Черт, я нигде не могу найти пример того, как использовать OAuth2 для аутентификации пользователя и загрузки в альбом на Imgur. У них действительно должна быть подробная документация по такого рода вещам. - person user4191887; 15.02.2016
comment
@user4191887 user4191887 Возможно, вы захотите изучить существующие реализации .NET и то, как они это делают. Одним из таких примеров может быть EasyImgur. - person cbr; 15.02.2016
comment
Антивирус говорит, что программа не работает - person user4191887; 15.02.2016
comment
@ user4191887 Предполагается, что вы смотрите на исходный код. - person cbr; 15.02.2016
comment
Да, и я, но программа позволяет пользователю только загрузить изображение, она не дает возможности загрузить его в определенный альбом. Эти вещи действительно должны быть задокументированы, повторяю я. - person user4191887; 15.02.2016
comment
@user4191887 Давайте продолжим это обсуждение в чате. - person cbr; 15.02.2016