Bot Problem C++

02/17/2010 15:35 73rm1n4t0r#16
lern doch erstmal die grundlagen von c++ oO das was da an code steht zeugt eindeutig davon das du net mal in ansätzen verstanden hast wie man mit c++ Programmiert :S und mit C&P wirst du das niemals lernen lass dir das gesagt sein ich mein in der schule lernste au nix wennde nur abschreibst ....

programmier doch einfach wie alle andern auch erstmal nen Taschenrechner oder was weiß ich da gibts genug tutorials die einem den einstieg ermöglichen! gleich mit sowas anzufangen is schwachsinn... in der schule fängste auch erstmal mit + und - an und net gleich mit Integral rechnung.ohne die nötigen grundlagen wirste niemals weiterkommen.

und ja das is am Anfang vlt mühselig aber du wirst schnell merken das du da wesentlich schneller zum Ziel kommst als wenn du versuchst kurz vorm Ziel anzufangen und jemand der sich mit msdn und google net zu helfen weiß is eindeutig noch net soweit nen Bot zu schreiben ganz davon zu schweigen das man ohne ausreichende englisch kentnisse sowieso aufgeschmissen ist
02/17/2010 15:48 Σternαl.#17
Ja, kann sein dass du da Recht hast, das hat mir Sm!th auch schon gesagt,
aber ich sags mal so, hab jetzt vor 2 Tagen mal AutoIt gedownloaded und
jetzt kann ich schon problemlos nen gw bot schreiben.
Ich würds halt einfach gern wissen, wies geht in C++.
02/17/2010 15:59 73rm1n4t0r#18
1. warum nicht GWCA nutzen ? wie man window messages sendet weißte ja hoffentlich
2. google is your friend
3. msdn is your friend too
4. auch wenn du in Autoit nen bot schreiben kannst kann man ohne c++ grundlagen nicht gleich damit anfangen nen c++ bot zu schreiben. und für die grundlagen brauchste wennde wirklich interessiert bist 1-2 tage zumindest wenn man schonmal die grundlagen des Programmieren kennt. ich mein msdn zu verstehen is jetz nich so schwehr notfalls tippste den Befehl mal bei google oder codeproject ein und schaust dir nen paar samples an

€: und ich mein wennde in autoit nen bot schaffst sollte dir zumindest schonmal aufgefallen sein das man ne Funktion auch aufrufen muss wen man se benutzen will ;)
02/17/2010 19:19 MrSm!th#19
-.-"

Der Compiler meckert deswegen, weil ich die WinMain habr

Quote:
Weil wenn ich das mache meckert der Compiler wegen:
"nicht aufgelöstes externes Symbol "_main" in Funktion "_tmainCRTStartup".
und
"nicht aufgelöste externe Verweise".

Aber beim 1. mal hab ich den Code nicht einfach nur eingefügt,
sondern noch ne main Funktion reingemacht, das brauch doch jedes C++ Programm oder?
Bist du echt so unfähig mitzudenken?
Klar braucht das jedes Programm, nur weil mein Projekt als Win32 Projekt eingestellt war, ist es eben die WinMain.
Du musst nur die Funktion in int main() umbennen und C&Pn.
Fertig.
Deshalb ist auch dein Source totaler crap. Die Funktion WinMain wird ja bei dir gar nicht aufgerufen (oder bist du nichtmal so weit in den Grundlagen?)

btw.
@73rm:

weißt du, welche Funktion der WinApi aufgerufen wird, wenn man in Autoit ControlSend nutzt?
Ich denke mal es ist PostMessage aber irgendwie will es damit bei mir auch nicht gehen (und das liegt nicht an GW, auch bei Notepad klappts nicht)
02/17/2010 20:51 Σternαl.#20
Oh cool, super jetzt klappts :D
Eine Frage noch, ein Tastendruck besteht ja logischer Weise aus Drücken + Loslassen.
Nur wie mach ich es, dass mein Programm w wieder loslässt?

Btw: Seit wann spielst du Gw? oO
02/17/2010 21:15 MrSm!th#21
MSDN is your friend
steht bei der Erklärung von INPUT.ki

seit weiß ich nicht wann

edit: btw mit einmal SendInput wird auch nur einmal w gedrückt; also musst du nix machen, damit es wieder losgelassen wird!
02/17/2010 21:25 73rm1n4t0r#22
@MrSm!th

Autoit atached sich glaub ich an den Window thread um keys zu senden
[Only registered and activated users can see links. Click Here To Register...] Zeile 301 is send und Zeile 442 is WinAttach
02/17/2010 21:32 Σternαl.#23
Hab mir alles durchgelesen, aber nix gefunden....
[Only registered and activated users can see links. Click Here To Register...]

Btw wie heißt du in Gw?
02/17/2010 21:57 MrSm!th#24
Quote:
Originally Posted by FooFightah View Post
Hab mir alles durchgelesen, aber nix gefunden....
[Only registered and activated users can see links. Click Here To Register...]

Btw wie heißt du in Gw?
was möchest du denn?
w wird doch sofort wieder losgelassen.

Bei Shift hält er bei mir auch einfach gedrückt und ich kriegs nicht hin, aber das hat etwas andere Gründe, nämlich dass scheinbar etwas nicht geht.

Wenn du richtig gelesen hättest, wüsstest du, dass INPUT::ki.dwExtraInfo mit dem Flag KEYEVENTF_KEYUP belegt werden kann und ich denke, das sagt alles oder?

Allerdings gehts bei mir trotzdem nicht, selbst nachdem mein Programm durchgelaufen ist, wird Shift gedrückt gehalten, bis ich Shift drücke (super jetzt wird Foos Problem zu meinem -.-")

code:

PHP Code:
int WINAPI WinMain(HINSTANCE hi,HINSTANCE hPrev,LPSTR Cmdline,int nShowCmd)
{
    
INPUT input;
    
input.type INPUT_KEYBOARD;
    
input.ki.wVk =VK_SHIFT;
    
input.ki.wScan MapVirtualKey(VK_SHIFT,0);
    
input.ki.dwFlags 0;
    
input.ki.time 0;
    
input.ki.dwExtraInfo 0//oder eben KEYEVENTF_KEYUP
    
SendInput(1,&input,sizeof(input));
/*Hier habe ich probiert, nochmal SendInput zu senden 
(ich weiß, hätte es geklappt, wäre "W" wieder zu "w" geworden, 
aber ich wollte erstmal testen, wie ich das Shift wieder wegbekommen)
 -> klappte nicht; ich habs auch mit input.ki.dwExtraInfo = KEYEVENTF_KEYUP; 
probiert -> klappte nicht */

    
input.ki.wVk =0x57;
    
input.ki.wScan MapVirtualKey(0x57,0);
    
SendInput(1,&input,sizeof(input));

/* Hier habe ich auch schon probiert, es mit dem Flag KEYEVENTF_KEYUP 
zu belgen -> klappte nicht : */
    
input.ki.wVk =VK_SHIFT;
 
//input.ki.dwExtraInfo = KEYEVENTF_KEYUP;
    
input.ki.wScan MapVirtualKey(VK_SHIFT,0);
    
SendInput(1,&input,sizeof(input));
    return 
0;

@73:

Aber ich habe irgendwas von PostMessage gelesen....
Und vor allem:
Selbst wenn es duch attachen gelöst ist; das erklärt, warum es mit PostMessage bei Games nicht geh (falls diese direkten Input nutzen) aber nicht, warum es bei so einfachen Dingen wie Notepad nicht geht.
Es wird doch wohl noch irgendein Programm geben, dass Tastendrücke per Message annimmt...
02/17/2010 22:07 73rm1n4t0r#25
wenn man se richtig sendet geht das auch ;) jedenfalls bei mir kp was du da gesendet hast
[Only registered and activated users can see links. Click Here To Register...]
02/17/2010 22:10 MrSm!th#26
Quote:
Originally Posted by 73rm1n4t0r View Post
wenn man se richtig sendet geht das auch ;) jedenfalls bei mir kp was du da gesendet hast
[Only registered and activated users can see links. Click Here To Register...]
joa gibste mal bitte den source
Ich frage selten nach sowas, das heißt schon was.
Lässt du LPARAM auch bei NULL?
Ich habe alles probiert, NULL, durch MAKEWORD usw. ihn so hinzubiegen, dass an der richtigen Stelle der Scancode ist...
Nix hat geklappt :(

btw. hast du auch ne Lösung fürs Shiftgedrückthalten? :D
02/17/2010 22:52 73rm1n4t0r#27
für Notepad:
Code:
HWND hc=GetDlgItem(FindWindowA("Notepad",0),15);
SendMessage(hc,WM_CHAR,'N',0);
SendMessage(hc,WM_CHAR,'o',0);
SendMessage(hc,WM_CHAR,'t',0);
SendMessage(hc,WM_CHAR,'e',0);
SendMessage(hc,WM_CHAR,'p',0);
SendMessage(hc,WM_CHAR,'a',0);
SendMessage(hc,WM_CHAR,'d',0);
SendMessage(hc,WM_KEYDOWN,VK_RETURN,0);
einfach ans MainWindow senden bringt dir nix du brauchst schon die Editbox ;)
02/17/2010 23:37 MrSm!th#28
Quote:
Originally Posted by 73rm1n4t0r View Post
für Notepad:
Code:
HWND hc=GetDlgItem(FindWindowA("Notepad",0),15);
SendMessage(hc,WM_CHAR,'N',0);
SendMessage(hc,WM_CHAR,'o',0);
SendMessage(hc,WM_CHAR,'t',0);
SendMessage(hc,WM_CHAR,'e',0);
SendMessage(hc,WM_CHAR,'p',0);
SendMessage(hc,WM_CHAR,'a',0);
SendMessage(hc,WM_CHAR,'d',0);
SendMessage(hc,WM_KEYDOWN,VK_RETURN,0);
einfach ans MainWindow senden bringt dir nix du brauchst schon die Editbox ;)
oooohhh Editbox :D
Das wars^^
WM_CHAR nimmst du einfach nur, weil es besser dafür geeignet ist oder?
Es würde auch mit WM_KEYDOWN gehen?!
edit: Ne geht bei mir nur mit WM_CHAR

btw. warum geht das dann so nicht bei GW (sagt Foo; ich habs noch nicht mit nem Game getestet^^)

Ach ja, woher weiß man die ID der Editbox?
edit:
Ok, mit Spy++ findet man sie^^
Aber Spy++ ist ja nur in der Pro Version von VS, wie machen das denn dann unsere netten Express User Freunde wie Foofightah?

p.s. Die Lösung für mein Shift Problem kenne ich immer noch nicht :(


@Foo:

Code:
SendMessage(hWnd,WM_CHAR,'w',NULL);
Geht übrigens!
Wenn du in den Chat klickst und eine taste drückst, wird sofort w gespammt.
Nur eben nicht beim Laufen.
02/18/2010 14:24 Σternαl.#29
Wow, so viel gelesen jetz :D
Ok, also WM_CHAR ist das selbe wie WM_KEYDOWN?
Und warum war mein Code mit SendMessage dann viel länger als Terminators?
Naja, wayne auch^^
Habs mit KEYEVENTF_KEYUP versucht, aber jetzt fängt er nicht mal mehr an zu laufen QQ
PHP Code:
#include <windows.h>
#include <iostream>

int main(HINSTANCE hi,HINSTANCE hPrev,LPSTR Cmdline,int nShowCmd)
{
    
HWND GW NULL;
    do
    {
        
GW FindWindow(NULL,L"Guild Wars");
        
Sleep(100);
    } while(!
GW);
    
SetForegroundWindow(GW);
    
INPUT input;
    
input.type INPUT_KEYBOARD;
    
input.ki.wVk =0x57;    //"W"   falls es nicht geht 0x77 für "w"
    
input.ki.dwFlags 0;
    
input.ki.time 0;
    
input.ki.wScan MapVirtualKey(0x57,0); // s.o.
    
input.ki.dwExtraInfo 0;
    
SendInput(1,&input,sizeof(input));
    
Sleep(3000);
    
input.ki.dwExtraInfo KEYEVENTF_KEYUP;
    
SendInput(1,&input,sizeof(input));
    return 
0;

Btw: Warum klappt SetForegroundWindow nicht bei mir?
02/19/2010 10:21 Patlol22#30
Hier ist der richtige Weg das ganze zu tun:
Code:
public const int WM_KEYDOWN = 0x100;
        public const int WM_KEYUP = 0x101;
        public const int WM_CHAR = 0x102;

[DllImport("User32.dll")]
        public static extern Int32 SendMessage(
            int hWnd,               // handle to destination window

            int Msg,                // message

            int wParam,             // first message parameter

            long lParam);

[DllImport("User32.dll")]
        public static extern int FindWindow(string strClassName,
                                                 string strWindowName);
///
 Int32 iHandle;

public GWControls() 
        {
            iHandle = Win32.FindWindow(null, "Guild Wars");
            
            
        }

public void resign()
            {
                Win32.SendMessage(iHandle, Win32.WM_KEYDOWN, 0x0000000D, 0x001C0001); //Enter
                Win32.SendMessage(iHandle, Win32.WM_CHAR, 0x0000000D, 0x001C0001);
                Win32.SendMessage(iHandle, Win32.WM_KEYUP, 0x0000000D, 0xC01C0001);

                this.Wait(0.1f);
                Win32.SendMessage(iHandle, Win32.WM_KEYDOWN, 0x0000002F, 0x00350001); //Slash
                Win32.SendMessage(iHandle, Win32.WM_CHAR, 0x0000002F, 0x00350001);
                Win32.SendMessage(iHandle, Win32.WM_KEYUP, 0x0000002F, 0xC0350001);

                this.Wait(0.1f);
                Win32.SendMessage(iHandle, Win32.WM_KEYDOWN, 0x00000052, 0x00130001); //R
                Win32.SendMessage(iHandle, Win32.WM_CHAR, 0x00000052, 0x00130001);
                Win32.SendMessage(iHandle, Win32.WM_KEYUP, 0x00000052, 0xC0130001);

                this.Wait(0.1f);
                Win32.SendMessage(iHandle, Win32.WM_KEYDOWN, 0x00000045, 0x00120001); //E
                Win32.SendMessage(iHandle, Win32.WM_CHAR, 0x00000045, 0x00120001);
                Win32.SendMessage(iHandle, Win32.WM_KEYUP, 0x00000045, 0xC0120001);

                this.Wait(0.1f);
                Win32.SendMessage(iHandle, Win32.WM_KEYDOWN, 0x00000053, 0x001F0001); //S
                Win32.SendMessage(iHandle, Win32.WM_CHAR, 0x00000053, 0x001F0001);
                Win32.SendMessage(iHandle, Win32.WM_KEYUP, 0x00000053, 0xC01F0001);

                this.Wait(0.1f);
                Win32.SendMessage(iHandle, Win32.WM_KEYDOWN, 0x00000049, 0x00170001); //I
                Win32.SendMessage(iHandle, Win32.WM_CHAR, 0x00000049, 0x00170001);
                Win32.SendMessage(iHandle, Win32.WM_KEYUP, 0x00000049, 0xC0170001);

                this.Wait(0.1f);
                Win32.SendMessage(iHandle, Win32.WM_KEYDOWN, 0x00000047, 0x00220001); //G
                Win32.SendMessage(iHandle, Win32.WM_CHAR, 0x00000047, 0x00220001);
                Win32.SendMessage(iHandle, Win32.WM_KEYUP, 0x00000047, 0xC0220001);

                this.Wait(0.1f);
                Win32.SendMessage(iHandle, Win32.WM_KEYDOWN, 0x0000004E, 0x00310001); //N
                Win32.SendMessage(iHandle, Win32.WM_CHAR, 0x0000004E, 0x00310001);
                Win32.SendMessage(iHandle, Win32.WM_KEYUP, 0x0000004E, 0xC0310001);

                this.Wait(0.5f);
                Win32.SendMessage(iHandle, Win32.WM_KEYDOWN, 0x0000000D, 0x001C0001); //Enter
                Win32.SendMessage(iHandle, Win32.WM_CHAR, 0x0000000D, 0x001C0001);
                Win32.SendMessage(iHandle, Win32.WM_KEYUP, 0x0000000D, 0xC01C0001);
Die Param sind 100% korrekt. :) API declarationen sind natürlich in C# und müsstest das für C++ bisschen ändern.