Einfache ImageSearch Lösung für x64 System

  • Hallo :thumbup:

    Ich bastle seit einige Zeit Arbeitstechnisch an einem Script herum. Nun komme ich nicht umher an einer bestimmten stelle einen Button klicken zu müssen.
    Bislang wusste ich immer wie ich mir helfe, nun ist es aber so, dass der Button nicht immer an der selben Stelle steht.

    Durch Google habe ich ein ImageSearch.au3 gefunden (autoitscript.com) welches ich auch eingebunden habe, allerdings scheint das script für eine älter Autoit Version und nur für x86 Systeme geschrieben zu sein.
    Durch weiter suchen bin ich hier gelandet und hoffe ihr könnt mir Helfen.

    Aufgabe:

    Button finden und Anklicken.


    Derzeit habe ich folgenden Code benutzt:


    [autoit]


    #include <imagesearch.au3>
    HotKeySet("{F8}", "Test")
    Func Test()
    $vSearch = _ImageSearch("unlink.png", 1, $x, $y, 0)
    If $vSearch = 1 Then
    MouseMove($x, $y, 10)
    EndIf
    EndFunc

    [/autoit]

    Allerdings läuft das so überhaupt nicht. Es kann sein das ich die imagesearch Datei nicht richtig editiert habe, nicht sicher.


    Ich würde mich freuen wenn mir einer die richtigen Dateien für ein x64er System linken könnte und mir noch sagt wo die jeweils hin müssen.
    Auch wäre es nett mir etwaige Fehler in meinem Code Schnippel aufzuzeigen.

    Danke

  • Hey! Schmeiß die ImageSearch.au3 am besten direkt in deinen virtuellen Papierkorb! ;)
    AutoIt liefert da ganz andere Mittel mit wodurch du Buttons betätigen kannst. Auch ist die Identifizierung des Buttons um Längen sicherer als mit einem Bild. Du liest einfach mit dem AutoIt Window Info Tool den Button aus. Meistens reicht die ID aus, aber für eine sichere Idenfizierung würde ich dir doch schon empfehlen die Klasse sowie die Instanz zu wählen. Hier mal ein kurzes Beispiel für mögliche Werte (ausgelesen am Windows eigenen Editor):

    Spoiler anzeigen


    Einzelne Controls kannst du dann mit den Control Funktionen ansprechen. Um also dein Button anzuklicken benutze einfach die ControlClick() Funktion. Damit dürfte es in den meisten Fällen nie irgendwelche Probleme geben. LG. Make ^^

  • Hi, danke für die schnelle Hilfe.

    Das hätte ich vielleicht noch erwähnen sollen :D Ich arbeite hier ein einer Citrix Umgebung. Die Buttons die ich Klicken muss sind leider nicht per ControlClick erreichbar. Der komplette Control Tab ist bei dem Info Tool leider leer :(
    Das scheint normal bei XenApp Programmen, da man nur ein Fenster präsentiert bekommt und die Applikation leider nicht lokal installiert ist.

    Deshalb muss ich leider wohl doch auf die Bildsuche zurückgreifen, denke ich ?

    Edit, da das Programm selber ein ActiveX Modul (Schätze ich mal) im IE ist, kann ich selbst bei einer Lokalen Installation nur wenig auswählen

  • Von XenApp's oder Citrix Umgebungen habe ich ehrlich gesagt keine Ahnung. Aber ich bin sicher dass es da andere sichere Möglichkeiten gibt als die ImageSearch.au3. generell supporte ich persönlich nicht gerne für die ImageSearch UDF, da diese eben eher Gebrauch in Game-Bot's findet (die unsere Forenregeln verbieten). Du scheinst mir aber kein Skriptkiddie zu sein die meist mit der UDF hantiert. Von daher mache ich mal eine Ausnahme. ^^

    Ich weiß nicht von wo du die ImageSearch UDF bezogen hast, jedoch liegt hier eine Version für x86 und einmal für x64 Anwendungen bereit: http://www.autoitscript.com/forum/topic/14…ge-explanation/
    Die passende kannst du dir ja dann aussuchen. Alternativ musst du ja das Skript nicht unbedingt als x64 Anwendung ausführen. Falls es geht würde auch ein einfaches #AutoIt3Wrapper_UseX64 = N am Anfang deines Skriptes für Abhilfe schaffen.

    Falls du an "sichereren" Lösungsvorschlägen interessiert bist, lass es mich wissen. ^^

  • Ah Klasse, das Posting kanne ich noch nicht.

    Nein, ist wirklich kein Bot (würde sicherlich jeder sagen). Geht darum für mich auf der Arbeit Aufgaben zu Automatisieren.
    Wir haben ein Call logging Tool, welches ich bediene um Inventory daten zu verwalten. Da ich häufig Datensätze > 800 Objekte habe die ich "von Hand" anpassen muss, hab ich mir autoit näher angeschaut.
    Bislang habe ich die meißten Tasks abbilden können, ledeglich der eine hier sträubt sich noch, da der Button zum klicken je nach Name des DB eintrags an einer anderen Stellen steht.

    Beispiel

    Name 1 {Klickmich}
    Namederganzlangist 2 {Klickmich}

    UseX64 hatte ich auch versucht, das hatte aber keine Änderung gebracht. Ich schau mir das posting noch mal an und Bastle weiter und melde mich dann wenn ich noch schwierigkeiten habe.
    Danke erstmal !

  • Leider habe ich damit den selben Fehler wie zuvor.
    Ich verwende die 64Bit dll im Skriptordner und die ImageSearch.au3 habe ich in den Include Ordner kopiert.

    Ich habe mal den code von der Seite 1zu1 kopiert und mir ein kleines Bild vom Papierkorb gemacht (wollte erstmal lokal testen)


    [autoit]

    #include <ImageSearch.au3>

    [/autoit][autoit][/autoit][autoit]

    ; #AutoIt3Wrapper_UseX64 = N <== Macht kein Unterschied ob mit oder ohne

    [/autoit][autoit][/autoit][autoit]

    While 1
    Sleep(500)
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func Test()
    Local $search = _ImageSearch("Untitled.bmp", 0, $x, $y, 0)
    If $search = 1 Then
    MouseMove($x, $y, 10)
    Else
    MsgBox($MB_SYSTEMMODAL, "", "Nothing Found")
    EndIf
    EndFunc ;==>Test

    [/autoit]

    Wenn ich das nun so laufen lasse gibt es als erstes ein Fehler aus der ImageSearch.au3

    $result[0] Mag er nicht.
    Dazu die Zeile aus der au3

    [autoit]

    ; If error exit
    if $result[0]="0" then return 0

    [/autoit]

    Ändere ich das nun ab auf:

    [autoit]

    ; If error exit
    if $result="0" then return 0

    [/autoit]

    kommen erstmal keine weiteren Fehler. Allerdings weiß ich nicht ob ich nicht auch Zeile 48 Anpassen sollte ?

    [autoit]

    $array = StringSplit($result[0],"|")

    [/autoit]

    Egal ob ich die 2. Zeile ändere oder nicht, ich bekomme immer die Box mit Nothing Found.
    Bin ratlos :(

  • Ich weiß nicht was los ist, aber bei mir funktioniert die DLL ohne Probleme:

    [autoit]

    #include <ImageSearch.au3>

    [/autoit][autoit][/autoit][autoit]

    #AutoIt3Wrapper_UseX64 = Y

    [/autoit][autoit][/autoit][autoit]

    Test()

    [/autoit][autoit][/autoit][autoit]

    Func Test()
    Local $x, $y
    Local $search = _ImageSearch("Unbenannt.bmp", 0, $x, $y, 0)
    If $search = 1 Then
    MouseMove($x, $y, 10)
    Else
    MsgBox(0, "", "Nothing Found")
    EndIf
    EndFunc ;==>Test

    [/autoit]
  • Hast du die ImageSearch.au3 angepasst oder 1zu1 nach "C:\Program Files (x86)\AutoIt3\Include" kopiert ?

    Bei der "Orginalen" bekomme ich auch zu Hause (gerade mal getestet) folgenden Fehler:

    autoit.de/wcf/attachment/25085/

    korriegiere ich das wie oben beschrieben kommt nur die Box mit nothing found.

    Ich verzweifel...


    Edit:

    F**k, ich weiß woran es liegt *haarerauf*
    Ist mir gerade erst wieder eingefallen als ich AutoIT neu installiert habe:
    autoit.de/wcf/attachment/25086/

    Hier habe ich aus kompatiblitätsgründen (wie da ja steht) x86 gewählt.
    Ich hab AutoIt neu installiert und x64 ausgewählt. Jetzt geht die Originale ImageSearch.au3 und dein Script lief sofort auf anhieb

    KAnnst du mir sagen was die umstellung für auswirkung auf meine bisherigen Skripte haben könnte ?

  • Naja, du hast JETZT erst die x64 Version von AutoIt installiert. Daher konntest du mit #AutoIt3Wrapper_UseX64 = Y keine Ergebnisse erzielen. Auswirkung dürfte die Umstellung keine haben außer dass du halt jetzt erst für 64 Bit kompilieren kannst. Sofern ich da bei der Installation nichts falsch verstanden habe. xD

  • Ok, danke, dann werde ich am Montag auf der Arbeit mal schauen.

    Ich erstelle mir aus den Scripten keine exe Dateien, da ich eh der einzige bin der die Sachen nutzt. Da reichen auch die au3 Dateien ;)

    Zudem basel ich jedesmal neue Routinen rein und erweitere so mein Wissensstand :)

    Meld mich Montag noch mal \\o//

  • weiß nich ob ich eine große hilfe sein kann, allerdings hantiere ich ab und an mit imagesearch rum, shitdown würd mich wohl als scriptkiddie bezeichnen^^, jedenfalls möcht ich vorschlagen beim _imagesearch befehl den toleranz wert etwas anheben...o ist ja nicht wirklich viel ;)

    je nachdem wie groß das bild ist und wieviele ähnliche bilder da sind würd ichs mal standartmässig mit 30-50 versuchen, am wert rumschrauben kannst dann ja immernoch.

    jemand anders hatte hier auch mal einen thread wegen imagesearch, ich hatte da meine abgeänderte udf gepostet die definitiv funkt:
    Aktuelles ImageSearch

    noob aus erfahrung

  • Ich möchte euch nicht von eurem Vorhaben abbringen, aber vielleicht kommt man ja, wenn es sich um eine Internet-Instance handelt mit:

    [autoit]


    ...
    _IEAttach ($hWnd, "embedded")

    [/autoit]

    ...

    weiter und kann dann die Elemente direkt ansteuern?

  • IEAttach funktioniert leider ebenfalls nur, wenn der IE lokal gestartet wird.
    Bei Citrix arbeitet man aber wie bei einem Remote Desktop. Das heißt wenn AutoIt nicht auf dem Remote System installiert ist, siehst du nur das Bild.
    Ich schätze mal das selbe Problem haben wohl die Bots, weshalb Imagesearch beliebt ist.

    Ich bastle gerade an dem Skipt und hab mir gerade wieder fast die Haare raufen können.
    Ich habe ein weiteres Problem gefunden. Liegt mein Skript auf einem Netzwerklaufwerk hat er wieder probleme mit der "$result[0]" Zeile in der ImageSearch.au3.
    Ich muss mal schauen ob ich das irgendwie gefixt bekomme, weil ich sehr ungern nur die Skripte wieder Lokal packen würde.

  • hast meinen post gelesen bzw. den link dadrinn angeschaut? wenn das imagesearch aus dem post nimmst, biste save..dann muß es an was anderem liegen

    noob aus erfahrung

  • @oernzz
    Also ich sehe zu deiner ImageSearch.au3 und der von autoitscript.com keinen unterschied. Ich habe es dennoch ausprobiert und bekomme unterstehenden Fehler trotzdem


    Irgendwie sträubt sich das ganze noch. Nicht weil die Bilder nicht gefunden werden, sondern die ImageSearch bricht in meinem Skript immer noch einfach mit dem "$result[0]" Fehler ab.
    Ich habe die reine Bildsuche oben in die Funktion Test geladen. Wenn ich die mit F8 starte läuft sie ohne Probleme durch. Der selbe Code aber weiter unten bricht mit dem $result[0] fehler ab :(

    Ich hab mal mein ganzes bisheriges Skript hier eingebracht. Vielleicht ja ja wer ne Idee ?


    Edit: Ich habe folgenden Part Identifiziert.
    Und zwar Zeile 26 - 36. durch diese Routine hängt sich imagesearch auf. Jemand eine Idee warum ?

    [autoit]

    Opt("WinTitleMatchMode", 2)

    [/autoit][autoit][/autoit][autoit]

    HotKeySet("{F4}", "Go")
    HotKeySet("{F5}", "Stop")
    HotKeySet("{F6}", "Pause")
    HotKeySet("{F7}", "End")
    HotKeySet("{F8}", "Test")

    [/autoit][autoit][/autoit][autoit]

    Global $fPaused = False
    Local $vEnd = 0
    Local $x = 0
    Local $y = 0

    [/autoit][autoit][/autoit][autoit]

    #include <MsgBoxConstants.au3>
    #include <FileConstants.au3>
    #include <File.au3>
    #include <ImageSearch.au3>

    [/autoit][autoit][/autoit][autoit]

    While 1
    Sleep(500)
    WEnd

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func Go() ; Runs when you press F4

    [/autoit][autoit][/autoit][autoit]

    Local Const $vFilePath = FileOpenDialog("Choose CSV File", @DesktopDir & "\Lists", "CSV Files (*.csv)", "", "01-temp.csv", "")
    If @error Or Not FileExists($vFilePath) Then
    MsgBox($MB_SYSTEMMODAL, "", "An error occurred when reading the file." & @CRLF & "Closing Programm")
    Sleep(500)
    Exit
    EndIf
    Local $vFileOpen = FileOpen($vFilePath, $FO_READ)
    If $vFileOpen = -1 Then
    MsgBox($MB_SYSTEMMODAL, "", "An error occurred when reading the file.")
    Return False
    EndIf

    [/autoit][autoit][/autoit][autoit][/autoit]
  • kanns sein das die variable $vFileopen nicht Local sein sollte? so wie ich das verstanden habe bedeutet Local das diese variable nur innerhalb der funktion definiert wird, da du dann ja eine andere aufrufst könnte es sein das imagesearch nix zum suchen übergeben bekommt und darum nix finden kann ->result[0]

    is jetzt aber nur wild geraten...

    noob aus erfahrung

  • Ich hab mal die Test Funktionen raus genommen.

    Bitte auch um Verbesserungsvorschläge für andere Fehler ;)

    Ich habe gerade Zeile 25 Einfach durch:

    Local Const $vFilePath = "c:\Users\User\Desktop\Book1.csv"

    ersetzt und jetzt läuft das Skript fehlerfrei (naja gibt immer was zu verbessern ;) ) durch.

    Aber hier mal das unmodifizierte Skript

    [autoit]

    Opt("WinTitleMatchMode", 2)

    [/autoit][autoit][/autoit][autoit]

    HotKeySet("{F4}", "Go")
    HotKeySet("{F5}", "Stop")
    HotKeySet("{F6}", "Pause")
    HotKeySet("{F7}", "End")
    HotKeySet("{F8}", "Test")

    [/autoit][autoit][/autoit][autoit]

    Global $fPaused = False
    Local $vEnd = 0
    Local $x = 0
    Local $y = 0

    [/autoit][autoit][/autoit][autoit]

    #include <MsgBoxConstants.au3>
    #include <FileConstants.au3>
    #include <File.au3>
    #include <ImageSearch.au3>

    [/autoit][autoit][/autoit][autoit]

    While 1
    Sleep(500)
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func Go() ; Runs when you press F4

    [/autoit][autoit][/autoit][autoit]

    Local Const $vFilePath = FileOpenDialog("Choose CSV File", @DesktopDir & "\Lists", "CSV Files (*.csv)", "", "01-temp.csv", "")
    If @error Or Not FileExists($vFilePath) Then
    MsgBox($MB_SYSTEMMODAL, "", "An error occurred when reading the file." & @CRLF & "Closing Programm")
    Sleep(500)
    Exit
    EndIf
    Local $vFileOpen = FileOpen($vFilePath, $FO_READ)
    If $vFileOpen = -1 Then
    MsgBox($MB_SYSTEMMODAL, "", "An error occurred when reading the file.")
    Return False
    EndIf

    [/autoit][autoit][/autoit][autoit]

    WinActivate("Remote", "") ; Window Focus to SM9
    WinWaitActive("Remote", "")
    Sleep(750)
    MouseClick("primary", 368, 96, 1) ; Click search field in SM9
    Sleep(1500)

    [/autoit][autoit][/autoit][autoit]

    For $n = 2 To 9999 ; run loop to finish all rows

    [/autoit][autoit][/autoit][autoit]

    Local $vLine = FileReadLine($vFileOpen, $n) ;read line into variable
    If $vLine = "" Then
    MsgBox($MB_SYSTEMMODAL, "", "End of File !")
    Sleep(500)
    Exit
    EndIf

    [/autoit][autoit][/autoit][autoit]

    If StringLen($vLine) > 3 Then ; Check if Line is Empty (for loopting trough the doc)

    [/autoit][autoit][/autoit][autoit]

    Local $vValue = StringSplit($vLine, ",") ; Split the string using the delimiter "," and the default flag value.

    [/autoit][autoit][/autoit][autoit]

    If $vValue[1] = "" Then ; This check is to ensure $vLine does not just consists of ",,,,,,,,"
    MsgBox($MB_SYSTEMMODAL, "", "Done with List" & @CRLF & $vLine)
    Exit
    EndIf

    [/autoit][autoit][/autoit][autoit]

    MouseClick("primary", 157, 381, 1) ; Click ref search field in SM9
    Sleep(500)
    Send("^a") ; Select the whole entry
    Sleep(250)
    Send($vValue[1], 1) ; Place Name into search
    Sleep(250)
    Send("{ENTER}")
    Sleep(1000)

    [/autoit][autoit][/autoit][autoit]

    Local $vCoord = PixelSearch(364, 196, 364, 196, 0x4168AF) ; Check if the search came back with a result
    If Not @error Then

    [/autoit][autoit][/autoit][autoit]

    MouseClick("primary", 439, 204, 2) ; open first entry
    Sleep(2500)

    [/autoit][autoit][/autoit][autoit]

    MouseClick("primary", 65, 545, 1) ; Click External Resource in SM9
    Sleep(1500)

    [/autoit][autoit][/autoit][autoit]

    MouseClick("primary", 384, 186, 1) ; Click 1st entry in SM9
    Sleep(2500)

    [/autoit][autoit][/autoit][autoit]

    For $n2 = 1 To 10 ; Loop trough the list of linked items
    Local $search1 = _ImageSearch("./pix/adconfigimport.bmp", 1, $x, $y, 0) ;check if link is coming from AD
    If Not $search1 = 1 Then
    Sleep(1000)
    ;Local $search2 = _ImageSearch("./pix/unlink.bmp", 1, $x, $y, 0) ;check if link is coming from AD
    ;If $search2 = 1 Then
    ; MouseClick("primary", $x1, $y1, 1) ; unlink in SM9
    ; Sleep(750)
    ; MouseClick("primary", 384, 186, 1) ; Click 1st entry in SM9
    ; Sleep(1500)
    ;Else
    ; MsgBox($MB_SYSTEMMODAL, "!!Error!!", "Can't fine unlink Picture")
    ; Sleep(500)
    ; Exit
    ;EndIf
    Else

    [/autoit][autoit][/autoit][autoit]

    Local $vCoord = PixelSearch(392, 203, 392, 203, 0xA7BDD2) ; Check if something is linked in the 2nd line
    If Not @error Then
    MouseClick("primary", 384, 203, 1) ; Click 2nd entry in SM9
    Sleep(1500)
    Else
    ExitLoop
    EndIf
    EndIf
    Next
    MouseClick("primary", 1269, 71, 1) ; close CI window in SM9
    Sleep(750)
    EndIf
    EndIf
    _FileWriteToLine($vFilePath, $n, " ", 1)
    Sleep(500)
    If $vEnd = 1 Then
    MouseClick("primary", 1268, 69, 1) ; Close CMDB Search
    Sleep(500)
    MsgBox($MB_SYSTEMMODAL, "Program Ended normally", "End initiated by you !")
    Sleep(1500)
    Exit
    EndIf
    Next
    EndFunc ;==>Go

    [/autoit][autoit][/autoit][autoit]

    Func End()
    $vEnd = 1
    Sleep(250)
    EndFunc ;==>End

    [/autoit][autoit][/autoit][autoit]

    Func Stop()
    While 1
    Exit
    WEnd
    EndFunc ;==>Stop

    [/autoit][autoit][/autoit][autoit]

    Func Pause()
    $fPaused = Not $fPaused
    While $fPaused
    Sleep(250)
    ToolTip('Script is "Paused", press "F6" to continue', 0, 0)
    WEnd
    ToolTip("")
    EndFunc ;==>Pause

    [/autoit][autoit][/autoit][autoit][/autoit]
  • oernzz: CSV <> PNG, JPG, GIF ^^

    ? diese variable definiert doch einen teil des pfads wo das zu suchende bild zu finden ist, demnach sehr wichtig für imagesearch...das ne csv datei selber kein bild ist, ist auch mir als "skriptkiddie" klar. dachte ja das man dies aus meinem post erahnen konnte..

    noob aus erfahrung