none
Drag & Drop di un ogetto da una Applicazione Esterna RRS feed

  • Domanda

  • Buongiorno a tutti

    avendo una lista treeview di una applicazione esterna , e sapendo che gli item hanno implementato il drag & drop degli oggetti

    volevo chiedere se è possibile trascinare quegli item in un mio form e leggere semplicemente il testo o il nome dell'ogetto oppure l'handle dell'ogetto


    Wacky Teseo

    mercoledì 2 dicembre 2015 04:26

Risposte

  • Potrebbe essere qualche altro formato non supportato da .net. Per supportare altri formati c'è questo esempio:

    http://blogs.msdn.com/b/adamroot/archive/2008/02/19/shell-style-drag-and-drop-in-net-wpf-and-winforms.aspx

    Però, potrebbe essere che anche se riuscissi ad avere il drop, poi non sapresti come usare quei dati. Immagina se il formato trasportato è un oggetto ed il testo che vedi è soltanto una proprietà di quell'oggetto. Dovresti conoscere la struttura dell'oggetto.

    Tra l'altro controlla nella licenza del programma target, se è consentito usare il programma dall'esterno nel modo in cui vuoi fare.



    • Modificato BlueLed venerdì 4 dicembre 2015 14:34
    • Contrassegnato come risposta Wacky Teseo domenica 6 dicembre 2015 07:16
    venerdì 4 dicembre 2015 14:32

Tutte le risposte

  • Ciao,

    nel caso sia un'applicazione WPF dai un occhio qui: http://www.wpftutorial.net/draganddrop.html

    Nel caso sia un'applicazione Windows Forms guarda qui: https://msdn.microsoft.com/it-it/library/aa984430(v=vs.71).aspx


    Martino Bordin (http://blogs.ugidotnet.org/martinobordin)

    mercoledì 2 dicembre 2015 07:40
  • Grazie , la spiegazione  è ottima però seguendo tutte le spiegazioni rimane sempre un dubbio , se lo faccio io tra applicazioni mie tutto funziona , ma se lo faccio tra quella mia (ricevente) e quella esterna (da cui parte il trascinamento) , quando arriva sulla mia finestra esce il simboletto del divieto , 

    il drag and drop nella applicazione esterna , tra i suoi controlli è implementata di sicuro in quanto esiste la funzione

    al limite esiste un modo per intercettare un drag and drop globale ?


    Wacky Teseo

    mercoledì 2 dicembre 2015 11:42
  • Grazie , la spiegazione  è ottima però seguendo tutte le spiegazioni rimane sempre un dubbio , se lo faccio io tra applicazioni mie tutto funziona , ma se lo faccio tra quella mia (ricevente) e quella esterna (da cui parte il trascinamento) , quando arriva sulla mia finestra esce il simboletto del divieto , 

    il drag and drop nella applicazione esterna , tra i suoi controlli è implementata di sicuro in quanto esiste la funzione

    al limite esiste un modo per intercettare un drag and drop globale ?


    Wacky Teseo

    Devi conoscere il formato dei dati con cui l'applicazione memorizza gli item per il drag and drop. Se non ti abilita il drop, vuol dire che il formato che hai richiesto non è compatibile. Può darsi che sia tra quelli di sistema e allora devi essere in grado di capire qual è (.net di base non li supporta tutti). Se invece è personalizzato, devi trovare il modo di conoscerlo, sempre che chi l'ha scritto non voglia che rimanga privato.

    mercoledì 2 dicembre 2015 12:21
  • Funziona allo stesso modo, verifica di impostare il tipo di dato corretto:

    e.Data.GetDataPresent(DataFormats.Text)

    https://msdn.microsoft.com/it-it/library/system.windows.forms.dataformats(v=vs.110).aspx



    Martino Bordin (http://blogs.ugidotnet.org/martinobordin)

    mercoledì 2 dicembre 2015 13:09
  • Se invece è personalizzato, devi trovare il modo di conoscerlo, sempre che chi l'ha scritto non voglia che rimanga privato.

    a questa chiamata

    e.Data.GetDataPresent(DataFormats.Text)

    non ci arriva proprio in quanto durante il drag and drop mi da il segnale di divieto , anche sul notepad

    il treview remoto è un Treview32 , quindi se il programmatore ha inibito il drag and drop all'esterno della propria applicazione non si può fare nulla ?

    il contenitore che accetta il drop della applicazione è un "AfxFrameOrView" a quale componente VS equivale ?


    Wacky Teseo

    mercoledì 2 dicembre 2015 16:03

  • a questa chiamata

    e.Data.GetDataPresent(DataFormats.Text)

    non ci arriva proprio in quanto durante il drag and drop mi da il segnale di divieto , anche sul notepad

    il treview remoto è un Treview32 , quindi se il programmatore ha inibito il drag and drop all'esterno della propria applicazione non si può fare nulla ?

    il contenitore che accetta il drop della applicazione è un "AfxFrameOrView" a quale componente VS equivale ?


    Wacky Teseo

    Per fargli fare il drop, nell'evento DragEnter o DragOver devi riconoscere se è un formato che supporti ed impostare la proprietà Effect. Se non fai questo, l'evento DragDrop non te lo chiama. Per controllare che i dati siano in un formato che conosci, puoi testare usando GetDataPresent.



    • Modificato BlueLed mercoledì 2 dicembre 2015 21:47
    mercoledì 2 dicembre 2015 16:22
  • purtroppo non ho capito

    Wacky Teseo

    mercoledì 2 dicembre 2015 19:15
  • Il drag and drop non tratta solo "Testo". Ci sono vari tipi di dato che sono draggabili and droppabili. Tu li puoi ricevere solo se sai come gestire il formato associato ai dati che ti stanno passando sopra la finestra.

    Quando intercetti il drag con l'evento DragEnter devi chiedere ad e.Data se può fornirti i dati nel formato che vuoi tu. Tu ti aspetti DataFormats.Text. Se i dati che sono associati all'operazione di drag non corrispondono al formato Text la cosa non funziona.

    Se fai

    e.Data.GetDataPresent(DataFormats.Text)

    e questo ti restituisce "false", vuol dire che i dati sono in altro formato.


    • Modificato BlueLed mercoledì 2 dicembre 2015 21:45
    mercoledì 2 dicembre 2015 21:45
  • io ho fatto cosi

    pannelloBottoni.Allowdrop=true;

    private void pannelloBottoni_DragOver(object sender, DragEventArgs e)
             {
                 e.Effect = DragDropEffects.Copy  ;
             }

     private void pannelloBottoni_DragDrop(object sender, DragEventArgs e)
             {
                 MessageBox.Show(e.Data.GetDataPresent(DataFormats.Text).ToString());
               }

    ma quando ci passo con il drag & drop sul pannello mi rimane sempre il simbolo del divieto di accesso

    quindi il messagebox non parte quando rilascio


    Wacky Teseo

    mercoledì 2 dicembre 2015 21:55
  • io ho fatto cosi

    pannelloBottoni.Allowdrop=true;

    private void pannelloBottoni_DragOver(object sender, DragEventArgs e)
             {
                 e.Effect = DragDropEffects.Copy  ;
             }

     private void pannelloBottoni_DragDrop(object sender, DragEventArgs e)
             {
                 MessageBox.Show(e.Data.GetDataPresent(DataFormats.Text).ToString());
               }

    ma quando ci passo con il drag & drop sul pannello mi rimane sempre il simbolo del divieto di accesso

    quindi il messagebox non parte quando rilascio


    Wacky Teseo

    Quella MessageBox prova a metterla nell'evento DragEnter.

    mercoledì 2 dicembre 2015 22:01
  • stesso comportamento :-(


    Wacky Teseo

    mercoledì 2 dicembre 2015 22:06
  • Sul DragEnter ci passa? Hai messo un breakpoint?

    mercoledì 2 dicembre 2015 22:10
  • ho messo il breakpoint ma non si ferma

    dal mio form secondario con il drag&drop invece si ferma


    Wacky Teseo

    mercoledì 2 dicembre 2015 22:17
  • ho messo il breakpoint ma non si ferma

    dal mio form secondario con il drag&drop invece si ferma


    Wacky Teseo


    E se trascini del testo da qualche altro programma funziona?
    mercoledì 2 dicembre 2015 22:22
  • NO

    se seleziono parte del testo di questo thread e lo trascino , ha lo stesso comportamento del software esterno


    Wacky Teseo

    mercoledì 2 dicembre 2015 22:27
  • NO

    se seleziono parte del testo di questo thread e lo trascino , ha lo stesso comportamento del software esterno


    Wacky Teseo

    Allora stai facendo qualcosa che non va, perchè questo funziona tranquillamente:

            void Form1_DragEnter(object sender, DragEventArgs e)
            {
                Console.WriteLine(e.Data.GetDataPresent(DataFormats.Text).ToString());
            }

    Se trascino del testo mi dà true, se trascino un'icona mi dà false.

    mercoledì 2 dicembre 2015 22:46
  • partendo da zero

     public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            void Form_DragEnter(object sender, DragEventArgs e)
            {
              MessageBox.Show (e.Data.GetDataPresent(DataFormats.Text ).ToString());
            }
    
            void Form_DragDrop(object sender, DragEventArgs e)
            {
            }
    
            private void Form1_DragOver(object sender, DragEventArgs e)
            {
                e.Effect = DragDropEffects.Move;
            }
        }

    per provare dove sbaglio

    manca qualcosa ?


    Wacky Teseo

    mercoledì 2 dicembre 2015 22:53
  • public Form1() { InitializeComponent();

    AllowDrop = true; DragEnter += new DragEventHandler(Form1_DragEnter); DragDrop += new DragEventHandler(Form1_DragDrop); } void Form1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.Text)) e.Effect = DragDropEffects.Copy; } void Form1_DragDrop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.Text)) Text = (string)e.Data.GetData(DataFormats.Text); }


    mercoledì 2 dicembre 2015 23:02
  • niente

    non riesco a capire , copio il tuo codice pari pari

    trascino il testo da qui e continua a darmi il segnale di divieto quando vado sul form col Drag&drop


    Wacky Teseo

    mercoledì 2 dicembre 2015 23:10
  • niente

    non riesco a capire , copio il tuo codice pari pari

    trascino il testo da qui e continua a darmi il segnale di divieto quando vado sul form col Drag&drop


    Wacky Teseo


    Lo copio io pari pari e funziona. Forse hai problemi con UIPI.
    mercoledì 2 dicembre 2015 23:16
  • ok , provo a capire se è quello , domani non ci sarò , quindi faccio le prove dopo domani

    Grazie come sempre


    Wacky Teseo

    mercoledì 2 dicembre 2015 23:21
  • Come sempre sei di grande aiuto , ho abbassato tutti i livelli di UAC e la copia del testo da qui funziona , mettendo anche il MessageBox.Show(e.Data.GetDataPresent(DataFormats.Text).ToString());

    mi restituisce "true"

    trascinando il controllo dell'applicazione esterna , mentre prima mi dava il segno di divieto , ora mi da una x con la freccetta e alla messagebox non va

    ora le domande sono due

    1) appurato quindi che è un problema di UAC , ho letto che si può risolvere firmando il software , dato che quando ho concluso il software , la ditta a cui dovrei venderlo metterà la sua "firma" , attualmente però mi ha fatto capire che fino all'accordo commerciale non può firmarlo , dato che non ho mai venduto un software e non so come si fa , devo acquistare per forza un certificato oppure c'è una soluzione più economica ?

    2) a questo punto avendo avuto la x e non il messaggio , mi devo fermare oppure ho qualche possibilità di fare altre prove ?


    Wacky Teseo

    giovedì 3 dicembre 2015 07:33
  • -- piccolo aggiornamento

    dopo aver abbassato la UAC e mettendo e.Effect = DragDropEffects.All ; // .copy

    a All al posto di copy ottengo un "+" e non una x e i valori di DragEventArgs e sono


    Wacky Teseo

    giovedì 3 dicembre 2015 07:50
  • Se hanno detto che mettono la loro firma, perchè ti stai facendo il problema di ottenere un certificato? Se hai il dubbio che ti faranno pagare anche il certificato, chieglielo esplicitamente.

    giovedì 3 dicembre 2015 08:50
  • Se hanno detto che mettono la loro firma, perchè ti stai facendo il problema di ottenere un certificato? Se hai il dubbio che ti faranno pagare anche il certificato, chieglielo esplicitamente.


    no , era solo per non essere vincolato nello sviluppo e per andare avanti da solo fino all'accordo , senza avere problemi tipo questo della UAC

    Wacky Teseo

    giovedì 3 dicembre 2015 09:00

  • no , era solo per non essere vincolato nello sviluppo e per andare avanti da solo fino all'accordo , senza avere problemi tipo questo della UAC

    Wacky Teseo

    Ti puoi creare un certificarto per la fase di sviluppo:

    http://www.digitallycreated.net/Blog/38/using-makecert-to-create-certificates-for-development

    leggi anche quando dice "Note that this opens up a security hole on your PC... "

    giovedì 3 dicembre 2015 09:08
  • Grazie Mille

    per il punto 2

    mi devo fermare oppure ho qualche possibilità di fare altre prove ?


    Wacky Teseo

    giovedì 3 dicembre 2015 09:12

  • per il punto 2

    mi devo fermare oppure ho qualche possibilità di fare altre prove ?


    Wacky Teseo

    Hai detto che adesso ti dà il "+" al posto della "x"
    giovedì 3 dicembre 2015 09:28
  • si , mi da il + però mettendo     e.Effect = DragDropEffects.All ;

    al posto di copy

    però

    qui

    void Form1_DragDrop(object sender, DragEventArgs e)
            {
                  if (e.Data.GetDataPresent(DataFormats.Text))
                {
                    Text = (string)e.Data.GetData(DataFormats.Text);
                    textBox1.Text = Text;
                    MessageBox.Show(e.Data.GetDataPresent(DataFormats.Text).ToString());
                }
            }

    nel messagebox non va

    perchè non sarà solo testo

    c'è la possibilità di vedere che formato è , tra i formati conosciuti ?


    Wacky Teseo

    giovedì 3 dicembre 2015 09:48
  • nel messagebox non va

    perchè non sarà solo testo

    c'è la possibilità di vedere che formato è , tra i formati conosciuti ?


    Wacky Teseo

    Nell'If provali uno per uno.

    giovedì 3 dicembre 2015 10:13
  •  void Form1_DragDrop(object sender, DragEventArgs e)
            {
              //  MessageBox.Show(e.Data.GetDataPresent(DataFormats.GetFormat(DataFormats.UnicodeText)));
                if (e.Data.GetDataPresent(DataFormats.Bitmap)) MessageBox.Show("1");
                if (e.Data.GetDataPresent(DataFormats.CommaSeparatedValue )) MessageBox.Show("2");
                if (e.Data.GetDataPresent(DataFormats.Dib )) MessageBox.Show("3");
                if (e.Data.GetDataPresent(DataFormats.Dif )) MessageBox.Show("4");
                if (e.Data.GetDataPresent(DataFormats.EnhancedMetafile )) MessageBox.Show("5");
                if (e.Data.GetDataPresent(DataFormats.FileDrop )) MessageBox.Show("6");
                if (e.Data.GetDataPresent(DataFormats.Html )) MessageBox.Show("7");
                if (e.Data.GetDataPresent(DataFormats.Locale )) MessageBox.Show("8");
                if (e.Data.GetDataPresent(DataFormats.MetafilePict )) MessageBox.Show("9");
                if (e.Data.GetDataPresent(DataFormats.OemText )) MessageBox.Show("10");
                if (e.Data.GetDataPresent(DataFormats.Palette )) MessageBox.Show("11");
                if (e.Data.GetDataPresent(DataFormats.PenData )) MessageBox.Show("12");
                if (e.Data.GetDataPresent(DataFormats.Riff )) MessageBox.Show("13");
                if (e.Data.GetDataPresent(DataFormats.Rtf )) MessageBox.Show("14");
                if (e.Data.GetDataPresent(DataFormats.Serializable )) MessageBox.Show("15");
                if (e.Data.GetDataPresent(DataFormats.StringFormat)) MessageBox.Show("16");
                if (e.Data.GetDataPresent(DataFormats.SymbolicLink )) MessageBox.Show("17");
                if (e.Data.GetDataPresent(DataFormats.Text )) MessageBox.Show("18");
                if (e.Data.GetDataPresent(DataFormats.Tiff )) MessageBox.Show("19");
                if (e.Data.GetDataPresent(DataFormats.UnicodeText )) MessageBox.Show("20");
                if (e.Data.GetDataPresent(DataFormats.WaveAudio )) MessageBox.Show("21");
               
            }
    se più o meno è quello che mi hai suggerito purtroppo non si è fermato in nessuno di questi

    Wacky Teseo

    venerdì 4 dicembre 2015 12:50
  • Potrebbe essere qualche altro formato non supportato da .net. Per supportare altri formati c'è questo esempio:

    http://blogs.msdn.com/b/adamroot/archive/2008/02/19/shell-style-drag-and-drop-in-net-wpf-and-winforms.aspx

    Però, potrebbe essere che anche se riuscissi ad avere il drop, poi non sapresti come usare quei dati. Immagina se il formato trasportato è un oggetto ed il testo che vedi è soltanto una proprietà di quell'oggetto. Dovresti conoscere la struttura dell'oggetto.

    Tra l'altro controlla nella licenza del programma target, se è consentito usare il programma dall'esterno nel modo in cui vuoi fare.



    • Modificato BlueLed venerdì 4 dicembre 2015 14:34
    • Contrassegnato come risposta Wacky Teseo domenica 6 dicembre 2015 07:16
    venerdì 4 dicembre 2015 14:32
  • il software esterno è scritto in c++2012

    il drag & drop verso un altra applicazione è consentita in quanto esiste un plug-in esterno che lo utilizza a me basterebbe anche intercettare solo il nome , poi risalgo alle caratteristiche dell'oggetto , in quanto le leggo precedentemente con il thread , che mi aiutasti a realizzare , non so se ti ricordi

    https://social.msdn.microsoft.com/Forums/it-IT/89852baa-5e5c-4ec3-a711-b3c62c021e1b/leggere-la-memoria-con-processmemory?forum=visualcsharpit


    Wacky Teseo

    sabato 5 dicembre 2015 05:56
  • sto dando una occhiata al link che mi hai mandato sopra ,

    devo dargli

    e vedo che lanciando il progetto DragDropSample , trascinando l'oggetto che mi interessa , vedo il "+" e il nome dell'oggetto ,questo è un passo avanti , però lasciando il mouse poi non vedo nulla , devo capire dove prelevare il nome dell'oggetto trascinato


    Wacky Teseo

    sabato 5 dicembre 2015 06:15
  • sto dando una occhiata al link che mi hai mandato sopra ,

    devo dargli

    e vedo che lanciando il progetto DragDropSample , trascinando l'oggetto che mi interessa , vedo il "+" e il nome dell'oggetto ,questo è un passo avanti , però lasciando il mouse poi non vedo nulla , devo capire dove prelevare il nome dell'oggetto trascinato


    Wacky Teseo

    Perchè non contatti l'autore del software e gli chiedi informazioni? Se ha fatto un formato personalizzato, i dettagli li sa solo lui. Al limite gli chiedi anche se c'è un modo previsto per fare quello che vuoi realizzare e ti dirà anche se è lecito.

    sabato 5 dicembre 2015 08:28
  • Ci proverò , anche se credo che non mi calcoleranno neanche Il fatto che sia lecito credo di si , se vengono rilasciati plugin credo che per loro sia un valore aggiunto Ma da quell oggetto trascinato è difficile risalire all handle?

    Wacky Teseo

    sabato 5 dicembre 2015 08:35
  • Ci proverò , anche se credo che non mi calcoleranno neanche Il fatto che sia lecito credo di si , se vengono rilasciati plugin credo che per loro sia un valore aggiunto Ma da quell oggetto trascinato è difficile risalire all handle?

    Wacky Teseo

    Come al solito devi sapere il formato. Questi sono altri formati:

    https://msdn.microsoft.com/en-us/library/windows/desktop/bb776902%28v=vs.85%29.aspx

    Se stai facendo dei plugin per quel programma, ci deve essere una documentazione che spiega come realizzarli.

    sabato 5 dicembre 2015 09:01
  • Grazie BlueLed , sempre preciso e di Grande Aiuto

    Wacky Teseo

    domenica 6 dicembre 2015 07:15