Problem Controlsend

06/10/2011 18:42 Lollipop99#1
so ich hab einen neuen bot programmmiert (Spiel archlord, is aber eig egal) und das problem ist, dass controlsend() meistens nicht funktioniert, ganz selten aber iwie dann doch. Der Rest des Codes funktioniert soweit(HWND, keys, auch winsettitle) Außerdem funktioniert controlsend() noch, wenn man es als kontrollfunktion direkt nach der variablendeklaration ausführt. Hier mal der Code, vllt hat jemand ne Idee

PHP Code:
#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_Add_Constants=n
#AutoIt3Wrapper_Run_Tidy=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
Opt("WinTitleMatchMode"3)

HotKeySet("{F5}""_attach")
HotKeySet("{F6}""_start")
HotKeySet("{F7}""_pause")
HotKeySet("{F8}""_exit")

Dim $inidatei
Dim $Dll 
DllOpen("ACEGGMemReader.dll")
Dim $pause True
Dim $HWND
Dim $PID
Dim $process
Dim $targethp
Dim $skills
[9][4]; 9skills mit 1.key u2. cooldown 3.timerstop 4.duration
Dim $title 
"botting"
Dim $attached False
Dim $result
Dim $i

While 1
    
If Not $pause Then
        _buffcheck
()
        
_attack()
    Else ; Or 
wait
        Sleep
(1000)
        
ControlSend("Archlord""""""{F1}")
    EndIf
WEnd

Func _attach
()
    If 
Not $attached Then
        $HWND 
WinGetHandle("[Active]")
        
$result DllCall($Dll"DWORD""ACEGetPIDFromHWND""DWORD"$HWND)
        
$PID String($result[0])
        
$result DllCall($Dll"DWORD""ACEOpenProcess""DWORD"$PID)
        
$process String($result[0])
        
_loadIni()
        
$attached True
    
EndIf
EndFunc   ;==>_attach

Func _start
()
    
WinSetTitle($HWND""$title)
    
$pause False
EndFunc   
;==>_start

Func _attack
()
    
ControlSend($HWND"""""{TAB}")
    
Sleep(100)
    
ControlSend($HWND"""""{3}")
    
_gettargethp()
    While 
$targethp 0
        _gettargethp
()
        
Sleep(100)
    
WEnd
EndFunc   
;==>_attack

Func _gettargethp
()
    
Dim $BaseAdr "92DF18"
    
Dim $Path "CA0,5C,24,74,72C"
    
$result DllCall($Dll"int""ACEReadIntFromPointer""DWORD"$process"str"$BaseAdr"str"$Path)
    
$targethp String($result[0])
EndFunc   ;==>_gettargethp

Func _buffcheck
()
    For 
$i 0 To 8 Step 1
        
if ($skills[$i][3] = Or $skills[$i][3] > $skills[$i][1]) And $skills[$i][1] <> 0 Then
            ControlSend
($HWND""""$skills[$i][0])
            
Sleep(3500)
            
$skills[$i][2] = TimerInit()
        EndIf
        
$skills[$i][3] = TimerDiff($skills[$i][2]) / 1000
    Next
EndFunc   
;==>_buffcheck

Func _pause
()
    
$pause True
    WinSetTitle
($HWND"""Archlord")
EndFunc   ;==>_pause

Func _exit
()
    Exit
EndFunc   ;==>_exit

Func _loadIni
()
    
$inidatei FileOpenDialog("choose ini datei", @ScriptDir"(*.ini)"1)
    
$skills[0][0] = IniRead($inidatei"skills""key1"0)
    
$skills[0][1] = IniRead($inidatei"skills""cooldown1"0)
    
$skills[1][0] = IniRead($inidatei"skills""key2"0)
    
$skills[1][1] = IniRead($inidatei"skills""cooldown2"0)
    
$skills[2][0] = IniRead($inidatei"skills""key3"0)
    
$skills[2][1] = IniRead($inidatei"skills""cooldown3"0)
    
$skills[3][0] = IniRead($inidatei"skills""key4"0)
    
$skills[3][1] = IniRead($inidatei"skills""cooldown4"0)
    
$skills[4][0] = IniRead($inidatei"skills""key5"0)
    
$skills[4][1] = IniRead($inidatei"skills""cooldown5"0)
    
$skills[5][0] = IniRead($inidatei"skills""key6"0)
    
$skills[5][1] = IniRead($inidatei"skills""cooldown6"0)
    
$skills[6][0] = IniRead($inidatei"skills""key7"0)
    
$skills[6][1] = IniRead($inidatei"skills""cooldown7"0)
    
$skills[7][0] = IniRead($inidatei"skills""key8"0)
    
$skills[7][1] = IniRead($inidatei"skills""cooldown8"0)
    
$skills[8][0] = IniRead($inidatei"skills""key9"0)
    
$skills[8][1] = IniRead($inidatei"skills""cooldown9"0)
EndFunc   ;==>_loadIni 
06/10/2011 19:18 Ludder231#2
vllt nützt Opt("sendkeydowndelay") etwas (wenns so ricvhtig geschrieben ist :) Sonst guck in der Hilfe datei und such nah Opt
06/10/2011 19:30 Lollipop99#3
danke aber hab ich schon ausprobiert und ist denke ich auch nicht das problem, denn das spiel zeigt auch tastenanschläge an, die zu kurz sind um wirklich skills etc auszulösen
06/10/2011 19:38 | Moep |#4
Gab vor nen par Tagen erst so ein ähnliches Problem, einfach mal die Hilfe bemühen oder den Link [Only registered and activated users can see links. Click Here To Register...] folgen.
06/10/2011 19:58 Lollipop99#5
also es ist nicht so, dass bei dem Spiel controlsend() nicht funktioniert, da ich bereits bots programmiert habe, die funktioniern. Es liegt iwie am code dieses scripts

Moep sry falls ich das jetzt fasch verstanden hab, ansonsten kannst du mir das vllt nochmal genauer erklären?
06/10/2011 20:22 BlackHybrid#6
Wieso liest du immer wieder das Handel vom Aktivem Fenster aus. Setze doch einfach mal den Fensternamen ein. Vorallem wieso solltest du das Handel vom Aktiviertem Fenster auslesen, wenn du sowieso mit Control befehlen arbeitest.
06/10/2011 20:35 Lollipop99#7
Ich lese doch nur einmal HWND aus und zwar wenn ich F4 drücke und damit dem Bot ein Fenster zuweise. Außerdem kann ich nicht einfach den Fensternamen nehmen, da ich mehrere habe. Und schließlich weiß ich auch nicht, was dagegen spricht, HWND zu nehmen. Ich dachte das wär der sicherste Weg?
06/10/2011 20:43 BlackHybrid#8
Achso hab mich verkuggt :P
Also die einzigen ideen, die ich hätte wären die von Ludder und Moep, da ich soweit keinen Fehler sehe.
Oder gibt es immer bestimmte Punkte, wo es nicht geht?
06/10/2011 20:56 Lollipop99#9
also entweder alle keys kommen an, oder es kommt nichts an, was meistens der fall ist
06/10/2011 20:58 BlackHybrid#10
Hast du es schonmal probiert mit einem Fenster und dem Handel bezogen durch den Fenstertitel?
06/10/2011 21:50 Lollipop99#11
Quote:
Originally Posted by BlackHybrid View Post
Hast du es schonmal probiert mit einem Fenster und dem Handel bezogen durch den Fenstertitel?
ja das macht keinen Unterschied, und der Handle wird ja auch immer richtig ausgelesen
so grad hat es außerdem mal wieder funktioniert, ohne dass ich irgendetwas verändert habe

Ich würd ja gern mal die postmessageUDF ausprobiern, aber der Download ist irgendwie kaputt.
06/10/2011 22:15 Lollipop99#12
so also wenn ich das ganze mit 64bit ausführe oder compilieren will, meckert der rum:
Quote:
error: subscript used with non-array variable
und bezieht sich dabei auf $result[0], womit ich die Rückgabewerte der dll auslese. Wenn ich einfach $result schreibe und damit den Fehler provisorisch behebe, kommen die keys zwar an, aber ich bekomm halt beim $result nur 0 raus. Wie bekomm ich jetzt die werte, ohne dass er meckert?
06/10/2011 22:26 | Moep |#13
Probier mal das handle des derzeit aktivierten fensters mit der funktion die ich hier grad zusammengebastelt habe herrauszufinden.
Code:
#Include <Array.au3>
HotKeySet("{SPACE}","getHwndActiveWindow")
Global $aWinList, $title, $hwnd

While 1
	Sleep(100)
WEnd

Func getHwndActiveWindow()
	$aWinList = WinList()
	_ArrayDisplay ($aWinList)
	For $i = 1 To $aWinList[0][0]
		If WinActive($aWinList[$i][1]) Then
			$title = $aWinList[$i][0]
			$hwnd = $aWinList[$i][1]			
			ExitLoop
		EndIf
	Next
	MsgBox("","","title:"&$title&@CRLF&"hwnd: "&$hwnd)
EndFunc
Der Download hat bei mir auch nicht funktioniert, deshalb hab ich weiter hinten in den tread die funktion nochmal in einer anderen Version hingepackt, probier die mal. Ansonsten google/suche einfach mal nach postmessage.
06/10/2011 22:38 Lollipop99#14
danke für dein mühe moep
aber die HWND wird ja richtig abgelesen
da nun controlsend ja im 64bit modus funktioniert, müsste ich jetzt nur iwie die werte der dllfunktionen rauskriegen
06/10/2011 23:06 | Moep |#15
ahh... jetzt hab ich deinen Code erstmal richtig gelesen, Du willst die HP des Gegners auslesen und dann angreifen, richtig? Bekommst du denn mit deiner "komischen " Funktion einen ordentlichen wert raus? Pack mal zum Debuggen ne msgbox nach den auslesen rein.
Prinzipiell würde ich den Wert aber so auslesen:

Code:
#include <nomadmemory.au3>


Global $winName = "abcd"
Global $enemyHp
Global $PID = _MemoryOpen(WinGetProcess($winName))

If @error then
	MsgBox("", "ERROR", $winName & " doesnt exist")
	Exit
EndIf

While 1
	$enemyHp = _MemoryRead(_MemoryRead(_MemoryRead(_MemoryRead(_MemoryRead(_MemoryRead(0x92DF18, $PID) + 0xCA0, $PID)+ 0x5C, $PID)+ 0x24, $PID)+ 0x74, $PID)+ 0x72C, $PID)
	ToolTip($enemyHp)
WEnd
Eventuell musst du die Reihenfolge der Pointer rumdrehen, oder deine Pointer bzw Base sind falsch, außerdem brauchst du die nomadmemory.au3.