Skocz do zawartości

Autoit Cheackbox i inne


Rekomendowane odpowiedzi

Witam.
Próbuje, próbuje i coś mi nie wychodzi xD
Napisałem jakiś tam program(bot), i są w nim różne funkcje, które się włącza klikając checkboxa (checked albo unchecked). I obok robię inputa i wpisując w niego nazwe hotkeya (np. {F2}) chcę, by kiedykolwiek kliknę tego hotkeya F2 checkbox automatycznie się sam zaznaczał/odznaczał.

Mógłbym prosić o jakieś wskazówki, najlepiej gotową funkcję?

at.gifedit
2 sprawa - za pomocą HotKeySet ustawiłem, by po kliknięciu klawisza wykonała się dana funkcja (weźmy za przykład podmianę strzałek na wsad)
HotKeySet("w", "up")
HotKeySet("a", "left")
HotKeySet("s", "down")
HotKeySet("d", "right")

Func up()
send("{up}")
EndFunc

Func down()
send("{down}")
EndFunc

Func left()
send("{left}")
EndFunc

Func right()
send("{right}")
EndFunc

Problem jest taki, że niby to działa, ale czasem po kliknięciu klawisza (wsad) postać nie wykonuje ruchu - dość często.

3 sprawa:
func nazwa($1,$2,$3,$4)
controlsend("xxx","","","{ctrldown}{down}{ctrlup}")
controlsend("xxx","","","{ctrldown}{up}{ctrlup}")
controlsend("xxx","","","{ctrldown}{left}{ctrlup}")
controlsend("xxx","","","{ctrldown}{right}{ctrlup}")
EndFunc

Czasem jakby ctrl nie zadziałał i postać zamiast wykonać obrót to się porusza (strzałka = ruch postaci, ctrl+strzałka = obrót postaci w tej grze). Dlaczego tak się dzieje?

Odnośnik do komentarza
Udostępnij na innych stronach

1 nie chce mi się szukać, kiedyś było coś takiego na forum. 

 

2 używaj  _IsPressed, jest prościej 

 

 

2  i 3

Wcale nie musi działać bo to związane jest z API gry i zabezpieczeniami. Zwykle pisze się osobną obsługę do większości gier albo steruje przez obsługę pamięci. 

Mózg to nie mydło; nie ubędzie Ci go, gdy go użyjesz.

Odnośnik do komentarza
Udostępnij na innych stronach

No to ci wyraźnie napisałem , trzeba znać metodę i sposób wysyłania danych by działało z określoną grą. W starych grach bez problemu działało controlsend do okna gry czy zmodyfikowane udf typu sendkey, presskey itp. 

 

100% działającą metodą jest prawie zawsze obsługa pamięci np nomadmemory czy używanie hooków klawiatury .

 

Na forum Autoit jest dożo dostępnych rozwiązań gotowych, poszukaj i sprawdzaj sobie w grze czy działa obsługa klawiatury.

Ewentualnie masz duże forum z grami elitepvpers to szukaj gotowego rozwiązania jeśli jest do tej gry. 

 

Pierwszym problemem co zwykle musisz ominąć to zabezpieczenia gry ( bypass ) drugim w kolejności zabezpieczenia klawiatury. Gdy to już masz albo nie ma tego w grze dalsza obsługa gry jest tylko kwestią dobrania sposobu obsługi. 

Mózg to nie mydło; nie ubędzie Ci go, gdy go użyjesz.

Odnośnik do komentarza
Udostępnij na innych stronach

Właśnie wróciłem do domu, zaraz sprawdzę 1 i 2, a co do 3 - OTS, OTC (a sprawdzę czy na zwykłym działa normalnie)

 

@Edit

Sprawdziłem punkt 2 - na normalnym kliencie działa bez problemu, problem jest na OTC

Co do controlsenda - hmm, ale muszę w nim podać nazwę programu(w tym przypadku klienta) prawda?, a chciałbym by było to raczej uniwersalne pod tego czy innego clienta

 

@Edit2

No właśnie korzystałem z tej funkcji, ale nie bardzo wiem jak to napisać by było ok(dopiero uczę się autoit)

HotKeySet("3", $GUI_CHECKED)

 

Func checked($1,$2)
GUICtrlSetState($hCheck1) = 1
;GUICtrlSetState($Checkbox1, $GUI_CHECKED)
EndFunc
 
Próbowałem tak i jeszcze inaczej, ale ciągle coś nie tak(od razu mówię, że wypisałem niezależne od siebie próby, to nie jest całość). A to sama funkcja zaznaczania miała być, a jeszcze trzeba wymyślić, żeby po następnym odznaczeniu odznaczało.
Odnośnik do komentarza
Udostępnij na innych stronach

Zwykly Send nie dziala na zminimalizowanym oknie, wiec i tak musisz wykorzystac controlsend i tak.

 

Przykład z checkboxem:

#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>

HotKeySet("{HOME}", ToggleCheckbox)

Example()

Func Example()
	; Create a GUI with various controls.
	Local $hGUI = GUICreate("Example", 300, 200)

	; Create a checkbox control.
	Global $idCheckbox = GUICtrlCreateCheckbox("Standard Checkbox", 10, 10, 185, 25)
	Local $idClose = GUICtrlCreateButton("Close", 210, 170, 85, 25)

	; Display the GUI.
	GUISetState(@SW_SHOW, $hGUI)
	; Loop until the user exits.
	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE, $idClose
				ExitLoop

		EndSwitch
	WEnd

	; Delete the previous GUI and all controls.
	GUIDelete($hGUI)
EndFunc   ;==>Example

Func _IsChecked($idControlID)
	Return BitAND(GUICtrlRead($idControlID), $GUI_CHECKED) = $GUI_CHECKED
EndFunc   ;==>_IsChecked

Func ToggleCheckbox()
	If _IsChecked($idCheckbox) Then
		GUICtrlSetState($idCheckbox, $GUI_UNCHECKED)
	Else
		GUICtrlSetState($idCheckbox, $GUI_CHECKED)
	EndIf
EndFunc   ;==>ToggleCheckbox

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Dziękuję bardzo Pawellek - problem numer 1 już rozwiązany, teraz zajmę się problemem numer 2.

Tak jak mówiłem, na zwykłym kliencie działa okey, na OTC są problemy.

Spróbuję z tym controlsend, ale tak jak mówiłem wolałbym żeby to było bardziej uniwersalne (jak klient nie jest aktywny to nie potrzebuję by to działało, bo po co?). Także nie można by użyć czegoś innego bez przypisywania konkretnego programu/clienta?

 

PS gdybym chciał korzystać z isPressed to tak to ma wyglądać? Bo coś mi nie działało(nie zagłębiałem się za bardzo, tak na szybko napisałem i nie śmigało)

If _IsPressed("57") Then ;w
send("{up}")
elseIf _isPressed("53") Then ;s
send("{down}")
elseIf _isPressed("41") Then ;a
     send("{left}")
elseIf _isPressed("57") Then ;d
     send("{right}")
    EndIf
Odnośnik do komentarza
Udostępnij na innych stronach

To elseIf zamień na if nie używasz przecież warunków  

 

Cały czas masz jedną wadę takie rozwiązania mozna tylko jeden klawisz nacisnąć czyli ruch po skosie wykluczony 

Mózg to nie mydło; nie ubędzie Ci go, gdy go użyjesz.

Odnośnik do komentarza
Udostępnij na innych stronach

Problem 2 - controlsend działa świetnie, tylko tak jak pisałem, wolałbym żeby to działało tylko jak okno gry jest aktywne. Jakieś rozwiązanie?

Ktosiu - no tak, dziękuję. A co do ruchu po skosie - faktycznie, fajnie żeby np. w+d = skos w prawa-góra. Spróbuję to rozwiązać sam, jak się nie uda to się zgłoszę.

Odnośnik do komentarza
Udostępnij na innych stronach

@Edit

Sprawdziłem punkt 2 - na normalnym kliencie działa bez problemu, problem jest na OTC

Na niektórych ots (np. Medivia) tak jest, też nie znalazłem rozwiązania na to :/

@Edit

Co do controlsenda - hmm, ale muszę w nim podać nazwę programu(w tym przypadku klienta) prawda?

Możesz też użyć classu aplikacji, bierzesz go z tej apki fhiRjr6.png

$hWnd = "[CLASS:clssapk]"

a chciałbym by było to raczej uniwersalne pod tego czy innego clienta

Jeżeli chcesz żeby działało na MC to użyj PID'u, tutaj masz kod bota, który jest na tej zasadzie napisany.

 

Odnośnik do komentarza
Udostępnij na innych stronach

Co do classu aplikacji - tak, ale chodzi mi by nie było to podpięte pod aplikację tylko działało wyłącznie jak aplikacja jest używana - czyli aktywna/na wierzchu(zapobiega to temu, że przeglądam Internet piszę coś w google, a postać mi się rusza, bo nacisnąłem "w").

O to tylko chodzi i jeszcze o to, bym przy ewentualnej nazwie clienta nie musiał komuś podsyłać "poprawionej wersji", bo muszę zmienić w skrypcie nazwę aplikacji(tu - klienta).

 

@Edit

Chyba, że dodać jakąś funkcję w tej Func ToggleCheckbox() np. "jeśli program jest aktywny/na wierzchu to użyj funkcji stop_hotkeye()"? Ale mógłby ktoś jakiegoś gotowca podesłać?

 

 

A wracając do tamtego kodu, dobrze jest teraz? Bo nadal nie działa:

func podmiana_start() ;2 opcja
    If _IsPressed("57") Then ;w
        send("{up}")
        EndIf
    If _isPressed("53") Then ;s
        send("{down}")
        EndIf
    If _isPressed("41") Then ;a
     send("{left}")
        EndIf
    If _isPressed("57") Then ;d
     send("{right}")
        EndIf
    EndFunc
;;;;;;;;;;;;;;;;
Odnośnik do komentarza
Udostępnij na innych stronach

A coś takiego. Sprawdzone i działa, ale zobacz czy o to ci chodziło.

HotKeySet("{ESC}", "end")
HotKeySet("w", "up")
HotKeySet("s", "down")
HotKeySet("a", "left")
HotKeySet("d", "right")

While True
	Sleep(50)
WEnd



Func up()
	send("{UP}")
EndFunc

Func down()
	send("{DOWN}")
EndFunc

Func left()
	send("{LEFT}")
EndFunc

Func right()
	send("{RIGHT}")
EndFunc

Func end()
	Exit
EndFunc
Odnośnik do komentarza
Udostępnij na innych stronach

Ooo - o dziwo zmiana up na UP i analogicznie pozostałych rozwiązało problem. Bardzo dziękuję wasta.

Problem 1 i 2 rozwiązane.

 

Jeszcze został problem 3. Podmieniłem na:

	controlsend("nazwa","","","{CTRLDOWN}{DOWN}{CTRLUP}")
	controlsend("nazwa","","","{CTRLDOWN}{UP}{CTRLUP}")
	controlsend("nazwa","","","{CTRLDOWN}{LEFT}{CTRLUP}")
	controlsend("nazwa","","","{CTRLDOWN}{RIGHT}{CTRLUP}")

Lecz niestety nie zdało to rezultatu. Co jakiś czas(testowo ustawiam, by postać ruszała się co 1sec) postać zamiast się obracać zmienia pozycję o 1 kratkę do przodu.

Odnośnik do komentarza
Udostępnij na innych stronach

controlsend("nazwa","","","{CTRLDOWN}")
Sleep(50)
controlsend("nazwa","","","{DOWN}")
controlsend("nazwa","","","{UP}")
controlsend("nazwa","","","{LEFT}")
controlsend("nazwa","","","{RIGHT}")
controlsend("nazwa","","","{CTRLUP}") 

Ewentualnie PostMessage/SendMessage.

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Taki sam efekt, postać chodzi zamiast stać w miejscu i się obracać.

 

@Edit

Wygląda na to, że poradziłem sobie wrzucając wszystko do jednej linijki w controlsendzie  xD Także problem rozwiązany. Dziękuję bardzo wszystkim pomagającym.

Co najważniejsze już zrobione, teraz mam jeszcze kilka dodatkowych pytań.

 

1. Jak zrobić by po wciśnięciu

w+d postać szła w prawy górny ukos,

w+a postać szła w lewy górny ukos,

s+d postać szła w prawy dolny ukos,

s+a postać szła w lewy dolny ukos.

Nie mogę sobie z tym poradzić, w ogóle postać idzie na ukos, gdy numlock jest wyłączony, czyli po wciśnięciu na numelocku 7,9,1,3 mogę sterować ukosami.

Próbowałem wpisać {NUMEPAD9} w sendzie, ale to pisze mi "9", zamiast iść na skos. Nie działa. W dodatku nie wiem jakiej funkcji użyć by było "w+d", czyli 2 literki - nie chciałbym w controlsendzie, tylko coś na zasadzie send(czyli bez podpinania się pod konkretnego klienta).

 

2. Macie jakiś pomysł/gotowca na zabezpieczenie, by ze skryptu mogły korzystać tylko osoby przeze mnie wybrane? Tzn. może jakaś funkcja wyłączająca bota po miesiącu? (Tylko, żeby nie dało się obejść usuwając rejestr).

Po prostu nie chcę bym dał koledze, a on rozdał go na prawo i lewo.

Albo jakieś inne zabezpieczenie?

Kod aktywujący na miesiąc, może jakiś identyfikator numeru SID? 

No macie jakiś ciekawy pomysł? (To tak przyszłościowo, bo planuję rozbudować funkcję bota)

Odnośnik do komentarza
Udostępnij na innych stronach

1.

#include <SendMessage.au3>
#include <WindowsConstants.au3>
#include <APISysConstants.au3>
#include <WinAPI.au3>
#include <WinAPISys.au3>
#include <WinAPIvkeysConstants.au3>

While 1
	Sleep(100)
	If BitAND(_WinAPI_GetAsyncKeyState($VK_W), 0x8000) <> 0 And BitAND(_WinAPI_GetAsyncKeyState($VK_D), 0x8000) <> 0 Then _Send($VK_PRIOR) ;prawy gorny ukos
	If BitAND(_WinAPI_GetAsyncKeyState($VK_W), 0x8000) <> 0 And BitAND(_WinAPI_GetAsyncKeyState($VK_A), 0x8000) <> 0 Then _Send($VK_HOME) ; lewy górny ukos
	If BitAND(_WinAPI_GetAsyncKeyState($VK_S), 0x8000) <> 0 And BitAND(_WinAPI_GetAsyncKeyState($VK_D), 0x8000) <> 0 Then _Send($VK_NEXT) ; prawy dolny ukos
	If BitAND(_WinAPI_GetAsyncKeyState($VK_S), 0x8000) <> 0 And BitAND(_WinAPI_GetAsyncKeyState($VK_A), 0x8000) <> 0 Then _Send($VK_END) ; lewy dolny ukos
WEnd

Func _Send($key)
	Local $HWND = WinGetHandle("[ACTIVE]")
	_SendMessage($HWND, $WM_KEYDOWN, $key, _MakeLong(1, _WinAPI_MapVirtualKey($key, $MAPVK_VK_TO_VSC)))
	Sleep(50)
	_SendMessage($HWND, $WM_KEYUP, $key, _MakeLong(1, _WinAPI_MapVirtualKey($key, $MAPVK_VK_TO_VSC)) + 0xC0000000)
EndFunc

Func _MakeLong($LoDWORD, $HiDWORD)
    Return BitOR($HiDWORD * 0x10000, BitAND($LoDWORD, 0xFFFF))
EndFunc

2. https://www.pelock.com/pl/produkty/autoit-obfuscator 

 + https://www.autoitscript.com/forum/topic/31020-xprotecau3-automated-protect-and-get-paid/ jesli jeszcze dziala. Jak nie to google -> hwid i sam sobie musisz zabezieczyc.

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

1. Tylko w tej chwili jak wciskam np. w+d to faktycznie idzie tak jak ma iść, z tym, że w czacie(gry) pojawiają mi się te literki. Mógłbyś jakoś to zmodyfikować, by się nie pojawiały? Bo sam sobie nie mogę poradzić.

 

@Edit

Aha, bo pewnie za chwilę będę miał problem następny. To powinno działać tylko jeśli checkbox jest zaznaczony, więc trzeba dopisać w środku jeszcze

<> 0 And BitAND(GUICtrlRead($idControlID), $GUI_CHECKED) = $GUI_CHECKED

Tak?

Czy samo:

<> 0 And BitAND(GUICtrlRead($idControlID), $GUI_CHECKED)

?

Odnośnik do komentarza
Udostępnij na innych stronach

Rozwiązałem problem, więc usuwam co tu pisałem.

 

@Edit

Super, wszystko działa.

Może jeszcze się ktoś orientuje, na temat dobrego, darmowego obfuscatora? Podlinkuje ktoś?

I jeszcze może pytanko o takie zjawisko jak dash - czyli, że postacie w grze chodzą szybciej niż powinny. Można

to jakoś ogarnąć? Można by ustawić mniejsze opóźnienie klawiszy, a są jakieś inne sposoby?

Odnośnik do komentarza
Udostępnij na innych stronach

~2 lata temu chyba wszystkie darmowe obfuscatory sprawdzilem i ogolnie to byly nic nie warte. :( 

Wiekszosc z nich zmienia po prostu nazwe zmiennych i funkcji... juz wbudowany w SciTE stripper jest lepszy. Z kolei te lepsze jak np. M3CO powoduja rozjezdzanie sie GUI lub "psuja" niektore funkcje programu bez errorow podczas kompilacji. 

http://www.elitepvpers.com/forum/autoit/2728725-how-solutions-prevent-stealing-your-autoit-code.html

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający forum Autoit Cheackbox i inne   0 użytkowników
    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...