PixelCheck-Zicken

  • Hallöchen allerseits.
    Ich baue grade ein ingame-radio für GTA San Andreas.
    Ingame erstelle ich an einer bestimmten Stelle (links unten) eine farbige Markierung, wenn das Radio abgespielt werden soll.
    Soweit so gut, wenn ich am Mausrad drehe, startet das Radio.
    Doch es mutet sich selber (also Pixelcheck erkennt die Markierung, beim nächsten Mal auf einmal nichtmehr, dann wieder, dann wieder nicht ...)

    Das Script:

    Spoiler anzeigen
    [autoit]

    #include <wmp.au3>
    #include <Misc.au3>

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

    $struct = "DWORD vkCode;" _
    &"DWORD scanCode;" _
    &"long flags;" _
    &"ULONG_PTR dwExtraInfo"
    Global $lastplayed = 0 ;0 = aus
    Global $angepasst = 0 ; 0 = gta nicht ontop
    Global $hMouseHook, $WheelMoving,$locked = 0
    $CallbackMouseProc = TogglePlugMouse()
    #cs
    If Not FileExists("settings.ini") Then
    Do
    $gtapfad = FileSelectFolder("Wähle den SA:MP/GTA San Andreas Ordner aus","",4)
    if @error Then
    If MsgBox(32+4,"Abbrechen ?","Wollen Sie das Setup von RealRadio wirklich abbrechen ?") = 6 Then Exit
    EndIf
    If Not FileExists($gtapfad & "\gta_sa.exe") or Not FileExists($gtapfad & "\samp.exe") Then
    MsgBox(16,"Error","Falsches Verzeichnis !",5)
    $gtapfad = ""
    EndIf
    Until $gtapfad <> ""
    IniWriteSection("settings.ini","Settings","")
    IniWrite("settings.ini","Settings","InstallPath",$gtapfad)
    EndIf
    #ce

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

    $oWMP = _wmpcreate(1,0,0,200,200)
    _wmpvalue($oWMP,"controls")

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

    While 1
    If WinActive("GTA:SA:MP") And PixelSearch(0,@Desktopheight / 2,@Desktopheight / 5,@desktopheight,0x00574A,15,2) <> @error Then
    If $angepasst = 0 Then
    $angepasst = 1
    _wmpvalue($oWMP,"play")
    ConsoleWrite("unmute" & @CRLF)
    EndIf
    Else
    If $angepasst = 1 Then
    $angepasst = 0
    _wmpvalue($oWMP,"stop")
    ConsoleWrite("mute" & @CRLF)
    EndIf
    EndIf
    $WheelMsg = _GetWheelMove()
    Select
    Case $WheelMsg = "U" And $locked = 0 And WinActive("GTA:SA:MP") ;UP
    up()
    Case $WheelMsg = "D" And $locked = 0 And WinActive("GTA:SA:MP") ;DOWN
    down()
    EndSelect
    Sleep(300)
    WEnd

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

    ; #################################################

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

    Func _GetWheelMove()
    Local $x = StringLeft($WheelMoving,1)
    $WheelMoving = StringTrimLeft($WheelMoving,1)
    Return $x
    EndFunc
    Func TogglePlugMouse($hCallProc=0)
    If IsArray($hMouseHook) Then
    DllCall("user32.dll", "int", "UnhookWindowsHookEx", "hwnd", $hMouseHook[0])
    DllCallbackFree($hCallProc)
    Return 0
    EndIf

    Local Const $WH_MOUSE_LL = 14
    ;~ Local Const $WH_MOUSE = 7
    Local $hMouseProc = DllCallbackRegister("_MouseProc", "int", "int;ptr;ptr")
    Local $hMod = DllCall("kernel32.dll", "hwnd", "GetModuleHandle", "ptr", 0)
    $hMouseHook = DllCall("user32.dll", "hwnd", "SetWindowsHookEx", _
    "int", $WH_MOUSE_LL, _
    "ptr", DllCallbackGetPtr($hMouseProc), _
    "hwnd", $hMod[0], _
    "dword", 0)
    Return $hMouseProc
    EndFunc

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

    Func _MouseProc($nCode, $wParam, $lParam)
    If $nCode < 0 Then
    Local $iRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hWinHook[0], _
    "int", $nCode, _
    "ptr", $wParam, _
    "ptr", $lParam)
    Return $iRet[0]
    EndIf
    $dllstruct = DllStructCreate($struct,$lParam)
    ;~ If DllStructGetData($dllstruct,1) = 0x1B And _IsPressed("11") Then $CTRL_ESC_Pressed = True
    If $wParam = 0x20A Then
    If DllStructGetData($dllstruct,3) > 0 Then
    ; ConsoleWrite("Up" & @CRLF)
    $WheelMoving &= "U"
    ElseIf DllStructGetData($dllstruct,3) < 0 Then
    ; ConsoleWrite("Down" & @CRLF)
    $WheelMoving &= "D"
    EndIf
    EndIf
    ;~ ConsoleWrite($wParam & " - " & DllStructGetData($dllstruct,1) & " - " & DllStructGetData($dllstruct,2)& " - " & DllStructGetData($dllstruct,3)& " - " & DllStructGetData($dllstruct,4) & @LF)
    Return 0
    EndFunc

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

    ;##############################################################

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

    Func up()
    $locked = 1
    If Not WinActive("GTA:SA:MP") Or PixelSearch(0,@Desktopheight / 2,@Desktopheight / 5,@desktopheight,0x00574A,15) = @error Then Return @error
    $lastplayed = $lastplayed + 1
    If IniRead("senderliste.ini","URL",$lastplayed,"error") <> "error" Then
    $debug = _wmploadmedia($oWMP,IniRead("senderliste.ini","URL",$lastplayed,"error"),1)
    ConsoleWrite("gestartet" & @CRLF)
    EndIf
    $locked = 0
    Beep(500,500)
    EndFunc

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

    Func down()
    $locked = 1
    If Not WinActive("GTA:SA:MP") Or PixelSearch(0,@Desktopheight / 2,@Desktopheight / 5,@desktopheight,0x00574A,15) = @error Then Return @error
    $lastplayed = $lastplayed - 1
    If IniRead("senderliste.ini","URL",$lastplayed,"error") <> "error" Then
    $debug = _wmploadmedia($oWMP,IniRead("senderliste.ini","URL",$lastplayed,"error"),1)
    ConsoleWrite("gestartet" & @CRLF)
    EndIf
    $locked = 0
    Beep(500,500)
    EndFunc

    [/autoit]

    Eine Beispielsausgabe:

    Kann mir jemand sagen, wieso das so ist, und wie ich das umgehen kann ?
    Habe die Farbenvariation sogar schon auf 15 gestellt, ohne Erfolg.
    Es muss also ein Problem mit Pixelcheck sein (oder gar mit der Logik).
    Wie kann es denn sein, dass sich das sofort an-/ausschaltet ?

    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön

    Einmal editiert, zuletzt von Dankeschön (3. September 2009 um 19:42)

  • Ich hoffe, es ist nicht allzuschlimm, wenn ich meinen immernoch wichtigen Bug pushe, da ich immernoch heiß auf die Lösung warte, selber nicht darauf kam, und ich nicht glaube, dass das ohne Push jemand in den nächsten 10 Jahren nochmal liest....

    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön

  • Ohne das Programm getestet zu haben (mangels fehlendem GTA),
    würde ich mal behaupten es liegt an Zeile 33:

    [autoit]

    If WinActive("GTA:SA:MP") And PixelSearch(0,@Desktopheight / 2,@Desktopheight / 5,@desktopheight,0x00574A,15,2) <> @error Then

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


    Mal dumm gefragt:
    1. Bist du dir sicher das du immer @desktopheight nehmen willst? (nicht @desktopwidth?)
    2. Ist es möglich den Status den Radios per Pixelgetcolor-Funktion abzurufen? (wäre vielleicht einfacher)
    - ggf. auch mit der Pixelchecksum-Funktion
    3. Falls auch das nicht wirklich was bringen sollte, kannste ja mal gucken, ob du in der Memory was finden kannst?!
    - Falls es ein Onlinespiel ist solltest du das möglicherweise seien lassen, da eine BAN-Gefahr bestehen könnte.

    Ich hoffe, ich konnte dir helfen oder zumindest Denkanstöße geben :D
    (Wie gesagt, es ist schwer, wenn man das Spiel selber nicht hat/kennt)

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!