C++ SendMEssage Problem

02/10/2010 21:15 Σternαl.#16
Werd ich mal machen, brauch ich dann immernoch den
Key, den Adroxxx gepostet hat?
Btw wo bei Adroxxx Beispiel muss ich eintragen,
welche Taste gedrückt werden soll?
Und ist das ok, wenn vor dem lParam NULL steht?
02/10/2010 21:33 flo8464#17
Probier es mal so:

Code:
void sendKeystroke(char character)
{
    LPARAM keystroke = LOWORD(VkKeyScanA(character));

    SendMessage(wHandle, WM_KEYDOWN, NULL, keystroke);
    SendMessage(wHandle, WM_CHAR, NULL, keystroke);
    Sleep(20);
    SendMessage(wHandle, WM_KEYUP, NULL, keystroke);
}
Edit: Upps, das ist praktisch der Code von Androxx, nur anders verpackt. ;)
02/10/2010 21:48 Adroxxx#18
Quote:
Originally Posted by FooFightah View Post
Werd ich mal machen, brauch ich dann immernoch den
Key, den Adroxxx gepostet hat?
Btw wo bei Adroxxx Beispiel muss ich eintragen,
welche Taste gedrückt werden soll?
Und ist das ok, wenn vor dem lParam NULL steht?
-.-

würd echt helfen wenn du einfach mal lesen würdest was ich schreibe.
Ich hab dir doch den Link zu der Klasse geschickt. Haste dir bestimmt nichtmal angeschaut.

PHP Code:
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);
         

Aufruf ist wie im Thread der Klasse beschrieben zB SendKey(VK_K); SendKey(VK_ENTER) ; usw.

Diese Methode ist aber nur für einen Tastendruck.
Wenn du zB einen Text senden willst musst du das anders machen. Steht aber auch in der Klasse beschrieben
02/11/2010 13:14 Σternαl.#19
Sry Adroxx, aber ich hab kein MFC und in deinem Post sind nur
Sachen für MFC, deswegen hilft mir SendKey(VK_ENTER) nicht weiter.

und @ flo:
Habs eingefügt, aber der Compiler meckert rum:
02/11/2010 13:21 Adroxxx#20
:facepalm:

ich sag einfach nix mehr. wird langsam lächerlich.
Du weißt, dass MFC einfach so rießengroße Klasse ist die zusätzliche Methoden und elementare typen liefert? Das heißt an der Art der Programmierung ändert sich nichts.
Ich habe oben schonmal geschrieben, was MFC Spezifisch ist, das ist nur der CWnd Handle, und dass ist CString. Den rest kannst du was 1:1 so übernehmen.
Naja egal,
viel glück noch ;)

@screenshot:
Ist nicht böse gemeint, aber lern doch bitte erstmal nomral programmieren bevor du dich an solche sachen ranwagst.
Der screenshot zeigt mir, dass du NULL ahnung hast. (NULL steht nicht für 0 sondern einer referenz ins leere die besagt es existiert nicht)

du hast in die while schleife
void sendKeystroke(char character)
02/11/2010 13:23 flo8464#21
*Hust*

Adroxxx und ich haben dir eine fertige Funktion gepostet, die fügst du nicht mitten in einer andere Funktion ein, sondern so....

Code:
while(wHandle)
    sendKeystroke('w');
02/11/2010 14:22 Σternαl.#22
Ja, ich habs ja auch einfach nur 1:1 von flo übernommen.
Und wenn du es gelesen hättest, ich hab nicht behauptet,
C++ programmieren zu können, sondern ich hab gesagt, dass
ich ein Anfänger bin. Und ich wollte einfach einen Bot programmieren,
weil ich mich dadurch auch "weiterbilden" kann, so lern ichs eigendlich
mit am besten. Wenn ich etwas programmieren will, frag ich Leute die sich
damit auskennen und die erklären es mir dann, damit ich es auch lerne.
Nur find ich es schade, wenn ich etwas lernen möchte bzw. etwas noch
nicht kann und ihr kommt mit "Lern erstmal Programmieren" oder
"An deiner Stelle würd ich das Programmieren aufgeben".....
Das fördert nicht gerade die Motivation zum Lernen.
Also nochmal für alle: Ich bin absoluter Anfänger und ich will nicht,
dass jemand nen Bot für mich schreibt, sondern dass ich es lerne
und auch verstehe. Aber wenn man hier so zugeflamed wird.....
Und jeder fängt mal klein an....
02/11/2010 15:29 Bot_interesierter#23
Du musst laufen lernen bevor du anfängst einen Marathon zu laufen.

Wenn du noch überhaupt keine Ahnung vom Programmieren hast, dann ist es denkbar schlecht mit Windows API Programmierung einzusteigen und direkt einen Bot entwickeln zu wollen, das wird so nichts.

Übrigens die Lösung für dein 'Problem' habe ich schon auf Seite eins gepostet, inklusive einer Liste mit allen möglichen VirtualKey Codes, wenn du anhand der Dokumentation auf MSDN nicht in der Lage bist heraus zu finden wie man eine WM_KEYDOWN message mit SendMessage benutzt, dann bist du einfach noch nicht bereit mit der Windows API zu programmieren.

Entweder du setzt dich hin und lernst die Grundlagen von C++ oder du lässt es bleiben, denn so müsste dir jeder einzelne Schritt von irgendjemandem erklärt werden und wirklich was lernen würdest du dabei auch nicht.
02/11/2010 17:07 Σternαl.#24
@Bot:
Da hast du schon Recht.
Vllt ist das auch etwas zu weit für mich, aber ich möchte es halt gerne lernen.
Btw: Deine Lösung klappt auch nicht, oder vllt hab ich auch wieder was falsch gemacht....
Und @Adroxxx & flo:
Ich verstehe jetzt nicht genau, was ihr meint, wo ich euren Code einfügen muss.
Ich hab das unter Garantie falsch gemacht, weil der Compiler dauernd
"nichtdeklarierter Bezeichner" sagt.
Also hier nochmal alle 3 Sources:

Flo's Variante:
==> Compiler:
wHandle: nichtdeklarierter Bezeichner,
sendKeystroke: Lokale Funktionsdefinitionen sind unzulässig.
Wenn ich "HWND wHandle = FindWindow(0,L"Guild Wars"); " nochmal in die
Funktion hinein schreibe, lößt sich das 1. Problem, aber das mit dem
sendkeystroke krig ich nicht weg, vllt ist das ja falsch gescrieben oder der
Header/die Lib fehlt, kA....
----------------------------------------------------------------------------

Adroxxx's Variante:
==> Compiler:
DELAY: nichtdeklarierter Bezeichner,
KEY: nichtdeklarierter Bezeichner.
Ich brauch natürlich Werte für DELAY und KEY, aber welche Werte kommen
da rein bzw. muss ich mir die über ne Funktion besorgen?
----------------------------------------------------------------------------

Bot's Variante:
==> Compiliert ohne zu meckern.
Aber, wie schon erwähnt klappt es nicht.
----------------------------------------------------------------------------

Und nochmal zum Abschluss:
Wenn ich jetzt etwas falsch gemacht habe, bitte motzt mich nicht an.......
Mir wärs lieber, ihr würdet einfach den fertigen Source-Teil posten
und mir sagen, was ich falsch gemacht hab/wie es jetzt funktioniert
.

Und btw vllt interessierts euch.
Was ich mir eigendlich von dem Post/euren Antworten erwartet hätte:

- Lösung des Problems
- Nicht so viel gemecker, ich bin wie gesagt noch ein Anfänger...
- Ein Post wie:
"Also SendKey kann man dafür benutzen, um Tastendrücke zu simulieren,
da lagst du schon richtig. Aber ????? hast du falsch gemacht.
SendKey brauch die 4 Parameter ??????.
Das 1. Parameter ist der Handle, den du dir ja schon per FindWindow geholt hast,
das 2. Parameter ist ?????, das krigst du indem du ?????.
Das 3. Parameter ist ?????, da hast du folgende Möglichkeiten: ?????.
Das 4. Parameter ist ?????, das holst du dir mit ?????
- Und dann hätte ich mir wenigstens erwartet, dass ich in weniger als 2 Tagen
mein Problem gelößt habe und gelernt habe, wie man Tastendrücke simuliert
bzw. wie man Bots schreibt.
02/11/2010 17:42 flo8464#25
Code:
void function();

int main()
{
    function();
}
So halt. Du kannst keine neuen Funktionen innerhalb einer anderen deklarieren.
02/11/2010 17:55 Σternαl.#26
Hmm jetzt siehts so aus:

Aber klappen tuts immernoch nicht.
Oder der macht nur so ne kleine Bewegung (mit w), dass ich es nicht sehe.
Wie krig ich das denn jetzt permanent hin, dass er permanent w drückt,
wenn ich keine While-Schleife benutzen darf?
02/11/2010 18:21 MrSm!th#27
Quote:
Originally Posted by Adroxxx View Post
Der screenshot zeigt mir, dass du NULL ahnung hast. (NULL steht nicht für 0 sondern einer referenz ins leere die besagt es existiert nicht)
Mal eher eine generelle Frage:

Soweit ich weiß, ist NULL doch als 0 definiert.
Wie kann es dann sein, dass
1. es funktionen gibt, die zwischen 0 und NULL beim Parameter unterscheiden?
2. du es eben nicht als 0 definierst, sondern als leere Referenz (also zb. Zeiger werden mit NULL deklariert, int's mit 0), obwohl es doch im Header als 0 defined ist? :D
02/11/2010 18:28 Σternαl.#28
Thx Smith, du hast mein Problem gelößt!
02/11/2010 18:45 Adroxxx#29
Quote:
Originally Posted by FooFightah View Post
@Bot:

Adroxxx's Variante:
==> Compiler:
DELAY: nichtdeklarierter Bezeichner,
KEY: nichtdeklarierter Bezeichner.
Ich brauch natürlich Werte für DELAY und KEY, aber welche Werte kommen
da rein bzw. muss ich mir die über ne Funktion besorgen?
Ich bekomme echt Kopfschmerzen.
Natürlich ist DELAY und KEY nicht definiert bei dir.
Schau dir doch den Header der Klasse an. Das sind Übergabeparameter.
Du kannst wenn du eine Funktion hast nicht einfach die Funktion in eine While Schleife copypastan .

Quote:
Originally Posted by MrSm!th View Post
Mal eher eine generelle Frage:

Soweit ich weiß, ist NULL doch als 0 definiert.
Wie kann es dann sein, dass
1. es funktionen gibt, die zwischen 0 und NULL beim Parameter unterscheiden?
2. du es eben nicht als 0 definierst, sondern als leere Referenz (also zb. Zeiger werden mit NULL deklariert, int's mit 0), obwohl es doch im Header als 0 defined ist? :D
Nein. NULL ist nicht 0. (null)
NULL ist eine Referenz. Bei C++ weist es darauf hin, dass ein Pointer niergens hinzeigt. Bei Java zB. das kein Objekt referenziert wird.

Die Aussage, dass er NULL ahnung hat, war einfach nur ein wortspiel.
02/11/2010 18:49 flo8464#30
Quote:
Originally Posted by MrSm!th View Post
Mal eher eine generelle Frage:

Soweit ich weiß, ist NULL doch als 0 definiert.
Wie kann es dann sein, dass
1. es funktionen gibt, die zwischen 0 und NULL beim Parameter unterscheiden?
2. du es eben nicht als 0 definierst, sondern als leere Referenz (also zb. Zeiger werden mit NULL deklariert, int's mit 0), obwohl es doch im Header als 0 defined ist? :D
NULL ist alter C-Stil, es ist völlig egal ob 0 oder NULL.
Aber es ist durchaus beliebter Stil Zeiger mit NULL auf 0 zu setzen, Integer mit 0. ;)
Stroustup hat dazu sogar etwas geschrieben: [Only registered and activated users can see links. Click Here To Register...]

Quote:
In C++, the definition of NULL is 0, so there is only an aesthetic difference. I prefer to avoid macros, so I use 0. Another problem with NULL is that people sometimes mistakenly believe that it is different from 0 and/or not an integer. In pre-standard code, NULL was/is sometimes defined to something unsuitable and therefore had/has to be avoided. That's less common these days.

If you have to name the null pointer, call it nullptr; that's what it's going to be called in C++0x. Then, "nullptr" will be a keyword.
@FooFightah:

Code:
#include <iostream> 
#include <windows.h> 

using namespace std;  

void sendKeystroke(char character) 
{ 
    LPARAM keystroke = LOWORD(VkKeyScanA(character)); 

    SendMessage(wHandle, WM_KEYDOWN, NULL, keystroke); 
    SendMessage(wHandle, WM_CHAR, NULL, keystroke); 
    Sleep(20); 
    SendMessage(wHandle, WM_KEYUP, NULL, keystroke); 
}

int main() 
{ 
        cout << "Starteee!!!!" << endl; 
 
        HWND wHandle = FindWindow(0,L"Guild Wars"); 
        if(!wHandle) 
        { 
            cout << "Starte das verdammte Spiiiieeeelll!!!!"  
            << " Errorcode: " << GetLastError() << '\n' << endl; 
        } 
     
        else 
        { 
            cout << "WindowHandle: " << wHandle << endl;

            while(true)
            {
                sendKeystroke('w');
            } 
        } 
}
Brr, Spoonfeeding.