|
You last visited: Today at 18:01
Advertisement
C++ SendMEssage Problem
Discussion on C++ SendMEssage Problem within the C/C++ forum part of the Coders Den category.
02/10/2010, 21:15
|
#16
|
elite*gold: 20
Join Date: Dec 2009
Posts: 1,850
Received Thanks: 484
|
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
|
#17
|
elite*gold: 0
Join Date: Nov 2008
Posts: 161
Received Thanks: 38
|
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
|
#18
|
elite*gold: 15
Join Date: Nov 2005
Posts: 13,021
Received Thanks: 5,323
|
Quote:
Originally Posted by FooFightah
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 KEY, DWORD 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
|
#19
|
elite*gold: 20
Join Date: Dec 2009
Posts: 1,850
Received Thanks: 484
|
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
|
#20
|
elite*gold: 15
Join Date: Nov 2005
Posts: 13,021
Received Thanks: 5,323
|
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
|
#21
|
elite*gold: 0
Join Date: Nov 2008
Posts: 161
Received Thanks: 38
|
*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
|
#22
|
elite*gold: 20
Join Date: Dec 2009
Posts: 1,850
Received Thanks: 484
|
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
|
#23
|
elite*gold: 20
Join Date: Sep 2006
Posts: 1,100
Received Thanks: 184
|
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
|
#24
|
elite*gold: 20
Join Date: Dec 2009
Posts: 1,850
Received Thanks: 484
|
@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:
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) { 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); } } } }
==> 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:
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) { LPARAM pmLparam = (::MapVirtualKey(KEY,0)<<16); PostMessage(wHandle,WM_KEYDOWN,0,pmLparam); PostMessage(wHandle,WM_CHAR,0,pmLparam); Sleep(DELAY); PostMessage(wHandle,WM_KEYUP,0,pmLparam); } } }
==> 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:
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(wHandle, WM_KEYDOWN, 0x57/*VK W*/, NULL); SendMessage(wHandle, WM_KEYUP, 0x57, NULL); } } }
==> 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
|
#25
|
elite*gold: 0
Join Date: Nov 2008
Posts: 161
Received Thanks: 38
|
Code:
void function();
int main()
{
function();
}
So halt. Du kannst keine neuen Funktionen innerhalb einer anderen deklarieren.
|
|
|
02/11/2010, 17:55
|
#26
|
elite*gold: 20
Join Date: Dec 2009
Posts: 1,850
Received Thanks: 484
|
Hmm jetzt siehts so aus:
PHP Code:
#include <iostream> #include <windows.h> using namespace std; HWND wHandle = FindWindow(0,L"Guild Wars"); 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; } }
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
|
#27
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
Quote:
Originally Posted by Adroxxx
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?
|
|
|
02/11/2010, 18:28
|
#28
|
elite*gold: 20
Join Date: Dec 2009
Posts: 1,850
Received Thanks: 484
|
Thx Smith, du hast mein Problem gelößt!
|
|
|
02/11/2010, 18:45
|
#29
|
elite*gold: 15
Join Date: Nov 2005
Posts: 13,021
Received Thanks: 5,323
|
Quote:
Originally Posted by FooFightah
@Bot:
Adroxxx's Variante:
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) { LPARAM pmLparam = (::MapVirtualKey(KEY,0)<<16); PostMessage(wHandle,WM_KEYDOWN,0,pmLparam); PostMessage(wHandle,WM_CHAR,0,pmLparam); Sleep(DELAY); PostMessage(wHandle,WM_KEYUP,0,pmLparam); } } }
==> 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
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?
|
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
|
#30
|
elite*gold: 0
Join Date: Nov 2008
Posts: 161
Received Thanks: 38
|
Quote:
Originally Posted by MrSm!th
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?
|
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:
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.
|
|
|
|
|
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 +2. The time now is 18:01.
|
|