Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von 123thomas
Thema: Button zur Laufzeit erstellt wie abfragen ob click ereigniss
Am im Forum: GUI: Windows-Forms

Hallo,

du musst zu dem Button ein Klick-Event hinzufügen. z.B. mit dem Namen Button_Click(object sender).

Damit kannst du jeden Button deiner Form dieses Klickevent zuweisen. Dann kannst du mit einer Switch Anweisung auf dem Namen des senders, den Button herausfinden, welcher den Klick ausgelöst hat.

Gruß

Thema: Wie kann ich ein VBA Skript in C# migrieren?
Am im Forum: Grundlagen von C#

Hallo Tommylik,

da bist du leider auf der falschen Fährte. Das was du da gefunden hast ist scheinbar eine Entwicklungsumgebung, damit du dir Plugins in das Tool Zenon einbauen kannst.

Ich mein rein theoretisch kann man sich darüber einen Plugin bauen, welches dann die Schnittstelle herstellt zu dem Container. Aber dies wäre oversized. Daher musst du in der Richtung nochmal weitersuchen. API oder Interface oder ähnliches.

Bist du dir denn sicher, dass das Tool eine Schnittstelle zu C# bereit stellt? Oder bist du einfach mal mit C# angefangen?

Thema: Wie kann ich ein VBA Skript in C# migrieren?
Am im Forum: Grundlagen von C#

Zitat von Tommylik
Ich denke das Zenon RT die Schnittstelle ist. Im Zenon Editor wurden die Variablen
angelegt die dann durch den Onlinecontainer an VBA übergeben werden.

Korrekt, dass denke ich auch. Und du musst ja nun auf den Onlinecontainer mit C# zugreifen. Und diese Schnittstelle kenne ich nicht. Da musst du dich informieren.

Google doch mal nach API von Zenon.

Thema: Wie kann ich ein VBA Skript in C# migrieren?
Am im Forum: Grundlagen von C#

Hallo Tommylik,

vielen Dank dafür.

So wie ich das sehe werden die Variablen "PDE_PraegeCode" "PDE_FolderName" "PDE_CreateFolder" "PDE_NoFolder" "PDE_NoFile" "PDE_FileCopy" in der VISU benutzt, d.h. du musst ja eine Schnittstelle zwischen der S7 und C# aufbauen, um diese auszutauschen. Ist eine Schnittstelle in deinem Programm schon vorhanden?

Thema: Wie kann ich ein VBA Skript in C# migrieren?
Am im Forum: Grundlagen von C#

Hallo Tommylik,

dass kann man nicht ohne Hintergrundwissen umschreiben.

Da die mit plus eingerahmten Zeilen eine Änderung in S7 (Vermutlich Tia Portal) ist. Es verändert deine S7 Variablen.

Die beiden Variablen:
PDE_CreateFolder wird auf 0 gesetzt
PDE_NoFolder wird auf 1 gesetzt

d.h. du musst uns zeigen, wie du die oben genannten Variablen aus Tia Portal im Programm integriert hast.

Wenn Tia Portal komplett aus der Aktion fällt würde man dies vermutlich komplett wegfallen lassen, da man über if Abfragen raus bekommt, ob der Ordner vorhanden ist.

Gruß Thomas

Thema: Wie beim Start des programms eine Liste erstellen, auf die ich immer zugreifen kann?
Am im Forum: Grundlagen von C#

Hallo,

bei deiner Methode Pw erzeugst du in der ersten Zeile eine neue leere Liste. Diese Leere Liste kann nichts enthalten.

Du musst also die Liste mit dem Hinzugefügten Mitarbeiter übergeben oder diese in deiner Klasse als Variable initialisieren und dann mit Hinzufügen und Suchen auf diese EINE Liste zugreifen.

Gruß

Thema: Pfad einstellen (bei Datei einlesen) - Einstelldatei
Am im Forum: Grundlagen von C#

Hallo,

datei Pfade auswählen zu lassen geht über den OpenFileDialog.
Einfach nach "C# OpenFileDialog" googeln.

Thema: Überwachen des Fortschritts von Robocopy - wie?
Am im Forum: Rund um die Programmierung

Zitat von Rico913

 
                DateiAnzahl_Ziel += DiInfo.GetFiles().Length;               

Warum der Progressbalken zu schnell vollläuft liegt vermutlich an der oben genannten Zeile. Du Summierst bei jedem "Tick" die Dateien im Zielverzeichnis auf.

Besipiel:
Tick| Reale Dateien im Zielverzeichnis|Dateien in Zielverzeichnis nach deiner Berechnung
1|2|2
2|2|4 <-- obwohl keine Datei hinzugekommen ist, addierst du nochmal 2 hinzu.
3|3|7

Gruß Thomas

Thema: Wie kann ich Objekte in Comboboxen mit anderen Objekten vergleichen?
Am im Forum: Grundlagen von C#

Hallo,

ich würde sobald ein Objekt in einer Combobox ausgewählt wird, dies zusätzlich in eine Liste List<DeineKlasse> packen.

Wenn nun das zweite Objekt in der zweiten Combobox ausgewählt wird, wird die gesamte Liste durchlaufen, ob das Objekt, oder die Artikelkategorie, schon vorhanden ist.

Versuch es doch mal und dann geben wir die Tipps wie du es noch verbessern kannst

Thema: Wie kann ich Text in einer TextBox anzeigen?
Am im Forum: GUI: Windows-Forms

Zitat von Abt
Invoke ist kein Problem. Die Referenz der UI in der Logik ist das Problem.

Stimmt natürlich, bei seinem aktuellen Problem.
Aber spätestens mit einem Task oder Thread o.ä. wird er dann auf das Problem stoßen.

Thema: Wie kann ich Text in einer TextBox anzeigen?
Am im Forum: GUI: Windows-Forms

Genau und da gibt es zwei Hauptmöglichkeiten:

1. Die Instanz der Form holen und dann anzeigen lassen (hier gibt es aber mehrere Probleme: Stichwort Invoke)
2. Die Logik schmeist ein Event, welches bei der Form angemeldet ist

Die Lösung zwei ist die Lösung die am wenigsten Probleme bereitet.

Gruß Thomas

Thema: Wie Objekte mit einem Index zu versehen und abrufen?
Am im Forum: Grundlagen von C#

Nochmal eben als Anmerkung, dass dein Code oben auch noch weitere Fehler enthält.

Du erstellst zwar 4 Fahrräder aber überschreibst immer die Eigenschaften des Fahrrad1.

Thema: Menüleiste für Forms
Am im Forum: GUI: Windows-Forms

Hallo tristar,

du kannst du die Menüleiste einmal erstellen und dann die Instanz des Objektes weiterreichen.

Gruß Thomas

Thema: Kann Form in der Größe dynamisch geändert werden?
Am im Forum: GUI: Windows-Forms

Hallo tristar,

das Wort was du suchst ist Anchor. Mit der Eigenschaft kannst du bestimmt, wie sich das Control verändert, wenn sich die Größe der Form ändert. Allerdings kann es bei komplexen Sachen auch dazu kommen, dass man die Größe selber berechnen und setzen muss.

Control.Anchor

Gruß
Thomas

Thema: Mit Mausklick an dieser Stelle der Form eine Combo Box erstellen und aufklappen lassen?
Am im Forum: Grundlagen von C#

Hallo Tommylik,

ich kenne dein Lebenslauf, ich habe ähnlich angefangen.

Bitte gehe weg von dem Static. Da man dies nicht testen kann. Ich habe dir mal 2 Beispiele gemacht, einmal alles in einer Klasse und einmal so wie du es vor hattest die Liste der ComboBoxen in eine zweite Klasse auszulagern, aber ohne Static.

Sieht alles viel aus, aber ist im Prinzip fast das gleiche.

Beispiel 1:

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 WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        //Leere Liste erzeugen in der ComboBoxen abgelegt werden können(Damit diese später gehändelt werden können)
        private List<ComboBox> listComboBox = new List<ComboBox>();

        //Zählvariable um die ComboBoxen zu identifizieren zu können
        private int idComboBox = 0;

        public Form1()
        {
            //Steuerelemente die im Designer angelegt wurden erzeugen und anzeigen
            InitializeComponent();
        }

        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                //Leere Combobox erzeugen
                ComboBox comboBox = CreateComboBox(e.X, e.Y);
                //Steuerelment zu der Form hinzufügen
                Controls.Add(comboBox);
            }

            if(e.Button == MouseButtons.Left)
            {
                //ComboBox mit Einträge erzeugen
                ComboBox comboBox = CreateComboBoxWithItems(e.X, e.Y);
                //Steuerelment zu der Form hinzufügen
                Controls.Add(comboBox);
            }
        }

        private ComboBox CreateComboBox(int x, int y)
        {
            //Grundeigenschften festlegen
            ComboBox comboBox = new ComboBox();
            comboBox.FormattingEnabled = true;
            comboBox.Location = new System.Drawing.Point(x, y);
            comboBox.Name = "comboBox" + idComboBox;
            comboBox.Size = new System.Drawing.Size(121, 21);
            comboBox.TabIndex = idComboBox;

            //Event erzeugen, was beim auswählen eines Items passiert
            comboBox.SelectedIndexChanged += ComboBox_SelectedIndexChanged;                   

            //ComboBox mit in die Liste aufnehmen
            listComboBox.Add(comboBox);

            //Id erhöhen
            idComboBox++;

            //ComboBox zurück geben
            return comboBox;
        }

        private ComboBox CreateComboBoxWithItems(int x,int y)
        {
            //Erzeuge mit der ersten Methode eine ganz normale Combobox
            ComboBox comboBox = CreateComboBox(x, y);
            //Füge einträge in diese ComboBox ein
            AddDefaultItems(comboBox);
            //Gebe die Combobox zurück
            return comboBox;
        }

        private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Mach was beim Ändern
            //Achtung wird beim Ändern aller Comoboxen aufgerufen
            
            //Combobox Casten
            ComboBox comboBox = (ComboBox)sender;

            //nur bei der zweiten ComboBox ausführen
            if (comboBox.Name.Equals("comboBox1"))
                MessageBox.Show("Glückwunsch, Sie haben die ComboBox 2 erwischt (index 1)","Glückwunsch");

            //Ausgabe der Änderung, als Beispiel was man alles für Daten bei dem Event abgreifen kann
            MessageBox.Show("SelectedIndexChanged von " + comboBox.Name + " auf index: " + comboBox.SelectedIndex.ToString() + "(" + comboBox.Items[comboBox.SelectedIndex].ToString() + ")", "Info");
        }

        private void AddDefaultItems(ComboBox comboBox)
        {
            //Füge Einträge auf die referenzierte ComboBox ein
            comboBox.Items.Add("Eintrag1");
            comboBox.Items.Add("Eintrag2");
            comboBox.Items.Add("Eintrag3");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Lösche alle Comboboxen beim Klick auf Button 1

            //Gehe alle Elemente aus der Liste:listComboBox durch
            foreach(ComboBox comboBox in listComboBox)
            {
                //lösche die aktuelle ComBoBox von der Form
                Controls.Remove(comboBox);
            }

            //setzte die ID zurück
            idComboBox = 0;
        }
    }
}

Beispiel 2:

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 WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private InhaltList inhaltList;

        public Form1()
        {
            //Steuerelemente die im Designer angelegt wurden erzeugen und anzeigen
            InitializeComponent();

            //Liste erzeugen mit STartindex 10
            inhaltList = new InhaltList(10);
        }

        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                //Leere Combobox erzeugen
                ComboBox comboBox = inhaltList.CreateComboBox(e.X, e.Y);
                //Steuerelment zu der Form hinzufügen
                Controls.Add(comboBox);
            }

            if(e.Button == MouseButtons.Left)
            {
                //ComboBox mit Einträge erzeugen
                ComboBox comboBox = inhaltList.CreateComboBoxWithItems(e.X, e.Y);
                //Steuerelment zu der Form hinzufügen
                Controls.Add(comboBox);
            }
        }             


        private void button1_Click(object sender, EventArgs e)
        {
            //Lösche alle Comboboxen beim Klick auf Button 1

            //Gehe alle Elemente aus der Liste:listComboBox durch
            foreach(ComboBox comboBox in inhaltList.GetAllComboBox())
            {
                //lösche die aktuelle ComBoBox von der Form
                Controls.Remove(comboBox);
            }

            //setzte die ID zurück (Achtung, wenn vorher der Startindex bei 10 war, dann ist nach dem Löschen der Index wieder bei 0)
            inhaltList.IdComboBox = 0;
        }
    }

    public class InhaltList
    {
        //Leere Liste erzeugen in der ComboBoxen abgelegt werden können(Damit diese später gehändelt werden können)
        private List<ComboBox> listComboBox = new List<ComboBox>();

        //Zählvariable um die ComboBoxen zu identifizieren zu können
        private int idComboBox = 0;
        //Property, welches eine referenz von idComboBox setzt und liest
        public int IdComboBox { get => idComboBox; set => idComboBox = value; }

        //Konstruktor
        public InhaltList()
        {
            //hier muss nichts gemacht werden. Es sei denn man möchte was übergeben
        }

        public InhaltList(int startIndexListe)
        {
            //möglich wäre eine Id Vorzugeben mit der gesartet werden soll.
            this.idComboBox = startIndexListe;
        }

        public ComboBox CreateComboBox(int x, int y)
        {
            //Grundeigenschften festlegen
            ComboBox comboBox = new ComboBox();
            comboBox.FormattingEnabled = true;
            comboBox.Location = new System.Drawing.Point(x, y);
            comboBox.Name = "comboBox" + idComboBox;
            comboBox.Size = new System.Drawing.Size(121, 21);
            comboBox.TabIndex = idComboBox;

            //Event erzeugen, was beim auswählen eines Items passiert
            comboBox.SelectedIndexChanged += ComboBox_SelectedIndexChanged;

            //ComboBox mit in die Liste aufnehmen
            listComboBox.Add(comboBox);

            //Id erhöhen
            idComboBox++;

            //ComboBox zurück geben
            return comboBox;
        }

        public ComboBox CreateComboBoxWithItems(int x, int y)
        {
            //Erzeuge mit der ersten Methode eine ganz normale Combobox
            ComboBox comboBox = CreateComboBox(x, y);
            //Füge einträge in diese ComboBox ein
            AddDefaultItems(comboBox);
            //Gebe die Combobox zurück
            return comboBox;
        }

        public void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Mach was beim Ändern
            //Achtung wird beim Ändern aller Comoboxen aufgerufen

            //Combobox Casten
            ComboBox comboBox = (ComboBox)sender;

            //nur bei der zweiten ComboBox ausführen
            if (comboBox.Name.Equals("comboBox1"))
                MessageBox.Show("Glückwunsch, Sie haben die ComboBox 2 erwischt (index 1)", "Glückwunsch");

            //Ausgabe der Änderung, als Beispiel was man alles für Daten bei dem Event abgreifen kann
            MessageBox.Show("SelectedIndexChanged von " + comboBox.Name + " auf index: " + comboBox.SelectedIndex.ToString() + "(" + comboBox.Items[comboBox.SelectedIndex].ToString() + ")", "Info");
        }

        public void AddDefaultItems(ComboBox comboBox)
        {
            //Füge Einträge auf die referenzierte ComboBox ein
            comboBox.Items.Add("Eintrag1");
            comboBox.Items.Add("Eintrag2");
            comboBox.Items.Add("Eintrag3");
        }

        public List<ComboBox> GetAllComboBox()
        {
            return this.listComboBox;
        }
    }
}

Gruß Thomas

Thema: Nur erste Reihe eines 2D-Arrays auslesen
Am im Forum: Grundlagen von C#

Hallo,

es gibt mehrere Wege nach Rom. :-P

Also wenn das 2D Array sich nicht verändert einfach mit einer for Schleife arbeiten. Wenn sich die Anzahl der Werte später ändern kann, dann würde ich mir das benötigte Array aus dem 2D Array holen und mit foreach ausgeben.

Gruß Thomas

Thema: Variablen-Zuweisungsfehler nicht nachvollziehbar
Am im Forum: Grundlagen von C#

Hallo,

beide Variablen sind nicht zugewiesen, nur hört der Compiler nach der ersten Anweisung in der Zeile auf.

a = parts[0]; //Zuweisung der Variable a

Da man nicht ganz genau sehen kann, ob a jetzt ein Array ist oder eine normal String Variable tippe ich mal auf eine String Variable.

D.h. das sowohl a[0] und auch b[0] nicht zugewiesen sind, da dies ja keine Arrays sind.

P.S. bitte den Code nicht als Bild sonder in den Code Tags Posten

Thema: Nach Erstellen eines Setups zeigt Form nur das Defaulticon in der Taskbar
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo,

in dem Setup Project musst du das Icon auch noch auswählen.

Gehe dazu in dem Prohjektmappen-Explorer auf dein Setup Projekt ( Auf dem Hauptpunkt)
Dann erscheinen unten die Eigenschaften
Dort ist ein Punkt: "AddRemoveProgrammIcon" dort muss auch das Programm Icon ausgewählt werden

Gruß Thomas

Thema: Nach gesendetem Befehl antwortet Arduino mit Begriff, der eine Dauerschleife auslöst
Am im Forum: Grundlagen von C#

Hallo,

du sendest ja in der DisplayTxt immer direkt den nächsten Befehl an die Serielle Schnittstelle. Wenn der Arduino immer auf einen Befehl antwortet ist es korrekt, das es in einer Dauerschleife endet.

Gruß
Thomas

Thema: Mehrere Windows Forms aus einer Klasse laden
Am im Forum: GUI: Windows-Forms

Hallo,

ich habe das Schnipsel mal um den Namen der Form erweitert.

int counter = 1;
foreach(var entry in data)
{
    var serverForm = new MonitorForm();
    serverForm.LoadServerData(entry);
    serverForm.TopLevel = false;
    serverForm.Name = "monitoringPanel "+counter;
    serverForm.Text = "monitoringPanel "+counter;
    monitoringPanel.Add(serverForm);
    serverForm.Show();
    counter++;
}

Thema: Simconnect.dll in Sharpdevelop laden funktioniert nicht wegen falschem Format
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hast du dann die Konfiguration auf 64 bit konfiguriert?

Gruß

Thema: Int/Double Fehler bei Formelberechnung
Am im Forum: GUI: Windows-Forms

Bei einem Double muss das Komma durch ein Punkt ersetzt werden.

Gruß Thomas

Thema: Senden über SerialPort funktioniert nur nach ButtonClick, nicht nach Methodenaufruf
Am im Forum: Grundlagen von C#

Hallo,

was wird den in "Verbunden();" ausgeführt?

Thema: Mehrere ComPorts in einem Programm verwenden
Am im Forum: Grundlagen von C#

Hallo,

ich habe gerade mal geschaut was dein Problem ist:

  1. Du hast try, catch nicht verstanden
  2. Du öffnest immer COM1
  3. Wie meine Vorredner schon sagten, fehlt dir die Objektorientierte Programmierung


zu 1:


try
{
  //hier wird Code ausgeführt

 //wenn hier am Ende angekommen ist, dann ist alles gut verlaufen
}
catch ( Exception ex)
{
  //kommt er in den catch, dann wurde der try Block nicht bis zu Ende ausgeführt und es wurde ein Fehler ausgelöst.
 //daher sollte hier der Fehler abgefangen (ex.Message) und dem Benutzer wie auch immer angezeigt werden
}


zu 2:
Man kann zwar in der ComboBox ein Com Port auswählen, allerdings wird der COM Port nicht dem SerialPort zugewiesen

zu 3:
Erstelle eine Klasse für den SerialPort und implementiere nur die Schnittstellen, die du zu dem Serialport benötigst, damit du nicht alles kopierst.

Wenn du im try catch den Fehler abgefangen hättest wäre dir angezeigt worden, dass der COM1 bereits geöffnet ist. Obwohl nirgends der COM1 ausgewählt wurde.

Gruß
Thomas

Thema: Erfassen, welches Object sich gerade im Drag und Drop befindet außerhalb der Form
Am im Forum: GUI: Windows-Forms

Hallo,
ich weiß noch nicht ganz genau was es ist aber:

VS 2017 Fehler des Programms wie oben genannt
VS 2013 Funktioniert

Obwohl ich in den Projekteinstellungen das selbe .Net Framework eingestellt habe.

Danke :-)

Thema: Erfassen, welches Object sich gerade im Drag und Drop befindet außerhalb der Form
Am im Forum: GUI: Windows-Forms

Hallo,

erstmal Vielen Dank für deine Bemühungen und entschuldige das ich jetzt erst an dem Projekt weiter gearbeitet habe.

Ich hab mir dein Beispiel Projekt angesehen. Und die Einstellungen eingestellt. Also auf x64 konfiguriert. Die PID des Explorers erst manuell eingestellt und dann automatisch gesucht. Und NuGet Paket geladen.

Aber in der Zeile:

EasyHook.RemoteHooking.Inject(targetPID, "", injectionLibrary, channelName);

Bekomme ich die Fehlermeldung:
Fehler
System.ApplicationException
HResult=0x80131600
Nachricht = STATUS_INTERNAL_ERROR: Unknown error in injected C++ completion routine. (Code: 15)
Quelle = EasyHook
Stapelüberwachung:
at EasyHook.NativeAPI.Force(Int32 InErrorCode)
at EasyHook.RemoteHooking.InjectEx(Int32 InHostPID, Int32 InTargetPID, Int32 InWakeUpTID, Int32 InNativeOptions, String InLibraryPath_x86, String InLibraryPath_x64, Boolean InCanBypassWOW64, Boolean InCanCreateService, Boolean InRequireStrongName, Object[] InPassThruArgs)
at EasyHook.RemoteHooking.Inject(Int32 InTargetPID, String InLibraryPath_x86, String InLibraryPath_x64, Object[] InPassThruArgs)
at GlobalDragHook.Ui.Form1.InjectIntoExplorer() in C:\Users\meyerdt\Downloads\GlobalDragHook\GlobalDragHook\GlobalDragHook.Ui\Form1.cs:line 79
at GlobalDragHook.Ui.Form1..ctor() in C:\Users\meyerdt\Downloads\GlobalDragHook\GlobalDragHook\GlobalDragHook.Ui\Form1.cs:line 24
at GlobalDragHook.Ui.Program.Main() in C:\Users\meyerdt\Downloads\GlobalDragHook\GlobalDragHook\GlobalDragHook.Ui\Program.cs:line 19


Ich habe schon bei den Issus von EasyHook geschaut, allerdings keine Änderung gefunden die noch nicht ind dem Beispiel Projekt umgesetzt war.

Gruß Thomas

Thema: Erfassen, welches Object sich gerade im Drag und Drop befindet außerhalb der Form
Am im Forum: GUI: Windows-Forms

Ich kenne die Regel, nur leider kann ich das nicht anhängen meine Zip wird nicht genommen.
Siehe mein Post.

Wer das Projekt haben möchte soll sich dann bei mir melden.

Form1.cs

using EasyHook;
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Threading;
using System.Windows.Forms;
using IDataObject = System.Runtime.InteropServices.ComTypes.IDataObject;

namespace DoDragDrop
{
    public partial class Form1 : Form, IEntryPoint
    {
        public LocalHook dragDropHook;

        public Form1()
        {
            InitializeComponent();

            panel1.AllowDrop = true;
            label1.Text = "";
            TopMost = true;

            //Maus Hook zumerfassen der linken Maus Taste
            MouseHook.MouseActionLeftDown += MouseHook_MouseActionLeftDown;
            MouseHook.Start();

            //Mit der hWnd des Explorers funktioniert das RegisterDragDrop, aber das Event in der MyDropTarget Klasse wird nicht ausgelöst
            //Explorer Prozess holen
            //Process[] processes = Process.GetProcesses();
            //IntPtr hWnd = this.Handle;
            //foreach (var process in processes)
            //{
            //    if (process.ProcessName.Equals("explorer"))
            //    {
            //        hWnd = process.Handle;
            //    }
            //}

            //Aktuelles Fenster holen
            IntPtr hWnd = this.Handle;

            //Prüfen ob es auch ein Fenster ist
            bool iswindow = IsWindow(hWnd);

            //DragDrop registieren
            HRESULT_TYPEDEF hRESULTRegister = new HRESULT_TYPEDEF(RegisterDragDrop(hWnd, new MyDropTarget()));
            label1.Text += "RegisterDragDrop = " + iswindow + "|" + hRESULTRegister.GetName() + Environment.NewLine;

            //Revoke meldet auch Okay nachdem RegisterDragDrop ausgeführt wurde. Wird erst der Revoke ausgeführt meldet er korrekter Weise, dass noch kein DragDrop registiert ist.
            //HRESULT_TYPEDEF hRESULTRevoke = new HRESULT_TYPEDEF(RevokeDragDrop(hWnd));
            //label1.Text += "RevokeDragDrop = " + iswindow + "|" + hRESULTRevoke.GetName() + Environment.NewLine;


            try
            {
                //DoDragDrop "anmelden"
                dragDropHook = LocalHook.Create(LocalHook.GetProcAddress("Ole32.dll", "DoDragDrop"), new DragDropDelegate(DoDragDropHook), this);

                // Alle Processe "hooken"
                dragDropHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
            }
        }
                

        private void MouseHook_MouseActionLeftDown(object sender, EventArgs e)
        {
            label1.Text += "Maus links Klick" + Environment.NewLine;
        }

        private void panel1_DragEnter(object sender, DragEventArgs e)
        {
            label1.Text += "Drag Enter - Form 1" + Environment.NewLine;
            e.Effect = DragDropEffects.All;
        }
        private void panel1_DragDrop(object sender, DragEventArgs e)
        {
            label1.Text += "DragDrop - Form 1" + Environment.NewLine;
        }

                   
        //DLL's laden bzw. Verweis erstellen
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool IsWindow(IntPtr hWnd);

        [DllImport("ole32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern int RegisterDragDrop(IntPtr hwnd, IOleDropTarget target);

        [DllImport("ole32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern int RevokeDragDrop(IntPtr hwnd);

        [DllImport("Ole32.dll", CharSet = CharSet.Unicode, SetLastError = true, CallingConvention = CallingConvention.StdCall)]
        static extern int DoDragDrop(IDataObject pDataObj, IDropSource pDropSource, uint dwOKEffects, uint[] pdwEffect);

        [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi, SetLastError = true)]
        delegate int DragDropDelegate(IDataObject pDataObj, IDropSource pDropSource, uint dwOKEffects, uint[] pdwEffect);

        [ComImport, Guid("00000121-0000-0000-C000-000000000046"),
        InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        public interface IDropSource
        {
            [PreserveSig]
            uint QueryContinueDrag([MarshalAs(UnmanagedType.Bool)] bool fEscapePressed, uint grfKeyState);

            [PreserveSig]
            uint GiveFeedback(uint dwEffect);
        }


        //DoDragDrop Event
        int DoDragDropHook(IDataObject pDataObj, IDropSource pDropSource, uint dwOKEffects, uint[] pdwEffect)
        {
            //Der BreakPoint wird nie erreicht

            MessageBox.Show("DoDragDropHook");

            //Format abfragen, wenn was kommen würde
            FORMATETC format = new FORMATETC();
            format.cfFormat = (short)DataFormats.GetFormat("FileContents").Id;
            format.dwAspect = DVASPECT.DVASPECT_CONTENT;
            format.lindex = 0;
            format.ptd = new IntPtr(0);
            format.tymed = TYMED.TYMED_HGLOBAL | TYMED.TYMED_ISTREAM | TYMED.TYMED_ISTORAGE;
            STGMEDIUM medium = new STGMEDIUM();
            pDataObj.GetData(ref format, out medium);
            pdwEffect = new uint[] { 0, 0 };
            return 0;
        }
       
    }

    //Interface für die Ereignisse
    [ComImport, Guid("00000122-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IOleDropTarget
    {
        [PreserveSig]
        int OleDragEnter([In, MarshalAs(UnmanagedType.Interface)] object pDataObj, [In, MarshalAs(UnmanagedType.U4)] int grfKeyState, [In, MarshalAs(UnmanagedType.U8)] long pt, [In, Out] ref int pdwEffect);
        [PreserveSig]
        int OleDragOver([In, MarshalAs(UnmanagedType.U4)] int grfKeyState, [In, MarshalAs(UnmanagedType.U8)] long pt, [In, Out] ref int pdwEffect);
        [PreserveSig]
        int OleDragLeave();
        [PreserveSig]
        int OleDrop([In, MarshalAs(UnmanagedType.Interface)] object pDataObj, [In, MarshalAs(UnmanagedType.U4)] int grfKeyState, [In, MarshalAs(UnmanagedType.U8)] long pt, [In, Out] ref int pdwEffect);
    }

    //Klasse die die Ereignisse des Interfaces aussführen sollte
    internal class MyDropTarget : IOleDropTarget
    {

        public int OleDragEnter(object pDataObj, int grfKeyState, long pt, ref int pdwEffect)
        {
            throw new NotImplementedException();
        }

        public int OleDragOver(int grfKeyState, long pt, ref int pdwEffect)
        {
            throw new NotImplementedException();
        }

        public int OleDragLeave()
        {
            throw new NotImplementedException();
        }

        public int OleDrop(object pDataObj, int grfKeyState, long pt, ref int pdwEffect)
        {
            throw new NotImplementedException();
        }
    }

    //Klasse für die Statis des Register und RevokeDragDrop
    public class HRESULT_TYPEDEF
    {
        private int value = 1;
        public HRESULT_TYPEDEF(int value)
        {
            this.value = value;
        }

        public HRESULT_TYPEDEF(string name)
        {
            this.value = GetValue(name);
        }

        public const int DRAGDROP_E_FIRST = -2147221248;
        public const int DRAGDROP_E_NOTREGISTERED = -2147221248;
        public const int DRAGDROP_E_ALREADYREGISTERED = -2147221247;
        public const int DRAGDROP_E_INVALIDHWND = -2147221246;
        public const int DRAGDROP_E_LAST = -2147221233;

        public const int NOERROR = 0;
        public const int S_OK = 0;
        public const int SEC_E_OK = 0;
        public const int S_FALSE = 1;

        public static int GetValue(string name)
        {
            switch (name)
            {
                case "DRAGDROP_E_FIRST":
                    return DRAGDROP_E_FIRST;
                case "DRAGDROP_E_NOTREGISTERED":
                    return DRAGDROP_E_NOTREGISTERED;
                case "DRAGDROP_E_ALREADYREGISTERED":
                    return DRAGDROP_E_ALREADYREGISTERED;
                case "DRAGDROP_E_INVALIDHWND":
                    return DRAGDROP_E_INVALIDHWND;
                case "DRAGDROP_E_LAST":
                    return DRAGDROP_E_LAST;
                case "S_FALSE":
                    return S_FALSE;
                case "S_OK":
                    return S_OK;
                default:
                    return 1;
            }
        }
        public static string GetName(int value)
        {
            switch (value)
            {
                case DRAGDROP_E_NOTREGISTERED:
                    return "DRAGDROP_E_NOTREGISTERED";
                case DRAGDROP_E_ALREADYREGISTERED:
                    return "DRAGDROP_E_ALREADYREGISTERED";
                case DRAGDROP_E_INVALIDHWND:
                    return "DRAGDROP_E_INVALIDHWND";
                case DRAGDROP_E_LAST:
                    return "DRAGDROP_E_LAST";
                case S_OK:
                    return "S_OK";
                case S_FALSE:
                    return "S_FALSE";
                default:
                    return "S_FALSE";
            }
        }

        public int GetValue()
        { return this.value; }

        public string GetName()
        { return GetName(this.value); }
    }

}

Thema: Erfassen, welches Object sich gerade im Drag und Drop befindet außerhalb der Form
Am im Forum: GUI: Windows-Forms

Hallo zusammen,

ich habe die letzten Wochen alle Seiten zu Drag & Drop studiert, doch leider immer noch keine Lösung für mein Problem gefunden. Daher wende ich mich nochmal an euch.

Das Registrieren des RegisterDragDrop Verweis funktioniert für den aktuellen Prozess, Wenn ich aber nun das Handle des Explorers nehme, dann wird das Drag Drop Event nicht ausgelöst.

Des Weiteren habe ich es noch über die Nuget von EasyHook versucht, leider auch ohne Erfolg. Das Event wird nie ausgelöst.

Ich habe ein Probeprojekt angehangen.(Anhängen ging nicht. eventuell wegen der Größe? Es sind Fehler beim Hochladen aufgetreten. Bitte überprüfe Deine Eingaben.)
<dropbox link entfernt>

Beschreibung:
Aktuell wird das RegisterDragDrop auf das Handle der aktuellen Form angewendet. Wird nun das Projekt ausgeführt wird auch das Event OleDragEnter in der Klasse MyDropTarget ausgelöst. Allerdings möchte ich dies gerne entweder für alle Prozesse oder mindestens für den Explorer.

Für Dokus oder Denkanstöße bin ich Dankbar

Gruß
Thomas

Thema: Welches Control für Liste mit Sortierung (Header) und item.DblClick event?
Am im Forum: GUI: Windows-Forms

Hallo,

hier ist auf jedenfall das DataGrid zu verwenden. Mit dem ListView wirst du nicht glücklich werden.

Gruß

Thema: Text in eine PictureBox zeichnen
Am im Forum: Grundlagen von C#

Hallo An_Dre,

du hast das falsche Event genommen. Das Event Click enthält keine PaintEventArgs.
Du benötigst das Paint Event, dort sich auch die Painteventargs enthalten.

Gruß
Thomas