Liebe Community,
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:> Fehlermeldung:
System.InvalidCastException: 'Unable to cast object of type 'System.Int32' to type 'System.Object[]'
Viele Grüße,
h300
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.
Hey Th69,
danke für deine Antwort.
Ich hab die Array Deklaration jetzt entfernt, doch bekomme denselben Fehler bei:
object pix = au3.PixelSearch(0, 0, 1920, 1080, 0x1F3560);
....
object[] pixCoord = (object[])pix;
Gruß,
h300
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?
dynamic PixelSearch(int nLeft, int nTop, int nRight, int nBottom, int nCol, int nVar = 0, int nStep = 1);
Dann ist aber die Exception-Meldung eigenartig (bzgl. Int32
)???
Dann probiere mal
dynamic pix = au3.PixelSearch(0, 0, 1920, 1080, 0x1F3560);
if (pix.GetType() == typeof(object[]))
{
object[] pixCoord = (object[])pix;
// ...
}
Dann ist aber die Exception-Meldung eigenartig (bzgl.
Int32
)???Dann probiere mal
dynamic pix = au3.PixelSearch(0, 0, 1920, 1080, 0x1F3560); if (pix.GetType() == typeof(object[])) { object[] pixCoord = (object[])pix; // ... }
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:
Fehlermeldung:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Cannot convert type 'int' to 'object[]''
Doch dann nahm ich den Code was du geschrieben hast 1 zu 1:
dynamic pix = au3.PixelSearch(0, 0, 1920, 1080, 0x1F3560);
if (pix.GetType() == typeof(object[]))
{
object[] pixCoord = (object[])pix;
au3.MouseMove((int)pixCoord[0], (int)pixCoord[1], 10);
au3.MouseClick("LEFT", (int)pixCoord[0], (int)pixCoord[1], 2, 10);
break;
}
Nun funktioniert es..
Was hat
if (pix.GetType() == typeof(object[]))
denn geändert? Ich verstehe das im Moment nicht..
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).
Du kannst ja mal bei dem alten Code debuggen (s. [Artikel] Debugger: Wie verwende ich den von Visual Studio?), was genau in pix
zurückgeliefert wird.
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.