simples PseudoOCR (Workaround für nicht unterstützte Controls)

  • Ich hab gerade eine ganz simple Pseudo-Texterkennung gebaut. Da sich in AudaCity die Controls für Anfang und Ende einer Auswahl nicht direkt per AutoIt auslesen lassen, habe ich sie per PixelChecksum "ausgelesen":

    [autoit]

    Opt("WinTitleMatchMode",4)
    ;Opt("TrayIconDebug",1)
    Opt("PixelCoordMode",2)
    $handle = WinActivate("Vivir la Utopía")
    WinWaitActive($handle,"",5)
    ; Checksums (Adler) als Variablennamen, jeweils erste Checksum für nicht ausgewähltes Feld,
    ; zweite Checksum entspricht der Farbänderung beim anclicken mit der Maus zum Editieren
    $2731708797 = 0
    $1249945457 = 0
    $3457326344 = 1
    $3546922070 = 1
    $189568228 = 2
    $2558045491 = 2
    $2247005759 = 3
    $1980280805 = 3
    $941069677 = 4
    $4163153477 = 4
    $360354491 = 5
    $2015471813 = 5
    $3420688462 = 6
    $2279974107 = 6
    $1971952380 = 7
    $401258605 = 7
    $1111657628 = 8
    $2478480920 = 8
    $4051865454 = 9
    $3387532109 = 9
    $posStart = ControlGetPos($handle,"","[CLASS:wxWindowClassNR; INSTANCE:41]")
    $posEnd = ControlGetPos($handle,"","[CLASS:wxWindowClassNR; INSTANCE:42]")
    ; welche Darstellung der Werte ist gerade eingestellt? Offsetwerte für die einzelnen Ziffern
    $stepSamples = StringSplit("4,14,24,38,48,58,72,82,92",",",2)
    $stepMilliseconds = StringSplit("4,14,39,49,86,96,110,120,130",",",2)
    $stephhmmssSamples = StringSplit("4,14,39,49,86,96,136,146,156,166",",",2)
    Dim $step
    Switch $posStart[2]
    Case 161 ; Samples
    $step = $stepSamples
    Case 173 ; Milliseconds
    $step = $stepMilliseconds
    Case 254 ; hhmmss+Samples
    $step = $stephhmmssSamples
    EndSwitch

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

    Func read($pos)
    Dim $txt
    For $offset in $step
    $txt &= Eval(PixelChecksum($pos[0]+$offset,$pos[1]+7,$pos[0]+$offset+7,$pos[1]+16))
    Next
    return $txt
    EndFunc

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

    ConsoleWrite("Start: "&read($posStart)&@CRLF&"End : "&read($posEnd)&@CRLF)

    [/autoit]

    Vielleicht kann das ja jemandem als Inspiration dienen, wenn sich ein Control nicht direkt auslesen lässt.