Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 17:39

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

Advertisement



C++ SendMEssage Problem

Discussion on C++ SendMEssage Problem within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
Σternαl.'s Avatar
 
elite*gold: 20
Join Date: Dec 2009
Posts: 1,850
Received Thanks: 484
C++ SendMEssage Problem

Hey Comunity,
bin C++ Anfänger und hab da ein Problem.
Und zwar möchte ich Tastendrücke mithilfe meines Programms simulieren,
da hab ich mir gedacht, dass ich SendMessage benutze.
Mein Problem ist jetzt, dass ich nicht weiß, wo ich das Parameter
für die "zu drückende" Taste hinschreiben soll bzw. in welcher Form;
als Hex oder VK_KEY_? . Der Bot soll einfach nur ununterbrochen
"w" drücken, jedoch krig ich es einfach nicht hin.
Bei Google hab ich nix gefunden, MSDN hab ich nicht verstanden
Hoffe, ihr könnt mir helfen,
thx schonmal im Voraus

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




using namespace std;

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(
wHandle)
                {
                    
LPARAM lParam 0x57;
                    
SendMessage(wHandleWM_KEYDOWNNULLlParam);
                    
SendMessage(wHandleWM_KEYUPNULLlParam); 

                }
        }

Btw: Habs mal mit "SendMessage(wHandle, WM_KEYDOWN, NULL, (LPARAM)"w")
hingekrigt, dass der Bot ingame i drückt.
Aber egal, was ich anstelle von "w" nehme, der Bot drückt immer i.
Σternαl. is offline  
Old 02/10/2010, 16:59   #2


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
gibts nicht irgendwie so Makros wie MakeLPARAM oder so, die einen den richtigen hexwert geben, für das, was man möchte?
Denn einfach den hexwert einer taste angeben, geht glaub ich nicht....

btw. der include von Winuser ist unnötig, das wird schon in windows.h getan
MrSm!th is offline  
Old 02/10/2010, 17:04   #3
 
flo8464's Avatar
 
elite*gold: 0
Join Date: Nov 2008
Posts: 161
Received Thanks: 38
Hexdezimal ist keine andere Art von Zahlen, nur eine andere Darstellungsweise.
Das vorneweg, es ist absolut irrelevant ob du 12 oder 0xC schreibst.

Schau dir mal den Source an, er benutzt zwar keybd_event(), sollte dir aber helfen:
flo8464 is offline  
Old 02/10/2010, 17:09   #4
 
Σternαl.'s Avatar
 
elite*gold: 20
Join Date: Dec 2009
Posts: 1,850
Received Thanks: 484
Quote:
keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0);
Naja, soweit war ich mittlerweile auch schon.....
Und außerdem hatt das von Syntax her nix mit SendMessage zu tun...
Σternαl. is offline  
Old 02/10/2010, 17:13   #5


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Quote:
Originally Posted by flo8464 View Post
Hexdezimal ist keine andere Art von Zahlen, nur eine andere Darstellungsweise.
Das vorneweg, es ist absolut irrelevant ob du 12 oder 0xC schreibst.

Schau dir mal den Source an, er benutzt zwar keybd_event(), sollte dir aber helfen:
war mir auch klar
mir ging es darum, den richtigen wert für das zu bekommen, was man möchte.
Gibt doch irgendwie so ein Makro wie MakeLParam oder nicht?
Da bekommt man dann für das was man möchte, den richtigen wert.
(so wie MAKEWORD für die version bei winsock)
MrSm!th is offline  
Old 02/10/2010, 17:29   #6
 
flo8464's Avatar
 
elite*gold: 0
Join Date: Nov 2008
Posts: 161
Received Thanks: 38
Quote:
Originally Posted by FooFightah View Post
Naja, soweit war ich mittlerweile auch schon.....
Und außerdem hatt das von Syntax her nix mit SendMessage zu tun...
Source anschauen und nicht die Code-Snippets!
Den Source musst du downloaden und bietet hier eine komplette Implementierung einey Keystroke-Senders.

Und um mal einen generellen Fehler in deinem Verständnis zu klären:

Quote:
SendMessage(wHandle, WM_KEYDOWN, NULL, (LPARAM)"w")
"w" ist ein konstanter Zeiger auf ein Stringliteral, 'w' würde den ASCII-Wert des Zeichens zurückgeben, L' ' bei Unicode-Zeichen.
Der lparam-Parameter entspricht genau dem Char-Code, du musst weder etwas umwandeln geschweige denn hässliche C-Casts drauf loslassen.
Du hast in deinem Beispiel die Addresse des Pointers zu einem Zeichen gecastet. Dass das nichts wird, ist klar.

So gehts:
Quote:
SendMessage(wHandle, WM_KEYDOWN, NULL, 'w')
MSDN solltest du schon verstehen, wo lag dein Problem?

Quote:
war mir auch klar
mir ging es darum, den richtigen wert für das zu bekommen, was man möchte.
Das war ja nicht auf dich bezogen.
Mir stößt es nur immer auf, wenn Leute von "Hex-Werten" sprechen.
flo8464 is offline  
Thanks
1 User
Old 02/10/2010, 17:31   #7
 
elite*gold: 20
Join Date: Sep 2006
Posts: 1,100
Received Thanks: 184
Code:
SendMessage(wHandle, WM_KEYDOWN, 0x57/*VK W*/, NULL);
                    SendMessage(wHandle, WM_KEYUP, 0x57, NULL);


War das jetzt so schwer zu finden, dass du das nicht selber konntest?

Wenn du nicht in der Lage bist anhand von MSDN zu begreifen wie eine API Funktion zu benutzten ist, dann solltest du das Programmieren aufgeben, du wirst auf keinen grünen Zweig kommen, weil du ständig nachfragen musst wie etwas funktioniert.
Bot_interesierter is offline  
Old 02/10/2010, 17:50   #8
 
P-a-i-n's Avatar
 
elite*gold: 0
Join Date: Nov 2009
Posts: 1,258
Received Thanks: 396
er will eine taste simulieren die w drückt mhm willst du w spammen ich hätte mich ebenfalls für keybd_event entschieden

wenn man ist einer schleife drehen läßt drückt es w genauso z.B mit
wenn es in einer schleife ist die erfüllt ist dann wird es dauerhaft gedrückt
z.B ein fenstername

das drückt w

keybd_event(0x57, 0, 0, NULL);

das läßt es wieder los

keybd_event(0x57, 0, KEYEVENTF_KEYUP, 0);

also sendmassage ist mehr für texte übergeben aber zum tastendruck simulieren mehr ungeeignt find ich
jeder hat ja eine andere art und naja bei C++ gehen mehr wege zum ziel
P-a-i-n is offline  
Thanks
1 User
Old 02/10/2010, 18:00   #9
 
flo8464's Avatar
 
elite*gold: 0
Join Date: Nov 2008
Posts: 161
Received Thanks: 38
Nein, keybd_event() sollte man nach Möglichkeit nicht nutzen, siehe MSDN.

Quote:
Windows NT/2000/XP/Vista:This function has been superseded. Use SendInput instead.
flo8464 is offline  
Old 02/10/2010, 18:01   #10

 
Adroxxx's Avatar
 
elite*gold: 15
Join Date: Nov 2005
Posts: 13,021
Received Thanks: 5,324
keybd_event und SendInput kann man beides auch verwenden. Geht aber dann nur im aktuellen Fensterm das gerade aktiv ist.
Mit Post/Send Message gehts an ein FensterHandle.
Blub:


Kannste dir die SendKey Kopieren.
Adroxxx is offline  
Thanks
1 User
Old 02/10/2010, 18:05   #11
 
P-a-i-n's Avatar
 
elite*gold: 0
Join Date: Nov 2009
Posts: 1,258
Received Thanks: 396
Quote:
Originally Posted by flo8464 View Post
Nein, keybd_event() sollte man nach Möglichkeit nicht nutzen, siehe MSDN.

ob man es nutzen soll oder nicht ist ja mal dahingestellt hauptsache es funktioniert aufdauer ich hätte es per hand druck gelöst also mit getkeystate
lieber alles selberkontrollieren als vom system machen lassen

nagut jetzt sind so viele lösungen hier gepostet wird er ja wohl jetzt hinkriegen
P-a-i-n is offline  
Old 02/10/2010, 18:24   #12


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Quote:
Originally Posted by Adroxxx View Post
keybd_event und SendInput kann man beides auch verwenden. Geht aber dann nur im aktuellen Fensterm das gerade aktiv ist.
Mit Post/Send Message gehts an ein FensterHandle.
Blub:


Kannste dir die SendKey Kopieren.
man wollte ich gerade empfehlen^^

Foo wenn du mittlerweile VS mit MFC hast, kannst du adroxxxs klasse nutzen, ansonsten kann ich dir auch die *ohne MFC* version geben
MrSm!th is offline  
Old 02/10/2010, 20:30   #13
 
Σternαl.'s Avatar
 
elite*gold: 20
Join Date: Dec 2009
Posts: 1,850
Received Thanks: 484
Express hab ich schon, aber ehrlich gesagt war mir das Downloaden von MFC
zu mühseelig und zum Kaufen isses mir zu teuer^^

Also erstmal danke an alle, die mir Tipps/Lösungen gegeben haben.
Und ich bin echt überrascht, dass mich nur einer angeflamed hat.
Naja, falls dus nicht gelesen haben solltest flo, ich bin ANFÄNGER.
Und Anfänger haben nunmal an sich, dass die mit etwas erst ANFANGEN
und deswegen noch nicht gleich alles verstehen/draufhaben.....
Btw ist msdn in englisch, zu mindest der SendMessage Post.
Ich kann zwar englisch, aber wenn man etwas lernen will, was man eh schon
nicht versteht, wiel einem keiner helfen kann, dann ist es nicht gerade vorteilhaft,
wenn das, was ich in msdn nicht verstehe, auch noch auf englisch ist.....
Aber schluss mit dem Flame, danke für den Tipp mit 'w', auch wenn ich die ganzen
Fachbegriffe nicht verstanden hab bzw. wo ich bitte nen Pointer gesetzt hab oO
Aber klappen tuts immernoch nicht, leider...
Hier nochmal der Source:
PHP Code:
#include <iostream> 
#include <windows.h> 

using namespace std

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(
wHandle
                {  
                    
SendMessage(wHandleWM_KEYDOWNNULL'w'); 
                    
SendMessage(wHandleWM_KEYUPNULL'w');  

                } 
        } 

Als kleine Info:
Wenn ich den "Bot" laufen lasse, wird ingame nur ein einziges mal i gedrückt,
also das seh ich daran, dass mein Inventar offen ist, aber mit w spammen is nich.
Σternαl. is offline  
Old 02/10/2010, 20:55   #14

 
Adroxxx's Avatar
 
elite*gold: 15
Join Date: Nov 2005
Posts: 13,021
Received Thanks: 5,324
Zu MFC:

Die Klasse ist zu 90% non-mfc.
Das einzige wirkliche MFC ist einmal das Handle, weil ich da ein CWnd benutzte und CString.

Sonst kannste das eigentlich genauso kopieren.

PHP Code:
  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); 
So anstatt pWnd->PostMessage.... musste halt nur PostMessage(handle....usw)

du musst MapVirtualKey benutzten.

Und was auch wichtig ist, du brauchst da einen delay. Sonst simuliert er den druck der taste zu schnell.
Adroxxx is offline  
Thanks
1 User
Old 02/10/2010, 21:07   #15
 
flo8464's Avatar
 
elite*gold: 0
Join Date: Nov 2008
Posts: 161
Received Thanks: 38
Quote:
Naja, falls dus nicht gelesen haben solltest flo, ich bin ANFÄNGER.
Und Anfänger haben nunmal an sich, dass die mit etwas erst ANFANGEN
und deswegen noch nicht gleich alles verstehen/draufhaben.....
Wo hab ich geflamed? Geh mal ne Seite zurück, ich hab dir die Lösung auf dein Problem gepostet und dir erklärt was du falsch gemacht hast.

Quote:
wo ich bitte nen Pointer gesetzt hab
Wenn du jetzt soetwas schreibst:

Code:
do("Hallo");
dann legt der Compiler den String "Hallo" in einer read-only Datasection ab und fügt stattdessen einen Pointer zu diesem String ein.

Ein Zeichen in ' hingegen ist kein String und es wird direkt der Zahlenwert des Zeichens verwendet. Deswegen willst du das.

Quote:
nicht versteht, wiel einem keiner helfen kann, dann ist es nicht gerade vorteilhaft,
wenn das, was ich in msdn nicht verstehe, auch noch auf englisch ist.....
Ich habe dich ja gefragt, was du nicht verstehst.



-----------


Hast du es jetzt schon mal mit keybd_event()/SendInput() versucht?
DirectX nutzt nämlich keinen normalen Messagehandler.
flo8464 is offline  
Reply

Tags
c++, problem, sendmessage


Similar Threads Similar Threads
C++ SendMessage Problem
08/02/2010 - C/C++ - 1 Replies
Also ich versuche gerade in C++ einen kleinen Spammer zu programmieren habe aber leider ein Problem. Mein Code: #include <iostream> #include <windows.h> #include <string> using namespace std;
delphi sendmessage
07/27/2010 - General Coding - 3 Replies
hallo leute ich hab mal eine frage ob mir jemand kurz erläutern könnte wie ich mit sendmessage eine mausbewegung in einem minimierten fenster ausgebe ich habe embarcadero rad studio 2010 hier ist der bisherige "source": uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm)
[Help] C# SendMessage()
05/11/2010 - CO2 Programming - 19 Replies
I'm currenty trying to use the SendMessage Function with CO. According to msdn I need to use this: static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); My question is: How do I find the hWnd? What are the wParam and lParam? And what can I use as wParam and lParam? Any help will be greatly appreciated.
sendmessage?
12/26/2008 - CO2 Programming - 0 Replies
just wondering how it works in C# tried few tutorials with notepad in it and it doesnt send the letters/close it even it finds the window this is how i got it so far (pretty much copypasted, just to see how it works...) private static extern IntPtr FindWindow(string winClass, string WinName); private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); private static extern IntPtr PostMessage(IntPtr hWnd,...
how do i sendmessage a password box
05/11/2007 - Conquer Online 2 - 11 Replies
HI, I'm trying to sendmessage the password to the password box. It gives me the *** in the box but when i click the enter button it gives me the wrong password error. any help would be appreciated



All times are GMT +1. The time now is 17:40.


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.