Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 01:53

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[MFC/C++] Class: CBotEngine

Discussion on [MFC/C++] Class: CBotEngine within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1

 
Adroxxx's Avatar
 
elite*gold: 15
Join Date: Nov 2005
Posts: 13,021
Received Thanks: 5,324
[MFC/C++] Class: CBotEngine

[MFC/C++] Class: CBotEngine

Hier mal eine recht simple Klasse um das Bot schreiben zu vereinfachen. Natürlich ist es sehr primitiv aber vielleicht hilft es dem ein oder anderen.


#Inhalt:
[-]Klassenbeschreibung
[-]Beispielcode/Benutzung
[-]Nachwort



[-]Klassenbeschreibung


Die Klasse ist in Visual C++ (MFC) geschrieben und Unicode kompatibel.

Zur Zeit hat es nur 6 Funktionen:

SendKey(), um einen Tastendruck zu simulieren mit VKs.
SendText(), um einen ganzen Text zu senden bzw. einen CString.
TargetWindow(), um ein Fensterhandle zu holen.
MemoryRead(), um eine Adresse auszulesen.
sRead(), um aus einer ini Datei Werte zu lesen.
MouseClick(), um einen Mausklick zu simulieren.

Die Funktionen wurden in der Klasse so weit wie möglich vereinfacht, damit man sie leicht benutzten kann. Außerdem sind die Funktionen so programmiert, dass sie im Hintergrund laufen. Sprich wenn der Bot läuft, könnt ihr das Spiele Fenster minimieren und etwas anderes machen.

CBotEngine.h:
PHP Code:
#pragma once

/***************************************************************************
* CBotEngine v 1.0
*    SendKey() Sendet einen Tastendruck. Benutztung mit Virtual Key Codes
*    SendText() Sendet einen Text. Benutzung mit CString
*    TargetWindow() Holt sich den Window Handle
*    MemoryRead() Liest Speicheradresse aus
*    sRead() Liest einen String aus einer INI Datei aus
*    MouseClick() Maus macht einen Klick an einer bestimmten Koordinate
***************************************************************************/
class CBotEngine
{
public:
    
CBotEngine(void);
    ~
CBotEngine(void);


    
void SendKey(unsigned int KEYDWORD DELAY=20);
    
void SendText(CString strText);
    
void TargetWindow(CString strWnd);
    
int MemoryRead(unsigned address);
    
CString sRead(CString strIniNameCString AppNameCString KeyName);
    
void MouseClick(int xPosint yPosDWORD DELAY=100);
    

    
CWnd *pWnd;
    
HWND hWnd;
    
DWORD procID;
}; 
CBotEngine.cpp
PHP Code:
#include "StdAfx.h"
#include "BotEngine.h"
#define BUFSIZE MAX_PATH


CBotEngine::CBotEngine(void)
{
}

CBotEngine::~CBotEngine(void)
{
}

void CBotEngine::SendKey(unsigned int KEYDWORD DELAY)
{

    
LPARAM pmLparam = (::MapVirtualKey(KEY,0)<<16);
    
    
pWnd->PostMessage(WM_KEYDOWN,0,pmLparam);
    
pWnd->PostMessage(WM_CHAR,0,pmLparam);
    
Sleep(DELAY); 
    
pWnd->PostMessage(WM_KEYUP,0,pmLparam);
         
}

void CBotEngine::TargetWindow(CString strWnd)
{
    
    if (
pWnd CWnd::FindWindowExW(NULL,NULL,NULL,strWnd)) {
        
        
hWnd HWND(pWnd->GetSafeHwnd()); 
        
GetWindowThreadProcessId(hWnd,&procID);
        
    }else{
    
AfxMessageBox(_T("Fenster nicht gefunden!"));
    }
    
}

int CBotEngine::MemoryRead(unsigned address)

{
    
int i;
    
DWORD numBytesRead;
    
    
GetWindowThreadProcessId(hWnd,&procID);
    
HANDLE hProc OpenProcess(PROCESS_ALL_ACCESSFALSEprocID);
    
ReadProcessMemory(hProc, (LPCVOID)address, &isizeof(i), &numBytesRead);
    
CloseHandle(hProc);

    return 
i;

    
}

CString CBotEngine::sRead(CString strIniNameCString AppNameCString KeyName)
{

    
    
CString strBuf;
    
TCHAR cDic[BUFSIZE];
    
    
GetCurrentDirectoryW(BUFSIZE,cDic);
    
CString sDic CString(cDic);

    
sDic.Format(_T("%s\\%s"),cDic,strIniName);
    
GetPrivateProfileString(AppName,KeyName,_T(""),strBuf.GetBuffer(254),254,sDic);
    
    return 
strBuf;
}

void CBotEngine::MouseClick(int xPosint yPosDWORD DELAY)
{
    
pWnd->SendMessage(WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(xPos,yPos));
    
Sleep(DELAY);  
    
pWnd->SendMessage(WM_LBUTTONUP,MK_LBUTTON,MAKELPARAM(xPos,yPos));
}



void CBotEngine::SendText(CString strText)
{
    
    
unsigned int *iText;
    
iText = new unsigned int[strText.GetLength()];

    for (
int i =0;<= strText.GetLength();i++)
    {
        
iText[i] = strText[i];
        
pWnd->PostMessage(WM_KEYDOWN,iText[i],0);
        
Sleep(70);
    }



[-]Beispielcode/Benutzung


Ihr müsst als erstes die CBotEngine.h und CBotEngine.cpp in euer Projekt einbinden. Im Anhang hab ich diese nochmal gepackt und dort ist auch eine VKC.h die nochmal die Virutal Key Codes beinhaltet, da (bei mir jedenfalls) in MFC nicht alle Codes definiert sind. Nachdem ihr die Header eingebunden habt, braucht ihr nur euer Objekt erstellen und könnt dann die Funktionen nutzen.

Beispielcode:
Fensterhandle holen und Key Senden, Text Senden

PHP Code:
CBotEngine MyBot/* Objekt wird erstellt */
CString WindowName _T("MeinSpiel"); /* CString Variable mit Namen des Spiels wird erstellt */
CString CustomText _("/giveup"); /* CString Variable mit einem Text wird erstellt */

MyBot.TargetWindow(WindowName); /* CBotFunktion wird aufgerufen und die Variable WindowName übergeben, jetzt haben wir das Handle um an das Fenster senden zu können */

MyBot.SendKey(VK_I); /* Simuliert den Tastendruck, der Taste I und sendet ihn an das Spielefenster. Zum Beispiel um das Inventar zu öffnen */
Sleep(200); /* Damit die nächste Taste nicht zu schnell hintereinander kommt, brauchen wir hier ein Sleep um eine verzögerung rein zu bringen */
MyBot.SendKey(VK_RETURN); /* Drückt die Enter Taste um z.B. den Chat zu öffnen */
Sleep(200);
MyBot.SendText(CustomText); /*Sendet den Inhalt der Variable Custom Text an die Funktion. Das heißt in userem Fall es wird "/giveup" in den Chat eingegeben */
Sleep(200);
MyBot.SendKey(VK_RETURN/* Es wird nochmal Enter gedrückt. Text im Chat wird also abgeschickt */ 


Beispielcode #2:

Werte aus einer INI Datei Lesen.

Sagen wir unsere INI Datei (settings.ini) ist so aufgebaut:
Code:
[SETTINGS]
Sprache=0
AnzahldRunden=40
Verkaufen=1

[MEMORY]
posx=0x41000
posy=0x41004
Können wir das so auslesen:
PHP Code:
CBotEngine rd// Unser Objekt
CString ininame _T("settings.ini"); //Name der Ini datei
CString section[2] = {_T("SETTINGS"),_T("MEMORY")};
CString key[5] = {_T("Sprache"),_T("AnzahldRunden"),_T("Verkaufen"),_T("posx"),_T("posy")};


m_strSprache rd.sRead(ininame,section[1],key[1]);
m_strRunden rd.sRead(ininame,section[1],key[2]);
m_strVerkauf rd.sRead(ininame,section[1],key[3]);
m_strPosx rd.sRead(ininame,section[2],key[1]);
m_strPosy rd.sRead(ininame,section[2],key[2]); 
So könnt ihr mit Arrays auch mehrere INI dateien auslesen. Wenn ihr z.B. eine update.ini und settings.ini habt, macht ihr CString ininame auch als array und packt beide rein und beim auslesen macht ihr ininame halt auch als array.



[-]Nachwort


Die Klasse sollte eigentlich bei allen Spielen Funktionieren. Ich hoffe ich konnte euch damit etwas Arbeit ersparen. Auch wenn diese Klasse nicht das Gelbe vom Ei ist.

Für Verbesserungsvorschläge bin ich offen

So far,
Adroxxx
Attached Files
File Type: rar CBotEngine.rar (1.6 KB, 261 views)
Adroxxx is offline  
Thanks
16 Users
Old 07/11/2009, 04:29   #2
 
elite*gold: 0
Join Date: Sep 2006
Posts: 248
Received Thanks: 110
1. ) delete[] iText in SendText vergessen?
2. ) zu deinem dtor: Rule of three (C++ programming) - Wikipedia, the free encyclopedia
3. ) CBotEngine(void); sowas machte man frueher in c, aber nicht in C++.
4. ) Wieso definierst du den ctor/dtor obwohl du garnix drin machst? ^^


Ansonsten nett, obwohl ich persoenlich kein MFC fan bin. ^^
backo is offline  
Old 07/11/2009, 11:52   #3

 
Adroxxx's Avatar
 
elite*gold: 15
Join Date: Nov 2005
Posts: 13,021
Received Thanks: 5,324
Ja MFC ist Geschmackssache. Ich wurde in der Vergangenheit über Jahre gezwungen MFC zu benutzten, deswegen bin ich auch dabei geblieben. Eigentlich nur aus der Gemüdlichkeit heraus. Wobei eigentlich in dem Source nur CWnd wirklich MFC Spezifisch ist. Kann man also ohne viel Aufwand umschreiben um es auch ohne MFC nutzen zu können.

So ein delete wär wohl nicht schlecht bei SendText. Danke. Hab die Klasse mal so nebenbei geschrieben und eigentlich auch noch nie wirklich verwendet. Nur testweise.

Ja das void kann man weg lassen, muss man aber nicht. Hat soweit ich weiß keinen Einfluss auf die Funktionalität.

ctor und dtor werden bei Visual Studio automatisch mit angelegt wenn man eine Klasse erstellt. Und bin zu faul des weg zu löschen :P ^^

Wie gesagt die Klasse ist nix tolles, bietet aber Leuten die vorher noch nie einen Bot programmiert haben, einen kleinen Einstieg. Ob sie jetzt die Klasse benutzten oder sich nur die Funktionen anschauen und selber nachbauen.
Adroxxx is offline  
Old 07/11/2009, 17:48   #4
 
elite*gold: 0
Join Date: Sep 2006
Posts: 248
Received Thanks: 110
Quote:
Originally Posted by Adroxxx View Post
Ja MFC ist Geschmackssache. Ich wurde in der Vergangenheit über Jahre gezwungen MFC zu benutzten, deswegen bin ich auch dabei geblieben. Eigentlich nur aus der Gemüdlichkeit heraus. Wobei eigentlich in dem Source nur CWnd wirklich MFC Spezifisch ist. Kann man also ohne viel Aufwand umschreiben um es auch ohne MFC nutzen zu können.

So ein delete wär wohl nicht schlecht bei SendText. Danke. Hab die Klasse mal so nebenbei geschrieben und eigentlich auch noch nie wirklich verwendet. Nur testweise.

Ja das void kann man weg lassen, muss man aber nicht. Hat soweit ich weiß keinen Einfluss auf die Funktionalität.

ctor und dtor werden bei Visual Studio automatisch mit angelegt wenn man eine Klasse erstellt. Und bin zu faul des weg zu löschen :P ^^

Wie gesagt die Klasse ist nix tolles, bietet aber Leuten die vorher noch nie einen Bot programmiert haben, einen kleinen Einstieg. Ob sie jetzt die Klasse benutzten oder sich nur die Funktionen anschauen und selber nachbauen.
Man sieht das du dich am meisten mit MFC beschäftigt hast, sieht man ja da du die Ungarische Notation vorziehst, wie jeder MFC typ ^^. Ansonsten, zum jeden "new" muss ein "delete" kommen, dass gleiche gilt für "new []" & "delete []" Ich denke mal, dass du das allerdingst schon wusstest, wollts nur mal andeuten, für die anderen die sich den thread anguggn. Ein tipp, du könntest dir "visual assist x" runterladen, top plugin für ms vs, viel besser als die intellisense von ms. Nun, muss weg, cu.
backo is offline  
Thanks
1 User
Old 07/12/2009, 13:09   #5

 
Adroxxx's Avatar
 
elite*gold: 15
Join Date: Nov 2005
Posts: 13,021
Received Thanks: 5,324
Danke für den Tipp Werde es mir mal laden.
Adroxxx is offline  
Old 12/01/2009, 14:55   #6
 
darkMedic's Avatar
 
elite*gold: 0
Join Date: Oct 2009
Posts: 17
Received Thanks: 0
wird die engine eventuell noch erweitert?
darkMedic is offline  
Old 12/01/2009, 17:18   #7

 
Adroxxx's Avatar
 
elite*gold: 15
Join Date: Nov 2005
Posts: 13,021
Received Thanks: 5,324
Quote:
Originally Posted by darkMedic View Post
wird die engine eventuell noch erweitert?
Hm ne eigentlich nicht =d Wer lust hat kann sie selbst erweitern. Deswegen auch opensource.

Was fehlt denn deiner Meinung nach noch?
Adroxxx is offline  
Old 12/07/2009, 15:25   #8
 
darkMedic's Avatar
 
elite*gold: 0
Join Date: Oct 2009
Posts: 17
Received Thanks: 0
MemoryWrite währe sicher ganz interessant.
darkMedic is offline  
Old 12/07/2009, 16:53   #9
 
Gianotti's Avatar
 
elite*gold: 20
Join Date: Mar 2008
Posts: 1,455
Received Thanks: 140
Quote:
Originally Posted by darkMedic View Post
MemoryWrite währe sicher ganz interessant.
writeprocessmemory o0
Gianotti is offline  
Old 12/07/2009, 16:54   #10

 
Adroxxx's Avatar
 
elite*gold: 15
Join Date: Nov 2005
Posts: 13,021
Received Thanks: 5,324
Naja, kann man die MemoryRead Funktion kopieren und nach Write umschreiben.
Und beim Botschreiben wird ja eher der Speicher gelesen als geschrieben.
Adroxxx is offline  
Old 12/07/2009, 17:25   #11
 
darkMedic's Avatar
 
elite*gold: 0
Join Date: Oct 2009
Posts: 17
Received Thanks: 0
manchmal ist es aber vorteilhafter( vonner Schnelligkeit her) memory zu schreiben, z.b bei nem Angel Bot.
darkMedic is offline  
Old 12/13/2009, 23:23   #12
 
elite*gold: 0
Join Date: Sep 2009
Posts: 138
Received Thanks: 14
ich find es gut, eine funktion um eine ini zu schreiben wäre vllt noch sinnvoll da man bei einem bot ja auch einstellungen speichert, ist benutzerfreundlicher wenn man das über eine GUI macht als dass die user selbst in der ini rumpfuschen ^^ aber die funktion kann man ja auch selbst einbauen, die funktion zum lesen ist ja schon da kann man ja fast kopieren xD
Neyoel is offline  
Old 12/18/2009, 08:24   #13
 
Arcо's Avatar
 
elite*gold: 0
Join Date: Oct 2009
Posts: 8,783
Received Thanks: 5,304
Oooh this is simple but fairly enough to teach others how to start creating bots.
Great release. I love it.
Arcо is offline  
Reply


Similar Threads Similar Threads
what is the best class to grind metin2 yang(class selection guide for newbies)
07/07/2012 - Metin2 - 1 Replies
Again, I am using Enligsh. So if you cant read it well, just turn to google online translation. If i am supposed to say or answer what is the best class for grinding metin2 yang in Metin2, of course the most efficiently, i strongly recommand the Warrior, and promote to Sword Warrior at level 5. This class has both high defense and attack, as well as great area attack skill and control skill(I mean the stun skill). I recommend the BM sura as your second choice,because he has the sweetest...
WTB ANY CLASS LEVEL 100+ FOR LAST CHAOS ETERNIA!!!! ANY CLASS WTB WITH OR WITHOUT EQ
06/26/2010 - Last Chaos Trading - 0 Replies
What the title says, however the account for sale must not be past like £40, paypal will do and middleman the account must not been under any suspicon or anything!!
ANybody Knows how to change class to another class
08/20/2009 - Cabal Online - 5 Replies
I ve been wondering if a WA could wear a martial set or a wizard could wear battleset..Any one knows how to change class? ;)
Pet Class
06/10/2009 - Rappelz - 3 Replies
Hi people, I want to know, what kind of pet class should I pick - I only thinks about GAIA and DEVA one, to be honest I don't like ASURA as much as these two :). So... what should I pick - evoker or breeder? What's the + and - of these two?
Class change to TBC Class (bloodelf & Danei)
11/03/2006 - World of Warcraft - 127 Replies
habe das hier vor kurzem mal im icq gesendet bekommen, hoffe das steht hier noch net ^^ es ist zwar buggy z.b. wenn ihr ein troll mit tatoos in der fratze habt usw aber man kann es durch aus usen. am besten neuen char machen und richtig einstellen :). Anleitung: ladet die datei runter in euer World of Warcraft&#092;Data ordner und benennt sie in speech2.mpq um, dan einfach in wow einloggen wenn es ein stick wert ist bitte sticken :)



All times are GMT +1. The time now is 01:55.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.