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.
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?
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.
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?
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.
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.
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
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
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.
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.
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;
}
}
}
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.
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
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.
ich habe gerade mal geschaut was dein Problem ist:
Du hast try, catch nicht verstanden
Du öffnest immer COM1
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.
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.
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); }
}
}
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.
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.