symulacja przycisku przez direct inputa?

0

otóż napisałem sobie takiego shotbota, zadaniem jego jest naciskanie lewego przycisku myszy po zobaczeniu czerwonego piksela na środku ekranu, lecz pewna gra ma na to sposób - zrobiła sobie "anti-input-mouse-simulation" tak sobie nazwę wymyśliłem, próbowałem użyć INPUT_KEYBOARD, owszem działało ale tylko do chatu w grze lub do wyświetlenia menu pod "ESC" niestety nie chciało już strzelić "MOUSE1/CTRL" czy skoczyć "SPACE". Gra najwyraźniej nie jest głupia i potrafi odróżnić symulacje od prawdziwego kliknięcia/naciśnięcia. Jest jakiś sposób aby zasymulować takie kliknięcie przez direct inputa? Oto mój kod(taki prymityw ale robi swoje xd):

#include <windows.h>
#include <gdiplus.h>
#include <iostream>
using namespace std;

const int SCREEN_X = (1024/2);
const int SCREEN_Y = (768/2);

int main(void) 
{
	// pixel detect and shooting
	HDC hdc = GetDC(0);
	short int R, G, B;
	COLORREF lcolor;
	INPUT ip;
	ip.type = INPUT_MOUSE;
	ip.mi.dx = SCREEN_X; // hardware scan code for key
    ip.mi.dy = SCREEN_Y;
    ip.mi.dwExtraInfo = 0;
	//ip.ki.wVk = 0x6A; // virtual-key code for the "mouse1" key
    ip.mi.dwFlags = MOUSEEVENTF_LEFTDOWN; // 0 for mouse click
	while(1)
	{
		Sleep(10);
		lcolor = GetPixel(hdc,SCREEN_X,SCREEN_Y);
		R = GetRValue(lcolor);
		G = GetGValue(lcolor);
		B = GetBValue(lcolor);
		if(lcolor == RGB(255, 0, 0))
		{
			Sleep(10);
			//cout << "Shot performed" << endl;
			// Press the "mouse1" key
			SendInput(1, &ip, sizeof(INPUT));
		}
	}
	return 0;
}

0

Aplikacja może:

  • odczytywać pozycje myszy i stany klawiszy asynchronicznie, obecna pozycja myszy ma się zgadzać.
  • sprawdzać czas ile czasu przycisk był naciśnięty, człowiek nie da rady nacisnąć i puścić w czasie mniejszym od 50 ms.
0

ok, to co mam pobrać pierw pozycje myszy i tam ustawić przy symulowaniu moją obecną pozycję? używam tego w grze używającej direct inputa

0
  1. Przesunąć wskaźnik myszy w odpowiednią pozycje
  2. Zapewnić aby GetAsyncKeys pokazywało to samo
  3. Zapewnić odpowiedni czas trzymania przycisku myszy w stanie DOWN.
  4. DirectInput nie wystarcza
0

zrobiłem tak jak kazałeś, zauważyłem że gra jest odporna na flagę MOUSEEVENTF_LEFTDOWN, reszta działa jednak jest mały problem, kamera w grze przestawia się w dół i nie wiadomo jak temu zaradzić, chyba został najgorszy sposób - zdobycie adresu pamięci funkcji strzelania czy coś... :p i użycie WriteProcessMemory, tylko teraz nie wiadomo czy gra nie jest na to uodporniona.

#include <windows.h>
#include <gdiplus.h>
#include <iostream>
using namespace std;

const int SCREEN_X = (1024/2);
const int SCREEN_Y = (768/2);

int main(void) 
{
	cout << "Running...";
	// pixel detect and shooting
	HDC hdc = GetDC(0);
	short int R, G, B;
	COLORREF lcolor;
	INPUT ip;
	
	POINT ptCursorPos;
	GetCursorPos(&ptCursorPos);
	ip.type = INPUT_MOUSE;
	ip.mi.dx = ptCursorPos.x; // hardware scan code for key
    ip.mi.dy = ptCursorPos.y;
    ip.mi.dwExtraInfo = 0;
    ip.mi.dwFlags = MOUSEEVENTF_LEFTDOWN; // 0 for mouse click
	/*
	ip.type = INPUT_KEYBOARD;
	ip.ki.wVk = 0x01;
    ip.ki.wScan = 0; // hardware scan code for key
    ip.ki.time = 0;
    ip.ki.dwExtraInfo = 0;
	ip.ki.dwFlags = 0; // 0 for mouse click
	*/
	while(1)
	{
		Sleep(10);
		lcolor = GetPixel(hdc,SCREEN_X,SCREEN_Y);
		GetCursorPos(&ptCursorPos);
		R = GetRValue(lcolor);
		G = GetGValue(lcolor);
		B = GetBValue(lcolor);
		if(lcolor == RGB(255, 0, 0))
		{
			Sleep(50);
			// cout << "Shot performed" << endl;
			// Press the "mouse1" key
			ip.mi.dx = ptCursorPos.x; // hardware scan code for key
			ip.mi.dy = ptCursorPos.y;
			SendInput(1, &ip, sizeof(INPUT));
		}
	}
	return 0;
}
0

Masz opuszczać i podnosić lewy przycisk, z odstępem 50 ms. Ty tylko opuszczasz. Nadal nie zrealizowałeś punktu 2. Jak czegoś nie rozumiesz to mów wprost zamiast udawać że wszystko jest git.

0

już podnosi - strzela i puszcza, niestety kamera idzie na dół w grze, nie wiem co jest

#include <windows.h>
#include <gdiplus.h>
#include <iostream>
using namespace std;

const int SCREEN_X = (1024/2);
const int SCREEN_Y = (768/2);

int main(void) 
{
	cout << "Running...";
	// pixel detect and shooting
	HDC hdc = GetDC(0);
	short int R, G, B;
	COLORREF lcolor;
	INPUT ip;
	
	POINT ptCursorPos;
	GetCursorPos(&ptCursorPos);
	ip.type = INPUT_MOUSE;
	ip.mi.dx = ptCursorPos.x; // hardware scan code for key
    ip.mi.dy = ptCursorPos.y;
    ip.mi.dwExtraInfo = 0;
    ip.mi.dwFlags = MOUSEEVENTF_MIDDLEDOWN; // 0 for mouse click
	/*
	ip.type = INPUT_KEYBOARD;
	ip.ki.wVk = 0x01;
    ip.ki.wScan = 0; // hardware scan code for key
    ip.ki.time = 0;
    ip.ki.dwExtraInfo = 0;
	ip.ki.dwFlags = 0; // 0 for mouse click
	*/
	while(1)
	{
		Sleep(10);
		lcolor = GetPixel(hdc,SCREEN_X,SCREEN_Y);
		GetCursorPos(&ptCursorPos);
		R = GetRValue(lcolor);
		G = GetGValue(lcolor);
		B = GetBValue(lcolor);
		if(lcolor == RGB(255, 0, 0))
		{
			Sleep(50);
			// cout << "Shot performed" << endl;
			// Press the "mouse1" key
			ip.mi.dx = ptCursorPos.x; // hardware scan code for key
			ip.mi.dy = ptCursorPos.y;
			ip.mi.dwFlags = MOUSEEVENTF_MIDDLEDOWN;
			SendInput(1, &ip, sizeof(INPUT));
			Sleep(50);
			ip.mi.dx = ptCursorPos.x; // hardware scan code for key
			ip.mi.dy = ptCursorPos.y;
			ip.mi.dwFlags = MOUSEEVENTF_MIDDLEUP;
			SendInput(1, &ip, sizeof(INPUT));
		}
	}
	return 0;
}
0

Napisz którego słowa nie zrozumiałeś?

0

Przesunąć wskaźnik myszy w odpowiednią pozycje
ip.mi.dx = ptCursorPos.x;
ip.mi.dy = ptCursorPos.y;

Zapewnić aby GetAsyncKeys pokazywało to samo
nie trzeba bo to sie szybko dzieje

Zapewnić odpowiedni czas trzymania przycisku myszy w stanie DOWN.
to jest Sleep(50); - chce to co 50 milisekund bo chce aby tylko raz strzeliło

DirectInput nie wystarcza
:X

czego nie zrozumiałem?:

  • nie wiem w kodzie wszystko jest dla mnie zrozumiałe ale nie działa jak należy
0
noswear napisał(a):

... nie trzeba bo to sie szybko dzieje ...
Kto ci to wmówił?

0

no teraz to mi namieszałeś w głowie a do czego mi niby potrzebny GetAsyncKeyState, kiedy ja tylko chcę naciskać określony przycisk po wykryciu czerwonego piksela na środku ekranu?

0

Tobie nie jest potrzebny zaś aplikacja bada za pomocą GetAsyncKeyState stan myszy i "widzi" że przycisk nie jest naciśnięty.

0

dobra, wszystko działa :) mam tylko problem z umiejscowieniem kursora myszy, otóż musi on być w jakimś określonym miejscu
kiedy dodaje/odejmuje tam takie liczby prawie jest OK!

ip.mi.dx = ptCursorPos.x + 130;
ip.mi.dy = ptCursorPos.y - 390;

0

SetCursorPos();

0

przecież to to samo co bym użył pi.mi.dx

0

A czy wskaźnik myszy przestawia się fizycznie w to miejsce?

0

tzn.? przesuwa się ale kamera się trzęsie a ja tylko chcę naciskać przycisk.

0

działa, ale mam pytanie, ekran mi mryga kiedy bot strzela.

0

juz sobie poradzilem, przepraszam za tripple post xD dziala i w grze posiadajacej anti-shotbota

1 użytkowników online, w tym zalogowanych: 0, gości: 1