Laden...

Forenbeiträge von *neo* Ingesamt 299 Beiträge

05.08.2013 - 13:59 Uhr

Hallo,

ich habe folgende Methoden implementiert um eine Datei meiner Anwendung in meine Anwendung mittels Drag&Drop zu öffnen:


private void MainForm_DragEnter(object sender, DragEventArgs e)
{
  if (e.Data.GetDataPresent(DataFormats.FileDrop))
    e.Effect = DragDropEffects.Copy;
   else
     e.Effect = DragDropEffects.None;
}

Das Problem dabei ist dass ich dann in der Methode wie folgt nur die Verknüpfung zur Originaldatei bekomme, aso Inc:


 private void MainForm_DragDrop(object sender, DragEventArgs e)
{
	string[] FileList = (string[])e.Data.GetData(DataFormats.FileDrop, false);
	foreach (string File in FileList)
	{
		Console.WirteLine(File)
	}
}

Als Beispiel kommt dann "c:\Users...\Desktop\Testdatei.hjk.inc" raus. Einfach abschneiden geht nicht, wei die Verknüpfung ja anderst heißen kann.

Ich brauche ihrgend wie das Ziel auf die Datei.

Grüße und danke

09.07.2013 - 22:20 Uhr

Hallo,

die Antwort zu dem Problem ist, dass ich bei Linien die unterschiedliche Datumswerte in unterschiedlichen Abständen haben die Linie Ordinal zeichen muss. Demensprechend muss man die Eigenschaft setzten.

Grüße

09.07.2013 - 22:18 Uhr

Hallo,

ja bei mir haben die den Typ Ethernet.

Leider kann ich die Ansätze für mein Vorhaben nicht anwenden, da ich mit 100% Sicherheit immer genau die eine Lan Verbindung benötige.

Grüße

18.06.2013 - 15:13 Uhr

Hallo,

Den Ansatz kann ich wahrscheinlich eh nicht verwenden, weil es vorkommen kann, dass es mehr zeilen gibt als auf die seite passen.

Grüße

18.06.2013 - 12:48 Uhr

Hallo zusammen,

ich habe eine Listview die eine bestimmte Größe hat und 4 Spalten. Es werden die Spalten nicht komplett auf der Form dargestellt sondern nur 2 1/2. Das ist auch so vom Kunden gewollt. Jetzt baue ich jedoch einen Druck mittels:

Hinweis: der Code ist etwas unsauber, da es sich um Testcode handelt 😃


 public void PrintPage(object sender, PrintPageEventArgs e)
{
	int x = 70;
	int y = 70;

	Bitmap bitmap = new Bitmap(this.ownListView1.Width, this.ownListView1.Height);

	Rectangle test = this.ownListView1.ClientRectangle;
	test.Width += 50;
	test.Height += 50;

	ownListView1.DrawToBitmap(bitmap, test);
	e.Graphics.DrawImage(bitmap, new Point(x, y));

	y += this.ownListView1.Height + 50;

	test = this.ownListView2.ClientRectangle;
	test.Width += 50;
	test.Height += 50;

	bitmap = new Bitmap(this.ownListView2.Width, this.ownListView2.Height);
	ownListView2.DrawToBitmap(bitmap, test);
	e.Graphics.DrawImage(bitmap, new Point(x, y));
}

Da sollen aber alle Spalten ausgegeben werden. Es werden leider nur, wie auf der Form, die ersten 2 1/2 Zeichen dargstellt. Kennt jemand eine Möglichkeit, ohne dass ich die Ausgabe komplett selber programmieren muss, die komplette Listview auszugeben mit allen Spalten?

Der Kunde will das gleiche Design der Listview, deshalb haben wir den Ansatz mittels DrawToBitmap gewählt.

Danke und Grüße

09.06.2013 - 20:17 Uhr

Hallo irgendwas,

die lib schau ich mir mal an, wobei dein workarround auch nicht schlecht ist. dabei ist nur das problem, dass evt. virtuele Lan Verbindungen ein problem sein können. Die gibt es ja auch noch. ICh hätte halt wirklich gerne die StandardLan Mac.

Grüße

09.06.2013 - 10:24 Uhr

Hallo,

leider komme ich bei dem Thema nicht weiter. Ich weiß momentan nicht wie ich es angehen soll. LEider findet man dazu auch nichts bei Google. Zumindest scheint keiner die Anforderung zu haben 😉

Vielleicht gibt es noch ein paar Tipps.

Grüße

08.06.2013 - 00:13 Uhr

Hallo,

mein Problem hat sich leider bisher nicht wirklich gelösst. Deshalb bin ich jetzt mal übergegangen zu einem Liniediagramm. Ich möchte zwei Linie zeinchen die unterschiedliche Daten (Mehrzahl Datum) haben. Soll heißen unten die Werte stimmen, aber oben nicht. Dort werden verkürtzt die gleichen wie unten dargestellt! Eigentlich sollte da stehen 1.1.12, 3.1.12, 15.1.12, 9.8.12 unf 21.12.12.

Vielleicht hat hierzu jemand eien Tipp. Beide Achsen sind wie folgt definiert:


..Axis.IsVisible = false;
..Axis.Type = AxisType.DateAsOrdinal;
..Axis.Scale.Format = "dd.MM.yyyy";
..Axis.Scale.MajorStep = 1;
..Axis.Scale.MaxAuto = true;
..Axis.Scale.MinAuto = true;
..Axis.Scale.FontSpec.Size = 8; 
..Axis.MajorTic.IsInside = true;
..Axis.MajorTic.IsOutside = true;
..Axis.MinorTic.Size = 0;
..Axis.MajorGrid.IsVisible = true;

Grüße

04.06.2013 - 19:56 Uhr

Hallo,

mit "BT Devices" meinst du Bluetooth Device, oder?
WEnn ja, dann stehe ich ja vor dem gleichen Problem, oder?

Danke und Grüße

04.06.2013 - 09:57 Uhr

Hallo zusammen,

bisher hatte ich immer die Mac Adresse einer Lan-Karte mittels


System.Net.NetworkInformation.NetworkInterface[] adapter = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();

for (int i = 0; i < adapter.Length; i++)
{
	if (adapter[i].NetworkInterfaceType == System.Net.NetworkInformation.NetworkInterfaceType.Ethernet)
	{
		mAdr = adapter[i].GetPhysicalAddress().ToString().ToLower();
		break;
	}
}

herausgefunden. Jetzt ist mir gerade eben aufgefallen das Bluetooth auch einen Eintrag Ethernet hat. Wir kann ich den zuverlässig die Lan Komponente herausfinden?
Muss ich noch eine String Operation auf den Namen machen?

Grüße

03.06.2013 - 12:33 Uhr

Hallo,

ich habe folgendes Problem.
Ich möchte gerne einen Balkendiagramm für folgende Wertpaare zeichen lassen.

  • 0, 1.1.2013
  • 320, 31.01.2013
  • 300, 28.02.2013
  • 301, 31.03.2013
  • 150, 30.04.2013
  • 80, 31.05.2013

Das Zeichen klappt auch, aber die Skalierung mit der X-Achse (Datumsachse) wird nicht richtig dargestellt. Soll heißen das Datum das angezeigt werden soll ist falsch. Die Balken sind wahrscheindlich an der richtigen Stelle und die Darstellung des Datums eben nicht.

Ich sitze momentan etwas auf dem Schlauch. Aus meiner Sicht bringt MajorStepAuto = true auch nicht. Und den MajorStep zu setzen auch nichts, weil der Abstand zwischen den Werten komplett unterscheidlich sein kann.

Das Ziel wäre, das pro Wert genau darunter das Datum steht.

Grüße und Danke!

22.05.2013 - 21:30 Uhr

ich habs rausgefunden!
Es lag an folgendem:


    graphPane.XAxis.Scale.Min = new XDate(DateTime.Now);
    graphPane.XAxis.Scale.Max = new XDate(DateTime.Now.AddDays(3));

DateTime.Now sind ja die sekunden dabei und dardurch ändert sich das Diagramm.

Abhilfe schafft folgendes:


    graphPane.XAxis.Scale.Min = new XDate(2013, 05, 22, 0, 0, 0);
    graphPane.XAxis.Scale.Max = new XDate(2013, 05, 26, 0, 0, 0);

Grüße

22.05.2013 - 21:18 Uhr

mir fällt gerade auf, dass es gar nicht mal beim wechsel der Diagramme vorkommt sondern auch wenn ich den button einzweites mal drücke. scheinbar werden die daten nicht richtig gelöscht!

22.05.2013 - 20:25 Uhr

Hallo,

ich habe ein komische Problem. Ich möchte mit EIN zedGraphControl Objekt verwenden und in deisem, je nach Auswahl, ein Balken- oder eine Linie-Diagramm zeichen. Soll heißen, dass wenn der User Button eins drückt er das Balkendiagramm auf dem zedGraphControl Objekt geziechnet bekommt und bei Button zwei bekommt er ein Liniediagramm auf dem zedGraphControl Objekt gezeichnet. Die Werte auf der Y Achse sind double und auf der X-Achse sind Zeitdaten. Die Eingabe der Daten sind immer gleich:


PointPairList list = new PointPairList();
list.Add(new XDate(t1.Date.Year, t1.Date.Month,t1.Date.Day, 0,0,0), t1.Count);
list.Add(new XDate(t2.Date.Year, t2.Date.Month, t2.Date.Day, 0, 0, 0), t2.Count);
list.Add(new XDate(t3.Date.Year, t3.Date.Month, t3.Date.Day, 0, 0, 0), t3.Count);

hier die Zeichnung des Balkendiagramms:


public void CreateVerticalBarChart()
{
	this.ClearGraph();

	GraphPane graphPane = zedGraphControl1.GraphPane;

	graphPane.Legend.IsVisible = false;

	graphPane.Title.Text = "titel";
	graphPane.XAxis.Title.Text = "X-Daten";
	graphPane.YAxis.Title.Text = "Y-Daten";

	graphPane.XAxis.Type = AxisType.Date;
	graphPane.XAxis.Scale.MajorUnit = DateUnit.Day;
	graphPane.XAxis.Scale.Format = "dd.MM.yyyy";
	graphPane.XAxis.Scale.MajorStep = 1;
	graphPane.XAxis.Scale.Min = new XDate(DateTime.Now);
	graphPane.XAxis.Scale.Max = new XDate(DateTime.Now.AddDays(3));
	graphPane.XAxis.MajorTic.IsBetweenLabels = true;
	graphPane.XAxis.MajorTic.IsInside = false;
	graphPane.XAxis.MajorTic.IsOutside = true;
	graphPane.XAxis.MinorTic.Size = 0;

	BarItem myCurve = graphPane.AddBar("curve 1", list, Color.Blue);

	graphPane.Chart.Fill = new Fill(Color.White, Color.FromArgb(255, 255, 166), 45.0F);
	
	zedGraphControl1.AxisChange();

	BarItem.CreateBarLabels(graphPane, false, "f0");

	zedGraphControl1.Refresh();
}



und hier die Zeichnung des Liniendiagramms:


public void CreateLineChart()
{
	this.ClearGraph();

	GraphPane graphPane = zedGraphControl1.GraphPane;

	graphPane.Legend.IsVisible = false;

	graphPane.Title.Text = "titel";
	graphPane.XAxis.Title.Text = "X-Daten";
	graphPane.YAxis.Title.Text = "Y-Daten";

	graphPane.XAxis.Type = AxisType.Date; // Set the XAxis to date type
	graphPane.XAxis.Scale.MajorUnit = DateUnit.Day;
	graphPane.XAxis.Scale.Format = "dd.MM.yyyy"; 
	graphPane.XAxis.Scale.MajorStep = 1;
	graphPane.XAxis.Scale.Min = new XDate(DateTime.Now);
	graphPane.XAxis.Scale.Max = new XDate(DateTime.Now.AddDays(3));
	graphPane.XAxis.MajorTic.IsBetweenLabels = true;
	graphPane.XAxis.MinorTic.Size = 0;
	graphPane.YAxis.MajorGrid.IsVisible = true;
	graphPane.YAxis.MinorGrid.IsVisible = true;

	graphPane.Chart.Fill = new Fill(Color.FromArgb(255, 255, 245), Color.FromArgb(255, 255, 190), 90F);

	LineItem myCurve = graphPane.AddCurve("Curve 1", list, Color.Red);
	myCurve.Symbol.Fill = new Fill(Color.White);

	graphPane.Fill = new Fill(Color.WhiteSmoke, Color.Lavender, 0F);

	zedGraphControl1.AxisChange();

	zedGraphControl1.Refresh();
}

Mein Problem ist, wenn ich eines der Diagramme gezeichnet habe und dann das andere Zeichen will werden die Daten auf der X-Achse vervielfacht. Siehe Anhänge. Egal ob ich zuerst das Balkendia. oder das Liniedia. zeichne, beim zweiten mal werden das Datum auf der X-Achse mehrfach dargestellt. Muss ich beim neu Zeichen die Achsen reseten?

Grüße

30.03.2013 - 18:43 Uhr

Hallo,

ich lese mich gerade in die Möglichkeiten ein, meine Software vor dem kopieren zu schützen und auch mich vor Regressansprüchen. Leider erhält man im Internet keine so richtige kostenlose Vorlagen. Ich weiß auch nicht unter welche Kategoie es fällt und nach was ich genau suchen muss. Deshalb wahrscheinlich die schlechte Ausbeute.

Hier im Forum habe ich gelesen, dass die sogenannte Eula rechtsunwirksam ist und der Benutzer eh vor dem Download/Kauf eine AGB zustimmen muss, die man natürlich aber auch in das Setup bauen kann. Ist das so richtig? Muss ich also nach einer Mustervorlage für AGB im Kontext Software suchen? Wie macht ihr das? Habt ihr gute Quellen?

Grüße und Danke
Frohe Ostern noch!

26.03.2013 - 07:10 Uhr

Hallo,

verstanden habe mittlerweile das Vorgehen 😃.

Ich habe mich gestern noch einmal internsiver mit Yano beschäfftigt. Das Tool ist echt gut und ich hoffe dass auch weiter entwickelt wird.

Also, somit viel Spaß mit meinem Tipp.

Grüße

25.03.2013 - 08:37 Uhr

Guten Morgen zusammen,

ich habe 23 Produkte installiert und getestet. Dabei sind kostenlose- und pflichtige Produkte. Die bisher hier genannten Produkte sind teils gar nicht mehr kostenlos. Deshalb hab ich mich entschieden meine vier tägige Arbeit hier mal kurz zu posten.
Für mich war wichtig, dass die Lizenz nicht mehr als 150 Euro kostet. Jedoch ursprünglich war ich auf der Suche nach einem kostelosen Tool, ich habe es ja auch gefunden 😃.
Ich habe für mich folgende Kiterien angelegt:

  • Stack Trace sollte verschlüsselbar und entschlüsselbar sein. Es sollte also eine Mappingdatei erstellt werden.
  • Preis höchstens 150 Euro.
  • Die üblichen Obfuskation sollten möglich sein (Rename von Methoden, Variablen usw; Control Flow, Encrypt String, Anti-Tampering, ILDASM Disamssembly)

Ich möchte darauf hinweisen, dass die Informationen sich nur auf meine Tests beziehen. Andere können evt. andere Erfahrungen berichten! Ich möchte auch keine Software abwerten sondern nur berichten! Ich möchte hier auch keine Werbung machen!
Alle Assemblies habe ich mit dem .NET Reflector 8.0 angeschaut und beurteilt.

  • Yano: Freeware; Stack Trace Verschlüsselung und Entschlüsselung vorhanden (sehr komfortabel); Quellcodeveränderung gut -> ist mein Favorit!

  • Rummage: Freeware; Stack Trace Verschlüsselung vorhanden jedoch keine Entschlüsselung - Mapping Datei wird jedoch erstellt; Quellcodeveränderung gut (Umbennenung in bekannte Wörter)

  • Eazfuscator.NET: Preis 399 Dollar; Stack Trace Verschlüsselung und Entschlüsselung vorhanden; Quellcodeveränderung teilweise OK

  • Babel: Preis 115 bis 245 Euro; Stack Trace Verschlüsselung vorhanden, Entschlüsselung ging bei mir nicht, evt. in der Vollversion; Quellcodeveränderung gut

  • Devextras Obfusasm: Preis 300 Dollar; Stack Trace Verschlüsselung vorhanden, Entschlüsselung ging bei mir nicht; Quellcodeveränderung gut

  • ILprotector: Freeware; keine Stack Trace Verschlüsselung vorhanden somit auch keine Stack Trace Entschlüsselung vorhanden; Quellcodeveränderung gut

  • Phoenix Protector: Freeware; keine Stack Trace Entschlüsselung vorhanden - keine Mapping Datei vorhanden; Quellcodeveränderung gut; Laut Entwickler wird das Produkt leider auch nicht mehr weiterentwickelt!

  • SmartAssembly: Preis 645 - 945 Euro, Stack Trace Verschlüsselung und Entschlüsselung vorhanden; Quellcodeveränderung gut

  • SharpObfuscator: Freeware; Stack Trace Verschlüsselung vorhanden jedoch keine Entschlüsselung - Mapping Datei wird jedoch erstellt; Quellcodeveränderung schlecht

  • SkaterLight: Freeware (es gibt auch eine Kostenpflichtige); Stürz beim Verwenden des Infotabs ab; Es werden nicht alle Klassen angezeigt zum bearbeitren

  • Cryptoobfuscator for net: Preis 149 Dollar (für meine Anforderungen muss es 299 - 399 Dollar sein); Stack Trace Verschlüsselung und Entschlüsselung vorhanden; Quellcodeveränderung gut

  • CodeFort Free: Preis 149 Euro; Stack Trace Verschlüsselung vorhanden Entschlüsselung ging bei mir nicht; Quellcodeveränderung gut

  • Confuser: Open Source; Stack Trace Verschlüsselung vorhansen aber keine Stack Trace Entschlüsselung; Stack Trace Veränderung in chinesisch, daher Coding für E-Mail Versand "nicht" möglich

  • dotnetspin: Freeware; keine Stack Trace Verschlüsselung und Entschlüsselung vorhanden; Quellcodeveränderung zu gering

  • Dotnet Reactor: Preis 145 Euro; Hat bei mir nach der Obfuskation ewig gedauert bis meine App geladen war.

  • dotNetProtector: Preis 300 Dollar; Reine Konsolenanwendung

  • DYAMAR Protector: Preis ca 190 Dollar; Nach Obfuskation wurde meine Anwendung vom Arvira als Virus erkannt 😃

  • The Enigma Protector: Preis 149 Dollar; Sehr umfangreich mit vielen Funktionen außerhalb der Obfuskation

  • Macrobject Obfuscator.Net: Preis 199 Dollar; Stack Trace Verschlüsselung vorhanden jedoch Entschlüsselung; Quellcodeveränderung gut

  • Manco Obfuscator: Preis 74,95 bis X Dollar; Verursacht bei mir einen Fehler beim Einlesen der App

  • NetObf-Protector: Apllikationsprache für mich nicht lesbar 😃

  • OrangeHeap: Freeware; Stack Trace Verschlüsselung vorhanden jedoch keine Entschlüsselung - Mapping Datei wird jedoch erstellt; Quellcodeveränderung Ok; Jedoch führen manche Optionen dazu, dass meine App nicht mehr geht

  • remobjects: Freeware; Reine KonsolenAnwendung

Hier noch eine Liste posten aus einem anderen Forum
.NET Protectors / Packers List, .NET code protection and obfuscators

Ich hoffe, dass hilft auch Anderen, denn die Suche nach dem richtigen Tool ist wirklich VIEL Arbeit!

Grüße

24.03.2013 - 19:54 Uhr

Hallo,

nichts für ungut, aber die habe ich mir alle durchgeschaut und noch viel mehr. Ich werde morgen mal mein Ergebnis posten! Die Aussagen unter diesen Link sind veraltet und die dort genannten Softwareprodukte schon länger keine Freeware mehr.

Morgen mehr!

Grüße

24.03.2013 - 14:14 Uhr

Hallo,

ich kämpfe mich die letzten zwei Tage durch die angebotenden Softwareprodukte. Teilweise funktionieren diese nicht richtig oder der stack trace kann nicht entschlüsselt werden. Also, dass Ganze ist nicht so einfach!

Kennt jemand ilprotector?

Grüße

22.03.2013 - 16:45 Uhr

Hallo,

wenn möglich suche ich schon etwas kostenloses oder eben für wenig Geld.

Leider ist die Suche etwas schwierig nach dem richtigen Tool. Hab noch Obfusasm gefunden. Leider funktioniert der Stack Trace Viewer nicht. Kostet mir eigentlich auch zu viel. Na, vielleicht kennt jemand noch ein paar Tools die das können.

Danke und Grüße

22.03.2013 - 15:58 Uhr

Hallo Christian,

ich geb dir Recht, in einem Forum dort hätte ich gerne gepostet, aber auf der Seite ntcore.com gibt es kein Forum, oder übersehe ich es?

Zu SmartAssembly folgende Frage. Ist das nicht auch ein Obfuscator Tool. Zumindest lese ich das so. Na, ich schau es mir gleich mal an.

Grüße

22.03.2013 - 15:31 Uhr

Hallo,

ich bin gerade auf der Suche nach einem Obfuscator Freeware Tool und bin durch das Forum auf Phoenix Protector gestoßen. Der funktioniert auch, jedoch nur wenn ich die Ressourcen wie Bilder usw. ausschließe, aber das ist nicht das Problem. Mein Problem ist folgendes:

Ist es möglich ab einer bestimmten Stelle im Quelltext zu sagen, dass die Obfuscator nicht mehr angewendet werden soll. Hintergrund ist, dass ich in meinem Programm ein Funktion habe, die es dem Benutzer ermöglicht die Fehler/Exceptions die auftreten per E-Mail an mich zu versenden (wenn sie das möchten). Der Fehler wird dann aber auch unleserlich an mich versendet, weil in den Fehler die Methoden usw. einen unleserlichen Namen erhalten. Das heißt es sieht dann wie folgt aus.

"?1?.?41?: bei ?1?.?75?.?791?(List`1[] ?1009?, XmlDocument ?1006?, Double ?1010?, Int32 ?1011?)"

Ich weiß die Anfrage hört sich komisch an. Wahrscheinlich geht es auch nicht, weil das Assembly ja "verschlüsselt"/unkenntlich wird und die Exception daher gar nicht die original Namen kennen kann. Ist dem so?

Grüße und Danke

15.03.2013 - 10:40 Uhr

Hallo,

ich habe es nun wie folgt gelößt.
Ich prüfe beim Einfügen einer neuen Zeile ob der Inhalt größer als 259 Zeichen ist (dies ist bei mir der Wert). Wenn dies der Fall ist, dann füge ich 5 Stellen vorher ein ---> ein, so dass der User weiß das da noch was ist. Dann habe ich beim drauf klicken noch ein Kontextmenü wo der User sich dann in einem Popup den gesamten Text anschauen kann.

Fertig!

Danke für die Hilfe, Grüße

10.03.2013 - 23:12 Uhr

Hallo,

bisher hatte ich das folgende Problem nie, weil meine Zellen in einer Listview nicht mehr als 256 Zeichen enthielt. Jedoch habe es jetzt 😃

Scheinbar ist eine Zelle in einer Listview auf 256 Zeichen beschränkt. Bisher habe ich zur Erweitung keinen Lösungsansatz gefunden. Ihrgend wie scheint das Problem, wie ich vorher auch, keiner zu haben.

Ein möglicher Lösungsansatz wäre per Kontextmenü eine Funktion anzubieten in der Art "Zelleninhalt ganz anzeigen" und dann per Popup ausgeben. Aber, das gefällt mir nicht. Kann ich die Zellenlänge überschrieben?

Grüße und danke!

04.02.2013 - 20:54 Uhr

Hallo zusammen,

ich habe es jetzt wie folgt gemacht. In der Hauptanwendung sorge ich für den Download der neuen Updates in ein Verzeichnis "download" im Programmverzeichnis. Ist der Download abgeschlossen starte ich das Updateprogramm und beende die Haupanwendung mit folgendem:


System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.FileName = Application.StartupPath + @"\Updater.exe";
process.Start();

Application.Exit();

Daraufhin wird der Updater gestartet, der zuerst die alten Programmdateien umbenennt (ich hänge einfach an das exe ein _old, also so: .exe_old), dann die neuen Programmdateien aus dem Ordner "download" eine Ebene nach oben, in das Programmverzeichnis, verschiebt und dann zum Schluß noch das Verzeichnis "download" löscht. Im Anschluß wird das Haupprogramm wieder gestartet mit folgendem:

System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.FileName = Application.StartupPath + @"\Haupanwendung.exe";
process.Start();

Application.Exit();

Nach dem Start der Haupanwendung prüfe ich im Konstruktor ob es Dateien mit der Endung .exe_old. Wenn ja, lösche ich diese. Das hat auch soweit funktioniert.

Leider ist mir gerade eben noch einmal beim Testen aufgefallen, dass es leider doch nicht immer funktioniert. Ich erhalte manchmal beim Löschen der alten Programmdateien eine "system.unauthorizedaccessexception der zugriff auf den pfad...". Ihrgend wie scheint es damit zu tun zu haben das die Hauptanwendung beim ersten mal schließen mit Application.Exit(); nicht schnell genug geschlossen wir nach dem Runterladen der Dateien. Ich schätze mal der Prozess ist ihrgend wie noch offen. Der Updateprozess scheint zu schnell beendet zu werden.

Ich wollte eigentlich nur die Lösung posten, aber der Fehler kam bisher nicht.

Grüße

01.02.2013 - 14:37 Uhr

Hallo,

die Anwendung wird durch diesen Schließen nicht beendet. Die Anwendung läuft eigentlich danach weiter. Mein Abbrechen Button auf der Form soll eigentlich dieses Fenster auch schließen. Ich schau mir deinen Hinweis gleich mal an, wie man das machen kann. Ich habs nämlich noch nicht so ganz verstanden.

Danke

31.01.2013 - 23:17 Uhr

Hallo zusammen,

ich habe einen Webclient der ein Download ausführt. Das klappt auch alles soweit.
Ich habe auf der Form einen Abbrechen Button und die Form kann über das X geschlossen werden. Nun wollte ich bei klicken des Buttons oder des X das FormClosing Event implementieren und den Download vom Webclient abbrechen. Mit

webClient.CancelAsync()

wird der Download auch abgebrochen, ABER es wird nicht das Event DownloadFileCompleted gesprungen und somit kann ich auch nicht auf das Schließen reagieren. Kann das sein das ich im FormClosing Event dafür zu spät dran bin?

Ich weiß nicht wie es sonst machen soll als das FormClosing Event zu nehmen.

Grüße und Danke

31.01.2013 - 09:51 Uhr

Hallo zusammen,

mit dem Stream und dem WebBrowser Control hat es nicht geklappt. Ich habe es jetzt anderst gemacht. Ich habe navigate des WebBrowser Control verwendet und hänge Benutzername und Passwort vor die domaine (FTP Schreibeweise):

sendWebBrowser.Navigate(new Uri("http://" + proxyUsername + ":" + proxyPasswort + "@www.domaine.de");

Danke und Grüße

30.01.2013 - 13:45 Uhr

Hallo,

ich weiß warum das Problem zu Stande kommt, hab aber leider keine Lösung.
Wenn ich domaine.de oder eine sonstige Webseite aufrufe bekomme ich den response. Es werden aber scheinbar noch Daten nachgelesen wie js, css und andere Dinge.

Grüße

29.01.2013 - 19:47 Uhr

Hallo,

das

request.Proxy = New WebProxy(proxyAddress) 

bringt leider nichts. Der Anmeldedialog für den Proxy erscheint dennoch. Ich kann zwar meine Anmeldedaten dort eingeben, aber diese seien ungültig. Was nicht sein kann weil, wenn ich die Seite direkt über

webBrowser.Navigate("http://www.domaine.de");

aufrufe geht alles ganz normal. Es scheint ihrgend wie mit dem

webBrowser.DocumentStream = response.GetResponseStream();

zu tun zu haben.

Noch zu den Anemldedaten, ich habe UseDefaultCredentials auch false gesetzt, weil ich doch die Anmeldedaten mit request.Proxy.Credentials mitgebe. Der Parameter UseDefaultCredentials müsste ich doch nur true setzten, wenn der die Standard Windows Anmeldedaten nehmen soll, oder verstehe ich es falsch?

Danke!
Grüße

28.01.2013 - 16:23 Uhr

Hallo,

ich habe ein WebBrowser Control in meiner Applikation.
Die soll eine URL in folgender Form aufrufen: ht****tp://www.domain.de/test?param1=x&param2=123

Das Problem ist, dass die Software in einem Netzwerk laufen soll, wo ein Proxy zwischen dem Client und dem Internet steht.

Ich habe folgendes versucht:


byte[] parameterByteArray = Encoding.GetEncoding("ISO-8859-1").GetBytes("param1=x&param2=123");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.domain.de/test");
request.Proxy.Credentials = new System.Net.NetworkCredential("username", "passwort");
request.ContentType = "application/x-www-form-urlencoded";
request.KeepAlive = false;
request.Method = "POST";
request.ContentLength = parameterByteArray.Length;

Stream requestStream = request.GetRequestStream();
requestStream.Write(parameterByteArray, 0, parameterByteArray.Length);
requestStream.Close();

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

webebBrowser.DocumentStream = response.GetResponseStream();

Leider kommt immer mal wieder der Proxy Anmeldedialog. Der catcht auch scheinbar teilweise die Daten.

Scheinbar vergesse ich noch eine Einstellung oder geht es nicht?

Grüße

24.01.2013 - 20:43 Uhr

Hallo zusammen,

ich habe mir einen kleinen Updater geschrieben, der eine neue Version meines Hauptprogramms vom Server lädt und die Programmdatei direkt beim download überschreibt:

webClient.DownloadFileAsync(new Uri("http://domain.de/update/hauptanwendung.exe"), "hauptanwendung.exe");

Damit wird die Datei des Hauptprogramms direkt überschrieben. Da sehe ich das Problem, wenn die Datei falsch runtergeladen wurde oder korrupt ist. Dann ist die Original Datei vom Hauprogramm kaputt. Wie seht ihr das?

Wie mache ich aber ein Update vom Updater? Der Updater läuft ja und kann somit nicht überschrieben werden. Wir macht ihr das denn? Eine Möglichkeit wäre meiner Meinung nach, dass der Updater seine Programmdatei selbst lädt, aber sich nicht überschreibt sondern dieses in ein unterverzeichnis schreibt. Nach dem die Datei dort abgelegt wurde beendet sich der Updater und startet noch schnell eine Batch-Datei die den neuen Updater in das Hauptverzeichnis verschiebt.

Die Lösung würde wahrscheinlich gehen, ist aber nicht so schön.

Grüße

02.01.2013 - 12:00 Uhr

Hallo zusammen und ein frohes neues Jahr!

ich habe nun meine Lizenzabfrage in mein Programm eingebaut. Das Problem ist natürlich, ich bin über einen anderen Thread darauf gestoßen, dass man nach der Lizenzprüfung einen gewissen Status einer Variablen hat. D.h. entweder ist die Lizenz gültig oder eben nicht, true oder false! Solange keiner ein Speicheranalyse-Programm vor meines schaltet, ist das grundsätzlich aus meiner Sicht kein Problem. Wenn aber so ein Programm läuft, dann kann die Variable, die entscheidet ob Vollversion oder Demo, geändert werden und die Lizenzprüfung war für die Katz.

Gibt es da andere Ansatzpunkte oder neue Erkenntnisse? Hier im Forum habe ich leider keine gefunden.

Kann man ihrgend wie prüfen ob ein anderes Programm den Speicher meines Porgrammes nutzt?

Grüße

07.12.2012 - 18:57 Uhr

Hallo ihr beiden,

danke für eure Hilfe! So wie beschrieben funktioniert es, hier aber der Code, der Formhalber.


private const uint LVM_INSERTITEMW = 0x104D;

protected override void WndProc(ref Message msg)
{
	base.WndProc(ref msg);

	if (msg.Msg == LVM_INSERTITEMW)
	{
	   if (this.Items.Count != 0 && this.AutoscrollToEnd)
		{
			this.EnsureVisible(this.Items.Count - 1);
		} 
	}

}

Warum es jetzt aber mit LVN_LVN_INSERTITEM nicht funktioniert hat bzw. das nach dem Add das WM_NOTIFY nicht durchgeführt wird, habe ich leider immer noch nicht verstanden. Hätte ich jetzt laut Doku erwartet. Aber gut, es scheint mit dem oben genannten zu funktionieren.

Grüße und ein schönes WE.

07.12.2012 - 13:36 Uhr

Hallo zusammen,

LVM_INSERTITEMW finde ich gar nicht in der oben genannten Doku. Da gibt es nur LVM_INSERTITEM ohne W. Ist das ein Schreibfehler oder richtig?

D.h., dass ich dann direkt ohne WM_NOTIFY prüfen muss, oder? so wie folgt:


private const uint LVM_INSERTITEMW = 0x104D;

protected override void WndProc(ref Message msg)
{
	if (msg.Msg == LVM_INSERTITEMW)
	{
		if (this.Items.Count != 0 && this.AutoscrollToEnd)
		{
			this.EnsureVisible(this.Items.Count - 1);
		} 
	}

	base.WndProc(ref msg);
}

EDIT: Leider springt er so nicht ans Ende, obwohl er das ausführt: this.EnsureVisible(this.Items.Count - 1);

07.12.2012 - 11:43 Uhr

Hallo,

ihrgend wie komm ich nicht damit hin 😦


struct NMHDR
{
	public IntPtr hwndFrom;
	public uint idFrom;
	public uint code;
}

private const uint WM_NOTIFY = 0x004E; //78; //0x004E
private const uint LVN_INSERTITEM = 0xFFFFFF9A; //-102; //0xFFFFFF9A // 4294967194
private const uint LVN_DELETEITEM = 0xFFFFFF99; //- 103; //0xFFFFFF99

protected override void WndProc(ref Message msg)
{
	if (msg.Msg == WM_NOTIFY)
	{
		NMHDR nmh = (NMHDR)msg.GetLParam(typeof(NMHDR));

		if (nmh.code == LVN_INSERTITEM)
		{
			if (this.Items.Count != 0 && this.AutoscrollToEnd)
			{
				this.EnsureVisible(this.Items.Count - 1);
			}
		}                
	}

	base.WndProc(ref msg);
}

Ich hab das gefühl das die Konstanten nicht stimmen.
ICh würde jetzt erwarten, dass bei listview.Add("test") der Sprung zu folgenden durchgeführt wird:

this.EnsureVisible(this.Items.Count - 1);

Aber, ihrgend wie geht es nicht. Das ist echt nicht einfach!

Grüße

EDIT: @herbivore: Bi mir ist auch nmh.code immer 0. Ich versteh es gerade nicht.

07.12.2012 - 10:35 Uhr

Hallo,

unter PInvokeLibrary/Win32/User32.cs habe ich eine Liste gefunden mit den Werten.

Doch es funktioniert leider immer noch nicht. Wenn ich der Listview mit Add oder AddRange eine neue Zeile hinzufügen wird folgende Zeile immer noch nicht erreicht:

this.EnsureVisible(this.Items.Count - 1)

Folgendes habe ich in der abgeleiteten Klasse von ListView:


private const int LVN_FIRST = -100;
private const int LVN_INSERTITEM = (LVN_FIRST - 2);
private const int LVN_DELETEITEM = (LVN_FIRST - 3);

protected override void WndProc(ref Message m)
{
	if (m.Msg == LVN_INSERTITEM || m.Msg == LVN_DELETEITEM)
	{
		if (this.Items.Count != 0 && this.AutoscrollToEnd)
		{
			this.EnsureVisible(this.Items.Count - 1);
			
		}
	}

	base.WndProc(ref m);
}

ist doch komisch.

Grüße

**EDIT: **@herbivore: hab zuerst gepostet und dann gesehen das du geschrieben hat 😃.
Genau -102 hatte ich auch gefunden, aber es geht nicht!

07.12.2012 - 09:10 Uhr

Guten Morgen,

da ich leider noch nichts mit WndProc, Messages und Notifications gemacht habe und das auf den ersten Blick etwas verwirrend ist, würde ich mich freuen für noch etwas Hilfe.

Ich habe unter List View (Windows) die Definition gefunden.

Doch leider versteh ich es nicht so ganz. Bei der Listbox waren es nur Messages und keine Notifications:

if (m.Msg == LB_ADDSTRING || m.Msg == LB_INSERTSTRING || m.Msg == LB_DELETESTRING || m.Msg == LB_RESETCONTENT)

Bei der Listview sind es nur Notifications die ich abfragen kann und dazu kommt, dass es nur Insert und Delete-Notifications gibt.

if (m.Msg == LVN_INSERTITEM || m.Msg == LVN_DELETEITEM)

D.h. doch nicht, dass jedes Controll durch die Basis einen gleichen Pool an Messages und Notifications hat und es ist nicht zwangsläufig so, dass es immer Message oder Notifications sind, oder? So was wie LB_RESETCONTENT und LB_ADDSTRING habe ich für Listview jetzt nicht herausfinden können. Die Frage ist reichen die aus?

Mein Problem ist noch, dass ich nicht weiß welcher Wert die Konstante für LVN_INSERTITEM bekommen muss. Bei der Listbox war der Wert bei der einen Konstanten folgender:

private const int LB_ADDSTRING = 0x180

Bei der Listview habe ich auf der genannten Seite nichts gefunden. Wie bekommt man das raus?

Grüße

06.12.2012 - 13:19 Uhr

Hallo,

das Überdecken von Properties ist nicht schön und kann zu Problemen führen. Wenn jemand auf dein Control als normales ListView zugreift (also über eine Variable vom Typ ListView), dann greift er unbeabsichtigt auf die ursprüngliche und damit falsch Property zu. new zum Überdecken sollte man möglichst nie verwenden. Das ist immer eine Krücke.

Du meinst mit Zugriff auf diese Weise?


ListView test = new ListView();
test.Add("Item 1");

//zugriff
test[0] = "neuer Text für Item 1";

Warum greift er dann auf die ursprüngliche Standard Eigenschaft zu? Ich habe die doch neu definiert, oder liegt das Problem daran, dass ich override nehmen sollte, meinst du das?

Ich versuche das dann auf jedenfall noch einmal über die Windows Nachrichten.

Grüße

05.12.2012 - 19:14 Uhr

Hallo,

Konvetierungsprobleme sollte es eigentlich nicht geben, weil ich die Items nicht verändert habe. Die items beinhalten nichts besonderes. Bei mir ist es eine einfache Standard Listview. Sollte doch dann kein Problem sein, oder meinst du was anderes?

Grüße

05.12.2012 - 15:37 Uhr

Hallo CoLo ,

danke für deinen Tipp!
Ich habe es mir mal angeschaut und habe es mal so umgesetzt. Es funktioniert, aber ich bin mir da auch nicht sicher.


private MyListViewItemCollection _Items;

public MyListView()
{
	_Items = new MyListViewItemCollection(this);
}

public new MyListViewItemCollection Items
{
	get
	{
		return _Items;
	}
	
	set
	{
		this._Items = value;
	}
}

public class MyListViewItemCollection : ListView.ListViewItemCollection
{
	private MyListView _owner;

	public MyListViewItemCollection(MyListView owner): base(owner)
	{
		_owner = owner;
	}

	public override ListViewItem Add(ListViewItem value)
	{
		ListViewItem added = base.Add(value);

		if (base.Count != 0 && _owner.AutoscrollToEnd)
		{
			_owner.EnsureVisible(base.Count - 1);
		}

		return added;
	}

	public void AddRange(ListViewItem[] items)
	{
		base.AddRange(items);

		if (base.Count != 0 && _owner.AutoscrollToEnd)
		{
			_owner.EnsureVisible(base.Count - 1);
		}
	}
}
05.12.2012 - 14:38 Uhr

Hallo,

was ich gefunden habe ist folgendes:

        private const int LB_ADDSTRING = 0x180;
        private const int LB_INSERTSTRING = 0x181;
        private const int LB_DELETESTRING = 0x182;
        private const int LB_RESETCONTENT = 0x184;

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == LB_ADDSTRING || m.Msg == LB_INSERTSTRING || m.Msg == LB_DELETESTRING || m.Msg == LB_RESETCONTENT)
            {
                ItemsChanged(this, EventArgs.Empty);
            }

            base.WndProc(ref m);
        }

        public event EventHandler ItemsChanged = delegate { };

leider funktioniert es nicht, weil die Msg scheinbar nicht stimmen. Es wird nie zu "ItemsChanged(this, EventArgs.Empty);" gesprungen.

Grüße

05.12.2012 - 13:31 Uhr

Hallo,

genauso hatte ich mir das vorgestellt 😃
Ne, im ernst, das hatte ich auch gesehen und auch überlegt die Add Methode eigenständig zum implementieren, aber das wollte ich mir evt. ersparen.

Vielleicht hat ja noch jemand eine Idee.

05.12.2012 - 12:19 Uhr

Hallo,

ich habe mir ein Usercontroll erstellt welches von der Klasse Listview erbt. Jetzt soll nach dem hinzufügen automatisch an das Ende gescrollt werden. Dazu würde ich das gerne im Controll selber machen. Eine Eigenschaft die das bestimmt habe ich schon erstellt. Mit fehlt aber ihgend wie das passende Event was ich ansteuern kann. Es soll ja erste nach dem Zeichen und nach dem Hinzufügen von neuen Items gescrollt werden.

Grüße und Danke

27.11.2012 - 19:37 Uhr

Hallo herbivore,

danke für die super Antwort! Das hat genau das erklärt was ich nicht verstanden hatte bzw. wo mir nicht ganz klar war in welchem Kontext ich was einsetzte.

Ich werde es nicht als Dienst machen sondern als Trayanwendung, weil ich genau das benötige, dass die zeitliche Ausführung benutzerspezifisch ist. Das hat den Hintergrund, dass pro Benutzer die Zeitpunkte individuell festgelegt werden. Man kann sich das so vorstellen wie ein Kalender, nur das es keiner ist 😃, aber eben Zeitpunkte die Benutzerabhängig sind und nicht für alle Benutzer gleich.

Danke, dann kann ich ich ja anfangen.

Grüße

27.11.2012 - 07:23 Uhr

Hallo Karill,

ich hatte ja einen Link gepostet für eine App mit NotifyIcon. Da wir gezeigt wie der grundsätzliche Aufbau ist. Das ist scheinbar eine ganz einfache App die im Hintergrund läuft. Was wäre denn der Nachteil diese App beim Start über die Registry (Run) zu starten und darin einen Timer zu erstellen der jede Minute prüft ob ein Zeitpunkt erreicht ist? Was wäre der Vorteil von einem Dienst in meinem Kontext? Der würde das gleiche machen, aber schon vor der Anmeldung laufen.

Mir ist trotz lesen noch nicht so ganz klar, was genau der Unterschied ist einen Dienst zu haben oder eine App im Hintergrund. Ist das von der Performance her ein Unterschied?

Grüße

26.11.2012 - 21:13 Uhr

Hallo,

ich muss folgendes Szenario umsetzten.
Eine Anwendung soll Zeitpunkte prüfen. D.h. wenn ein bestimmter Zeitpunkt erreicht ist soll eine Information im Tray unten rechts erscheinen.

Zur Umzetzung bin ich mir nicht ganz sicher wie man das machen kann.

Wenn ich das ganze als NotifyIcon umsetzte muss ich ja immer dafür sorgen, dass die Anwendung beim Windowsstart gestartet wird und dann läuft. Ein Beispiel dafür gibts in How can I make a .Net Winforms application that only runs in the System Tray?

Die zweite Möglichkeit ist einen dienst zu erstellen der das ganze erledigt. Da sollte natürlich auch ihrgend wie ein Tray unten rechts vorhanden sein.

Oder ist das Ganze in Kombination zu sehen?

Kann man sich ganz klar für eine Methode euer Sicht entscheiden?

Grüße

23.11.2012 - 19:00 Uhr

Hallo,

informationshalber hätte ich gerne das andere gehabt, aber alleine bekomme ich es nicht hin. Deshalb habe ich es wie Gü beschrieben hat gemacht. Danke Gü!

Grüße

23.11.2012 - 08:28 Uhr

Hallo Gü,

du hast keinen Denkfehler, aber aus dem Bitmap kann ja wie im Eingangspost gezeigt ein byte[] gemacht werden.

aber dann habe ich doch das gleiche Problem wie im Eingangspost, oder? Wenn ich dann folgendes anwende:

MemoryStream ms = new MemoryStream();
((Bitmap)rm.GetObject("key")).Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
bytesArray = ms.ToArray();
test2 = byteToHex(test);

Ich erhalte dann wieder nur das Jpeg aber nicht die die restliche Information.

Ich glaub ich hab doch einen Denkfehler 😃

Grüße

22.11.2012 - 17:32 Uhr

Hallo,

@gfoidl: das probiere ich gleich mal.

@herbivore: den Zugriff mittels ResourceManager-Klasse hatte ich versucht mit


System.Resources.ResourceManager rm = new System.Resources.ResourceManager("WindowsApplication1.Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly());

wenn ich aber dann folgendes mache

object o = rm.GetObject("wert");

erhalte ich ein Objekt, was eigentlich das Bitmap darstellt. Eine andere Methode sehe ich in der ResourceManager-Klasse nicht. GetStream geht nicht, weil ich dann eine Exc erhalte.

Hab ich da jetzt mal wieder einen Denkfehler?

Grüße