ich bin neu zu CSharp und bin im Moment am experimentieren..
Ich bekomme jedoch bei einer meiner Funktionen dieses Error und weiß nicht wie ich das beheben soll.
Ich habe gegoogelt aber wurde jedoch nicht schlau, da fast alle ein Problem bei Int32 -> String haben und nicht Int32 -> Object[].
Mein Code:
AutoItX3 au3 = new AutoItX3();
......
while(true)
{
au3.WinWaitActive("Notepad");
while (true)
{
object[] pix = au3.PixelSearch(0, 0, 1920, 1080, 0x1F3560); //PixelSearch gibt eine 1 aus falls es nichts findet
if (pix.ToString() != "1")
{
object[] pixCoord = (object[])pix;
au3.MouseMove((int)pix[0], (int)pix[1], 10); // Parameter: x, y, speed
au3.MouseClick("LEFT", (int)pix[0], (int)pix[1], 2, 10); // Parameter; x, y, x mal clicken, speed
break;
}
Thread.Sleep(200);
}
Thread.Sleep(200);
}
.....
Error:
Fehler
System.InvalidCastException: 'Unable to cast object of type 'System.Int32' to type 'System.Object[]'
Laut AutoItX PixelSearch in C# mußt du pix nur als object (nicht als Array) deklarieren. Daher dann auch 2 Zeilen weiter der Cast zu object[].
Und daher mußt du dann weiter für den Arrayzugriff bei MouseMove/Click die Variable pixCoord benutzen.
Anscheinend gibt die von dir verwendete Methode PixelSearch einen Int32 (d.h. int) zurück. Laut offizieller Doku sollte das aber nicht so sein: PixelSearch
Kannst du mal bei dir im VS-Editor bei PixelSearch "Gehe zu Definition" (F12) aufrufen und schauen, wie die Methode deklariert ist?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
Ok das ist etwas komisch..
Ich habe zuerst den Code so umgestellt:
dynamic pix = au3.PixelSearch(0, 0, 1920, 1080, 0x1F3560); //PixelSearch gibt eine 1 aus falls es nichts findet
if (pix.ToString() != "1")
{
object[] pixCoord = (object[])pix;
au3.MouseMove((int)pix[0], (int)pix[1], 10); // Parameter: x, y, speed
au3.MouseClick("LEFT", (int)pix[0], (int)pix[1], 2, 10); // Parameter; x, y, x mal clicken, speed
break;
}
Dann hab ich den Error bekommen:
Fehler
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Cannot convert type 'int' to 'object[]''
Doch dann nahm ich den Code was du geschrieben hast 1 zu 1:
Mit pix.GetType() == typeof(object[]) wird explizit der Datentyp überprüft (bevor dann in dem Block die Umwandlung (cast) durchgeführt wird), während bei pix.ToString() != "1" nur überprüft wird, ob die Stringrepräsentation ungleich "1" ist (d.h. alle anderen Datentypen bzw. Werte würden ebenfalls diese Bedingung erfüllen und die darauffolgende Umwandlung liefert dann aber eine Cast-Exception).
Interessant.. Ok ich werde mir das definitiv durchlesen.
Allerdings habe ich gemerkt, dass mein Form ziemlich buggy ist. Ich denke das hat was mit der Autoit Bibliothek zu tun. Es lassen sich einige Funktionen im loop nicht ausführen. Ich klick auf den Standard X Button und es schließt sich nicht usw.
Ich denke, ich muss eine rein C# PixelSearch Funktion finden.