Laden...

GUI : Drag&Drop Source-Lokalisierung

Erstellt von Kingkook vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.800 Views
K
Kingkook Themenstarter:in
69 Beiträge seit 2011
vor 11 Jahren
GUI : Drag&Drop Source-Lokalisierung

Liebe Com,

ich habe ein DataGrid, welches Drag and Drop für Texte unterstützt.Dieser Text soll der gedropped wird, kommt aus einer .txt-Datei, welche zB mit Notepad++ geöffnet ist( da dieser dragging unterstützt).Wenn ich diesen Text jetzt in mein Datagrid droppe, würde ich dort gern herausfinen können, aus welcher Datei der Text eigentlich kommt, oder wenigstens von welcher Anwendung.Gibt es irgendwelche Möglichkeiten über die DragEventArgs an solche Infos zu kommen?

Gruß Kooki

5.658 Beiträge seit 2006
vor 11 Jahren

Hi Kingkook,

welche Werte haben denn die DragEventArgs.Source- bzw. DragEventArgs.OriginalSource-Properties in deinem Fall?

Christian

Weeks of programming can save you hours of planning

K
Kingkook Themenstarter:in
69 Beiträge seit 2011
vor 11 Jahren

e.Sourcegibt mir Infos über das DataGrid in das ich den Text droppe :

e.Source
{System.Windows.Controls.DataGrid Items.Count:0}

e.OriginalSource gibt diese Infos :

e.OriginalSource
{System.Windows.Controls.ScrollViewer}
    base {System.Windows.Controls.ContentControl}: {System.Windows.Controls.ScrollViewer}
    CanContentScroll: true
    ComputedHorizontalScrollBarVisibility: Collapsed
    ComputedVerticalScrollBarVisibility: Collapsed
    ContentHorizontalOffset: 0.0
    ContentVerticalOffset: 0.0
    ExtentHeight: 0.0
    ExtentWidth: 0.0
    HorizontalOffset: 0.0
    HorizontalScrollBarVisibility: Auto
    IsDeferredScrollingEnabled: false
    PanningDeceleration: 0.001
    PanningMode: Both
    PanningRatio: 1.0
    ScrollableHeight: 0.0
    ScrollableWidth: 0.0
    VerticalOffset: 0.0
    VerticalScrollBarVisibility: Auto
    ViewportHeight: 0.0
    ViewportWidth: 651.0

Gruß Kooki

C
1.214 Beiträge seit 2006
vor 11 Jahren

Aus welcher Datei der Text ursprünglich kommt, kriegst du sicher nicht raus.
Aus welchem Programm... Vielleicht. Stell ich mir aber auch nicht so einfach vor. Es ist ja schon auf COM Ebene nicht vorgesehen, zumindest kenne ich keine Möglichkeit, das direkt rauszubekommen. Man könnte höchstes versuchen rauszufinden, in welchem Prozess das COM Objekt ursrpünglich erstellt wurde, das ist aber nicht einfach, falls überhaupt möglich.

Falls aber doch jemand wider Erwarten eine Antwort darauf kennt, würde es mich auch interessieren.

K
Kingkook Themenstarter:in
69 Beiträge seit 2011
vor 11 Jahren

Ich habe auch befürchtet, dass es nicht möglich ist, auch wenn ich immernoch der Meinung bin, dass es theoretisch eigentlich kein Ding der unmöglichkeit sein sollte. Helfen würde jetzt jemand, der sich gfoidl's Signatur

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!" zu Herzen nehmen würde...

A
7 Beiträge seit 2012
vor 11 Jahren

Wenn der Text nicht aus notepad++, sondern aus einer Textdatei gedropt wird könntest du so den Dateinamen ausgeben (aber das weißt du vermutlich)

private void MyTextBox_PreviewDragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop, true) == true)
            {
                string[] filenames = (string[])e.Data.GetData(DataFormats.FileDrop, true);
                foreach (string filename in filenames)
                {
                    if (File.Exists(filename))
                    {
                        MessageBox.Show("File dropped: " + filename);
                    }
                }
            }
        }

Sollte es wirklich immer über notepad++ eingefügt werden wäre die einzige Möglichkeit, die mir noch einfallen würde mit der WinAPI zu arbeiten und die benötigten Informationen direkt aus dem fremden Fenster bzw. der fremden Anwendung zu ziehen.

C
1.214 Beiträge seit 2006
vor 11 Jahren

Sollte es wirklich immer über notepad++ eingefügt werden wäre die einzige Möglichkeit, die mir noch einfallen würde mit der WinAPI zu arbeiten und die benötigten Informationen direkt aus dem fremden Fenster bzw. der fremden Anwendung zu ziehen.

Ich habe doch schon gesagt, dass selbst das meines Wissens nicht möglich ist.

A
7 Beiträge seit 2012
vor 11 Jahren

Warum nicht?
Meines Wissens nach läuft immer nur eine Instanz von notepad++, das Fenster ist also leicht zu finden.
Sollte also aus dieser Anwendung gedropt werden müsste man den aktiven Tab suchen und im Speicher muss noch die zugehörige Datei hinterlegt sein.
Ob der Aufwand mit dem Ertrag in einem gesunden Verhältnis steht ist eine andere Frage...

C
1.214 Beiträge seit 2006
vor 11 Jahren

Es geht doch nicht um Notepad++, das war nur ein Beispiel. Und selbst wenn man nur Notepad++ betrachtet, kannst du nicht wissen, dass die Drag Operation tatsächlich von Notepad++ kommt. Es geht eben darum, dass du bei Drag&Drop nicht rausfinden kannst, aus welchem Programm die Operation angestartet wurde und schon gar keine generelle Möglichkeit zu sagen, aus welcher Datei der Text ursprünglich kommt.

A
7 Beiträge seit 2012
vor 11 Jahren

Du kennst doch die Anwendung garnicht, vielleicht ist es eine spezielle Lösung in der eben vorgesehen ist, dass notepad++ verwendet wird.
Und ob der Text aus eben diesem notepad++ kommt kann schon zumindest mit ziemlicher Sicherheit bestimmt werden, einfach den gedropten Text mit dem im aktiven Tab von notepad++ vergleichen.
Alternativ könnte man das letzte aktive Fenster protokollieren, handelt es sich bei eben diesem um notepad++ weiß man, dass aus diesem gedropt wurde.
Das Ganze ist natürlich ein workaround und der Aufwand steht mit dem Nutzen für die meisten Anwendungen vermutlich in einem schlechten Verhältnis.

Dazu sei noch gesagt: Falls es sich wirklich um eine Lösung handelt in der ausschließlich Kompatibilität mit notepad++ hergestelltwerden soll, könnte man auch darüber nachdenken ein Plugin zu schreiben.

Ich denke wir können uns darauf einigen, dass dieser ganze Aufwand nötig ist, weil die benötigten Informationen beim droppen eben nicht übergeben werden und nur auf Umwegen beschafft werden können. 😉

C
1.214 Beiträge seit 2006
vor 11 Jahren

Das interessiert mich doch alles überhaupt nicht. Mal davon abgesehen, dass ich sehr stark bezweifle, dass es irgendeine Anwendung gibt, die diese Informationen über eine Schnittstelle zur Verfügung stellt, würde mich diese eine konkrete Anwendung überhaupt nicht interessieren.
Mir geht es ganz allgemein um die Lösung, ob es möglich ist, bei Drag&Drop die Ausgangsanwendung zu bestimmen. Ohne irgendwelche Sonderfälle und Speziallösungen. Und das geht meines Wissens nicht.