2012-12-03 18 views
5

Oyuna enjekte ettim .dll yaptım. Alt + s tuşlarına bastığımda piksel tespitini çalıştırıyor ama oyun laggs. Düzeltmek için herhangi bir olasılık var mı?Oyun laken kodumu enjekte ettikten sonra

Kırmızı renk algılar, fare3 basar ve oyun içi çeker, ancak çok yavaştır ve oyun geciktirir.

Sleep() öğesini kaldırmayı denedim ancak daha fazla gecikti. Baska öneri?

#include <windows.h> 
#include <gdiplus.h> 

const int SX = GetSystemMetrics(SM_CXSCREEN); 
const int SY = GetSystemMetrics(SM_CYSCREEN); 

const int SCREEN_X = (SX/2); 
const int SCREEN_Y = (SY/2); 
const COLORREF red=RGB(255, 0, 0); 
const int Sound[]={SND_ALIAS_SYSTEMASTERISK,SND_ALIAS_SYSTEMEXCLAMATION}; 
const int State[]={MOUSEEVENTF_MIDDLEDOWN,MOUSEEVENTF_MIDDLEUP}; 

bool PixelCheck(HDC hdc) 
{ 
    time_t stop=GetTickCount()+50; 
    bool result=false; 
    while(GetTickCount()<stop) if(GetPixel(hdc,SCREEN_X,SCREEN_Y) == red) result=true; 
    Sleep(1); 
    return result; 
} 

DWORD WINAPI ThreadFunction(PVOID pvParam) 
{ 
    HDC hdc=GetDC(0); 
    bool shotbot=false,isdown=false; 
    INPUT ip; 
    ip.type=INPUT_MOUSE; 
    ip.mi.dx=0; 
    ip.mi.dy=0; 
    ip.mi.dwExtraInfo=0; 
    while(true) 
    { 
     if(GetAsyncKeyState(0xA4) && GetAsyncKeyState(0x53)) 
     { 
      shotbot=!shotbot; 
      PlaySound((LPCSTR)Sound[shotbot],NULL,SND_ALIAS_ID); 
     } 
     Sleep(1); 
     if((shotbot&&PixelCheck(hdc))||isdown) 
     { 
      ip.mi.dwFlags=State[isdown]; 
      SendInput(1,&ip,sizeof(INPUT)); 
      isdown=!isdown; 
     } 
    } 
    ReleaseDC(0, hdc); 
    return 0; 
} 

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) 
{ 
    if(fdwReason==DLL_PROCESS_ATTACH) SetThreadPriority(CreateThread(0,0,ThreadFunction,0,0,NULL),THREAD_PRIORITY_NORMAL); 
    return TRUE; 
} 
+0

İplik numaranızı daha az sıklıkta arayın. –

cevap

4

Hiçbir şey yapmıyorsunuz ancak 50 milisaniye boyunca GetPixel() numaralı telefonu arayın. Tam 50 milisaniyelik bir gecikme var. Ne bekliyordun?

Sleep numaralı çağrıyı kaldırmak yalnızca daha sık ve her seferinde 50 milisaniye süreniz anlamına gelir. Bu da bekleniyor.

1

bazı noktalar:

1) Kişisel süre döngü yoğun sıkı ve CPU olduğunu. Bunu destekleyen bir işlemci varsa, bir HBITMAP

piksel değerini okumak için daha hızlı bir yolu olabilir ,, ( ::YieldProcessor()) orada __mm_pause içsel koymak veya ::SwitchToThread()

2) GetPixel müthiş yavaş IIRC olduğunu denemek

İlgili konular