Bildschirmausschnitt als bmp zum Drücken

  • Hallo Liebe Forumshelfer,

    ich hätte noch eine Frage.

    Ich habe ein Problem das ich hatte so gelöst, dass ich über AutoIt die angegebene Position drücke.

    Dies hat jedoch den Nachteil, wenn Fenster verschoben sind oder andere Bildschirmauflösung, dann drückt die Maus ins leere.

    Ich hab in einem Youtub Video gesehen, dass man auch ein Bild machen kann, welches dann gesucht wird und gedrückt werden kann.

    Ich habs versucht nachzumachen, hat blöderweise nicht geklappt.

    Kennt das von euch jemand und könnte jemand da ein Beispiel posten, ich weiß nicht was ich da damals falsch gemacht habe?

    Viele Grüße

    Stefan

  • Take a look at MouseCoordMode() in the helpfile.

    By default it uses absolute screen coordinates but can be changed to relative coords to the active window.

    Google translate just in case...

    Schauen Sie sich MouseCoordMode () in der Hilfedatei an.

    Standardmäßig werden absolute Bildschirmkoordinaten verwendet, diese können jedoch in relative Koordinaten zum aktiven Fenster geändert werden.

  • Hallo Werty,

    mit der Hilfe komme ich leider nicht weiter.

    Hab folgenden Code gefunden.

    Allerdings dachte ich irgendeo einen Pfad und Bildname meines zu suchenden Bildes zu finden???

    #include-once

    ; ------------------------------------------------------------------------------

    ;

    ; AutoIt Version: 3.0

    ; Language: English

    ; Description: Functions that assist with Image Search

    ; Require that the ImageSearchDLL.dll be loadable

    ;

    ; ------------------------------------------------------------------------------

    ;===============================================================================

    ;

    ; Description: Find the position of an image on the desktop

    ; Syntax: _ImageSearchArea, _ImageSearch

    ; Parameter(s):

    ; $findImage - the image to locate on the desktop

    ; $tolerance - 0 for no tolerance (0-255). Needed when colors of

    ; image differ from desktop. e.g GIF

    ; $resultPosition - Set where the returned x,y location of the image is.

    ; 1 for centre of image, 0 for top left of image

    ; $x $y - Return the x and y location of the image

    ;

    ; Return Value(s): On Success - Returns 1

    ; On Failure - Returns 0

    ;

    ; Note: Use _ImageSearch to search the entire desktop, _ImageSearchArea to specify

    ; a desktop region to search

    ;

    ;===============================================================================

    Func _ImageSearch($findImage,$resultPosition,ByRef $x, ByRef $y,$tolerance, $HBMP=0)

    return _ImageSearchArea($findImage,$resultPosition,0,0,@DesktopWidth,@DesktopHeight,$x,$y,$tolerance,$HBMP)

    EndFunc

    Func _ImageSearchArea($findImage,$resultPosition,$x1,$y1,$right,$bottom,ByRef $x, ByRef $y, $tolerance,$HBMP=0)

    ;MsgBox(0,"asd","" & $x1 & " " & $y1 & " " & $right & " " & $bottom)

    if $tolerance>0 then $findImage = "*" & $tolerance & " " & $findImage

    If IsString($findImage) Then

    $result = DllCall("ImageSearchDLL.dll","str","ImageSearch","int",$x1,"int",$y1,"int",$right,"int",$bottom,"str",$findImage,"ptr",$HBMP)

    Else

    $result = DllCall("ImageSearchDLL.dll","str","ImageSearch","int",$x1,"int",$y1,"int",$right,"int",$bottom,"ptr",$findImage,"ptr",$HBMP)

    EndIf

    ; If error exit

    if $result[0]="0" then return 0

    ; Otherwise get the x,y location of the match and the size of the image to

    ; compute the centre of search

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

    $x=Int(Number($array[2]))

    $y=Int(Number($array[3]))

    if $resultPosition=1 then

    $x=$x + Int(Number($array[4])/2)

    $y=$y + Int(Number($array[5])/2)

    endif

    return 1

    EndFunc

    ;===============================================================================

    ;

    ; Description: Wait for a specified number of seconds for an image to appear

    ;

    ; Syntax: _WaitForImageSearch, _WaitForImagesSearch

    ; Parameter(s):

    ; $waitSecs - seconds to try and find the image

    ; $findImage - the image to locate on the desktop

    ; $tolerance - 0 for no tolerance (0-255). Needed when colors of

    ; image differ from desktop. e.g GIF

    ; $resultPosition - Set where the returned x,y location of the image is.

    ; 1 for centre of image, 0 for top left of image

    ; $x $y - Return the x and y location of the image

    ;

    ; Return Value(s): On Success - Returns 1

    ; On Failure - Returns 0

    ;

    ;

    ;===============================================================================

    Func _WaitForImageSearch($findImage,$waitSecs,$resultPosition,ByRef $x, ByRef $y,$tolerance,$HBMP=0)

    $waitSecs = $waitSecs * 1000

    $startTime=TimerInit()

    While TimerDiff($startTime) < $waitSecs

    sleep(100)

    $result=_ImageSearch($findImage,$resultPosition,$x, $y,$tolerance,$HBMP)

    if $result > 0 Then

    return 1

    EndIf

    WEnd

    return 0

    EndFunc

    ;===============================================================================

    ;

    ; Description: Wait for a specified number of seconds for any of a set of

    ; images to appear

    ;

    ; Syntax: _WaitForImagesSearch

    ; Parameter(s):

    ; $waitSecs - seconds to try and find the image

    ; $findImage - the ARRAY of images to locate on the desktop

    ; - ARRAY[0] is set to the number of images to loop through

    ; ARRAY[1] is the first image

    ; $tolerance - 0 for no tolerance (0-255). Needed when colors of

    ; image differ from desktop. e.g GIF

    ; $resultPosition - Set where the returned x,y location of the image is.

    ; 1 for centre of image, 0 for top left of image

    ; $x $y - Return the x and y location of the image

    ;

    ; Return Value(s): On Success - Returns the index of the successful find

    ; On Failure - Returns 0

    ;

    ;

    ;===============================================================================

    Func _WaitForImagesSearch($findImage,$waitSecs,$resultPosition,ByRef $x, ByRef $y,$tolerance,$HBMP=0)

    $waitSecs = $waitSecs * 1000

    $startTime=TimerInit()

    While TimerDiff($startTime) < $waitSecs

    for $i = 1 to $findImage[0]

    sleep(100)

    $result=_ImageSearch($findImage[$i],$resultPosition,$x, $y,$tolerance,$HBMP)

    if $result > 0 Then

    return $i

    EndIf

    Next

    WEnd

    return 0

    EndFunc


    Wer könnte mir kurz behilflich sein, damit ich verstehe wie ich das anzuwenden habe?

    Gruß

    Stefan

  • Hallo nochmal,

    jetzt glaub ich den richtigen Code gefunden zu haben.

    #include <ImageSearch.au3>

    #include <File.au3>

    #include <GDIPlus.au3>

    #include <Array.au3> ;just For debug


    Local $aFiles = _FileListToArray(@ScriptDir & "\Pics\", "*.png", 1, True) ;add your pictures in a folder

    If @error Then Exit

    _ArrayDisplay($aFiles) ;debug files

    ; Initialize GDI+ library

    _GDIPlus_Startup()


    Local $aBitmaps[$aFiles[0]]

    Local $hImage = 0

    For $i = 0 To UBound($aBitmaps) - 1

    $hImage = _GDIPlus_ImageLoadFromFile($aFiles[$i + 1])

    $aBitmaps[$i] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)

    _GDIPlus_ImageDispose($hImage) ;Clean up resources

    Next


    Local $iX = 0

    Local $iY = 0

    Local $iResult = 0

    For $i = 0 To UBound($aBitmaps) - 1

    $iResult = _ImageSearch($aBitmaps[$i], 1, $iX, $iY, 20, 0)

    If $iResult Then

    MouseMove($iX, $iY)

    MouseClick("Left", $iX, $iY, 2)

    Else

    MsgBox(1, "Error", "Could not find image")

    EndIf

    Next

    Hab im Ordner Pics 2 Bilder (png) eingefügt. Die er vermutlich auch sucht, auch ne Tabelle aufmacht.

    Sonst nichts. Ich denke er findet die Bilder auf dem Screen nicht.

    Wer weiß an was das liegen könnte?

    LG

    Stefan

  • Hallo stef26

    Ich bin kein Experte. Aber warum der Code?

    Code
    _GDIPlus_Startup()
    
    Local $aBitmaps[$aFiles[0]]
    Local $hImage = 0
    
    For $i = 0 To UBound($aBitmaps) - 1
    $hImage = _GDIPlus_ImageLoadFromFile($aFiles[$i + 1])
    $aBitmaps[$i] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    _GDIPlus_ImageDispose($hImage) ;Clean up resources
    Next

    Zu deiner Frage:
    Deine Beschreibung passt nicht zum Code. Im Code wird die Position ermittelt und sofort geklickt. Wenn das echt zu langsam wäre, dann nimm einfach das unnötige MouseMove aus dem Code. Aber ehrlich gesagt, glaube ich, du hältst die Leute hier zum Narren.

    Ich habe ein Problem das ich hatte so gelöst, dass ich über AutoIt die angegebene Position drücke.

    Dies hat jedoch den Nachteil, wenn Fenster verschoben sind oder andere Bildschirmauflösung, dann drückt die Maus ins leere.

    Grüße autoiter

  • Hallo Autoiter,

    sorry ich möchte hier niemanden zum Narren halten. War wirklich nicht meine Absicht.

    Mir geht es ja auch gar nicht um Geschwindigkeit, das ist nicht mein Problem.

    Mein Problem ist, dass der Code bei mir nicht läuft.

    Ich hatte ein png Bild in den Ordner Pics gemacht und dachte das er diesen Bildausschnitt auf dem Screem sucht und dessen Position dann drückt, was er bei mir nicht macht.

    Da ich völliger Anfänger bin verstehe ich den Code auch kaum. Nur so viel, dass ich gewusst habe, dass er von mir Bilder im OrdnerPics erwartet.

    Wie schon gesagt Zeit spielt keine Rolle Hauptsache er findet das Bild und clickt, da ich dass über mein Hauptprogramm (Excel) nicht hinbekomme würde ich für diesen Click das mit einer exe in Excel lösen.

    Problem: er clickt nicht oder findet das Bild nicht. Keine Errormeldung???

    Sorry nochmal falls das irgendwie falsch rüber gekommen sein sollte

    :)

    Stefan

  • Nun gut, ich will es dabei bewenden lassen.

    Einerseits könntest du $iResult = _ImageSearch($aBitmaps[$i], 1, $iX, $iY, 20, 0) auf Fehler prüfen.

    Andererseits denke ich, es läuft eh auf den komischen Code hinaus, den ich schon angesprochen hatte..

    Probiere doch einfach mal:
    $iResult = _ImageSearch($aFiles[$i], 1, $iX, $iY, 20, 0)

    statt

    $iResult = _ImageSearch($aBitmaps[$i], 1, $iX, $iY, 20, 0)

    Grüße autoiter

  • Hallo Autoiter,

    danke für die Rückmeldung. Leider läuft auch das mit aFiles anstelle Bitmaps bei mir auch nicht.

    Die DLL liegt im Ordner wo auch diese Test.au3 liegt.

    if $result[0]="0" then return 0

    if $result^ ERROR

    >Exit code: 1 Time: 4.364

    Könnte es sein, dass es spezielle Anforerungen an das gesuchte Bild gibt?

    Hmmm….

    Gruß

    Stefan

  • Hi stef26 !

    Bzgl. imagesearch selbst kann ich Dir nicht weiterhelfen, da ich es nicht verwende !

    Nachdem ich den Hauptthread des Users kangkeng (13 Seiten) :

    https://www.autoitscript.com/forum/topic/65…search-library/

    (der Downloadlink im Startbeitrag ist tot - der User seit 8 Jahren nicht mehr aktiv !)

    und einen zweiten Thread (8 Seiten) :

    https://www.autoitscript.com/forum/topic/14…comment=1202461

    sowie (eventuell ein neuer Ansatz zu dieser Thematik - Stand 2018) :

    https://www.autoitscript.com/forum/files/fi…age-search-udf/

    kurz quergelesen habe, möchte ich Dir aber einen Rat geben :

    Was den/die Sourcecode(s) sowie die .DLL(s) anbelangt, scheint es unterschiedliche Varianten und Modifikationen zu geben, die z.T. aus Quellen stammen denen ich nicht blind vertrauen würde !

    Möglicherweise besitzt ja ein renommierter User hier im Forum einen verlässlichen Stand und ist bereit diesen zu posten. So hättest Du zumindest schon mal eine 'gesunde' Ausgangslage ;).

    Ansonsten meine ich mich erinnern zu können, dass Andy vor laaanger Zeit (2009/2010) selbst etwas in dieser Richtung gemacht hat, was z.B. ohne Fremd-DLL auskommt. Ggf. kann bzw. möchte er dazu etwas sagen.

    EDIT : stef26

    Dem Beitrag #12 von alpines (weiter unten) kann ich mich nur anschließen !

    Lass' besser komplett die Finger von imagesearch.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (3. Juli 2019 um 00:10)

  • Hallo Musashi,

    ok Danke für die Info. Das mit der dll war mir so nicht bewusst. Da lasse ich lieber die Finger davon.

    Solange es nichts gibt, was man vertrauen kann.

    Danke

    Gruß

    Stefan

  • Generell sollte man die Finger von ImageSearch lassen.

    Dies hat jedoch den Nachteil, wenn Fenster verschoben sind oder andere Bildschirmauflösung, dann drückt die Maus ins leere.

    Ich hab in einem Youtub Video gesehen, dass man auch ein Bild machen kann, welches dann gesucht wird und gedrückt werden kann.

    Selbst mit ImageSearch würde das nicht funktionieren, da wenn die Auflösung anders ist, die Buttons entsprechend anders aussehen sollten.

    Werty hat dir bereits im ersten Beitrag das Stichwort gegeben: MouseCoordMode.

    Lokalisier die Koordinaten relativ zum Fenster und dann brauchst du nur die relativen Koordinaten anzugeben.

    AutoIt nimmt vom aktiven Fenster die Position und addiert deine Koordinaten drauf, so kann das Fenster gedrückt werden egal wo es sich gerade befindet.

    Je nach Programm kannst du auch ControlClick verwenden, das dürfte ne Ecke sicherer sein.

  • Meine Glaskugel hat fluchtartig den Raum verlassen, nachdem ich ihr deine Problembeschreibung vorgelesen habe. Ich kann es ihr nicht übel nehmen, denn die ist wirklich erbärmlich und an deinem Deutsch solltest du auch arbeiten.

    Um welches Programm handelt es sich und was willst du da drücken bzw. welche Aktion soll ausgelöst werden? Willst du etwa einen Bot schreiben? Ein Bild des Programms und dem was du drücken willst, wäre hilfreich.

    In den allermeisten Fällen ist der Weg über imageSearch der denkbar schlechteste Lösungsweg.

  • Hallo Bitnugger,

    ich wusste bis gestern noch gar nicht was ein Bot sein soll. Habs gegoogelt :)

    Also Ich arbeite aktuell an einem Exceltool. (Was ich evtl. mal wenn ich mit Autoit besser auskenne dort umsetzen möchte.)

    Es soll so etwas funktionieren wie Musixmatch.

    Videoplayer zeigt Video und ich bekomme den Englischen Text und den Deutschen Text. (aber das habe ich glaube ich schon alles mal geschrieben)

    Grund: Mein Englisch und das meiner Kinder zu verbessern.

    Hab schon einiges umsetzen können.

    Mein aktuelles vorhaben ist es die per Button in einer USERFORM die Geschwindigkeit des Videos anpassen zu können um so eine Art Lernmodus (Video läuft langsamer) umsetzen zu können.

    Problem an der Sache ist, dass der YoutubeVideoplayer den ich per Webbrowser in das UserForm gebracht habe.

    Dort habe ich natürlich immer die selbe Position. Aber der Youtube Player hat verschiedene Modi (Kinomodus usw.)

    Was noch viel schlimmer ist, ist die Tatsache, dass mit jedem Video das ebenfalls noch stark variieren kann. (Vermutlich das Videoformat)

    So dass ich weder mit der Position noch mit der Position aus einem Fenster das gelöst bekomme.

    Leider sind das auch keine Buttons die man irgendwie abgreifen kann, glaub ich. Und zu guter letzt verschwindet das Setup Zahnrad, wenn das Video nicht mit der Maus selektiert wird....

    Wenn ich es gar nicht hin bekomme, dann werde ich das manuell machen müssen. Was ich eigentlich vermeiden wollte. So bin ich eigentlich dann auch auf AutoIT gekommen.

    Ach ja mein Deutsch ist wirklich nicht das Beste.

    Ich vermute mal das wird sich auch nicht mehr ändern...

    ;(:D

    Gruß

    Stefan

  • Das kannst du dir doch alles schenken? Du musst noch nicht mal auf YouTube navigieren.

    Schau mal hier rein: https://developers.google.com/youtube/iframe_api_reference?csw=1

    Das ist die iframe-API die dir YouTube anbietet um mit dem Player zu interfacen. Wenn du möchtest kannst du einfach eine blanke Seite nur mit dem Player laden und dieser ist dann immer an der selben Stelle.

    Mit der API kannst du auch die Wiedergabegeschwindigkeit anpassen also musst du nicht mit der Maus umherklicken.

    Die gleiche API habe ich auch verwendet um den aktuellen Zeitpunkt auszulesen, das hatte ich bereits im anderen Thread gepostet.

  • Ich frag mich, wieso du ein solches Tool mit Excel umsetzen möchtest... Excel ist nun wahrlich nicht das erste Programm, was mir einfällt, wenn es um Videos geht...

    Es wäre doch viel einfacher direkt in AutoIt nen IE-Fenster zu erstellen (oder meine Preferenz: JavaFX). Die Steuerung wäre leichter umzusetzen und du hättest die komplette Kontrolle über praktisch alles.

    Wenn du ne komplett Beschreibung von dem Programm erstellt, also alles was es können soll, wie es aussehen soll,... würde ich am Wochenende ggf. schauen, dass ich das Programmiere.

    Mit freundlichen Grüßen,

    Kanashius.

  • Hallo alpines,

    cool das werde ich mir anschauen. Sieht so aus als wäre das genau das was ich brauche...

    Vielen Dank für all eure Rückmeldungen!

    Gruß

    Stefan

  • Es wäre doch viel einfacher direkt in AutoIt nen IE-Fenster zu erstellen (oder meine Preferenz: JavaFX). Die Steuerung wäre leichter umzusetzen und du hättest die komplette Kontrolle über praktisch alles.

    Wenn du ne komplett Beschreibung von dem Programm erstellt, also alles was es können soll, wie es aussehen soll,... würde ich am Wochenende ggf. schauen, dass ich das Programmiere.

    Es macht letzlich keinen Unterschied ob du das mit Excel VBA oder AutoIt realisierst.

    Statt einer gewrappten UDF verwendest du halt die Objekte direkt, und das müsstest du in AutoIt teilweise sowieso, da eval() ja nicht funktioniert.

    Ein paar Helpermethoden und fertig.

    Wenn man schon knietief drinsteckt stellt sich die Frage ob man das ganze wirklich neuschreiben möchte oder einfach noch fertigbringen will.

    Und da scheinbar schon sehr sehr viel Arbeit drin steckt erübrigt sich die Frage (in diesem Fall).

  • Hallo Kanashius,

    das wäre ja voll cool. Ich kenne mich nicht sonderlich gut aus, deshalb hab ich das mit Excel mal gestartet.

    Wunsch war schon immer, dass ich das irgendwie in AutiIT hin bekomme, würde ich aber vermutlich Jahre brauchen.

    Ich kann dir mal eine Beschreibung geben, was ich bisher in Excel gemacht habe und was ich noch machen wollte:

    Neues Lied in die DB aufnehmen:

    Ich hole mir aktuell aus meine Lieblings Musikvideos die URL

    Hole mir den passenden Liedtext in Englisch und Deutsch aus Songtexte / bzw. versuch die manuell zu übersetzen

    Jede Zeile eines Liedes bekommt eine fortlaufende Nummer

    Lasse das Video laufen. (Textzeile1 und 2 werden angezeigt.

    Ist Textzeile1 zu ende, dann wird die Youtubezeit in der Textzeile 2 gespeichert. (Textzeile 1 = immer 0)

    Nun wird Text 2 und 3 angezeigt usw. -> Ist das Video zu ende, habe ich zu jeder Textzeile den Startzeitpunkt, wann dieser eingeblendet werden soll.

    Verknüpfe die URL mit der Zeit.

    Zerlege jedes Wort des Texte in eine Wörterbuch DB und hänge dahinter die Startzeit URL+Startzeit

    Lieder abspielen:

    Dropdown aller aufgenommener Videos.

    Start Player, Start Texte, Synchronisiere Texte und Video

    Vokabeltraining: (funktioniert aktuell wegen diverser Änderungen nicht mehr/müsste ich anpassen)

    Alle im Wörterbuch aufgenommenen Wörter werden nach dem Zufallsprinzip aufgerufen.

    Dropdown der Übersetzungen

    Auswahl richtig oder falsch

    Falsch: Richtiges Wort wird angezeigt.

    Dropdown aller Lieder die dieses Wort enthalten.

    Auswahl Song -> Die Textzeile des Liedes wird gespielt

    Was habe ich noch nicht:

    Einstellungen YoutubePlayer , damit man verschiedene Geschwindigkeitsstufen einstellen kann.

    (Anfänger0,75;Lernmodus0,5,Standard 100%)

    Schwierigkeitslevel von Wörtern und Songs hinterlegen, so dass man mit einfachen Sogs/Wörter starten kann. (um nicht gleich die Lust zu verlieren)

    Was hatte ich noch vor:

    Vokabeltraining so anpassen, dass die Werte Falsch oder Richtig mit gespeichert werden, damit man dann sich dann auch mal nur die Fehlerhaften üben kann.

    Vokabeltraining: Aussprache des englischen Wortes sagen lassen (Würde in Excel eine richtige Herausforderung geworden)

    Ziel: Aus den Lieblingsliedern die englischen Vokabeln automatisch und ohne Stress lernen.


    Ich denke nicht dass man das übers Wochenende hin bekommt. Ich glaube aber auch, dass ich mit diesem Programm mein Englisch und das meiner Kinder (oh Gott was singen die für Sachen, haben aber auch erst jetzt in der Schule mit Englisch so richtig begonnen..(im Gegensatz zu mir)

    Ich könnte ein besseres Englisch (gut auch Deutsch :-)) gut gebrauchen …

    Wär auf jeden Fall ne tolle Sache

    Gruß

    Stefan

  • Hallo Alpines,

    ich könnte nochmal gut deine Hilfe gebrauchen. Ich habe mir den Link den du mir geschickt hast durchgelesen.

    Da meine Programmierfähigkeiten gleich 0 sind habe ich kein Wort verstanden was da geschrieben wurde.

    Ich habe versucht d

    Ich würde gerne beim Youtube Player an Wiedergabegeschwindigkeit (per Programm) einstellen können.

    Wärst du so nett und würdest mir das nochmal zeigen wie ich das funktioniert?

    Ich bin einfach zu blöd das umzusetzen....

    Sorry

    Stefan