Laden...

Automatischen Tastaturdruck an Spiel senden

Erstellt von xyzMann vor 14 Jahren Letzter Beitrag vor 14 Jahren 4.905 Views
X
xyzMann Themenstarter:in
15 Beiträge seit 2010
vor 14 Jahren
Automatischen Tastaturdruck an Spiel senden

Hi erstmal =)

also ich ahb ein problem ich möchte mir ein programm schreiben das mir automatisch immer wieder nach einer gewissen zeit "1" drückt und dies an ein spiel ^^...

mein problem dabei ist das ich dem game keine Taste senden kann...

habe schon sendkey probiert als auch send input...

das sendkey nicht funktioniert ok wär auhc zu einfach gewesen ^^ aber send input auch nicht O.o...

also die programme als solches gehen kann zum beispiel an den editor meine zahlen schicken nur an das game nicht - nur wenn ich den chat im game aktiviere sendet er mir die zahlen... ( er soll ja aber nicht chatten sondern spielen ...)

habt ihr noch ne idee an was es liegen könnte und wie ich das lösen könnte?

danke im vorraus für eure hilfe 😃

V
78 Beiträge seit 2008
vor 14 Jahren

Du kannst es ja mal mit keybd_event (WinAPI) probieren:
http://www.pinvoke.net/default.aspx/user32/keybd_event.html

Das funktioniert aber auch nicht immer, weil bestimmte Spiele da Schutzmaßnahmen haben.

F
10.010 Beiträge seit 2004
vor 14 Jahren

Das ist aus 2 Gründen nicht zu lösen.

  1. Das spiel wird seine eigene Tastaturroutinen haben, also entwerder DirectX oder selber die Tastatur Pollen.

  2. Ist das Cheaten verboten. Und auch wenn es dir nicht passt, dieses Forum
    wird sich nicht an illegalen Aktionen beteiligen (wollen).

F
100 Beiträge seit 2009
vor 14 Jahren

Wieso sollte das Illegal sein?

@op
hier findest du evtl etwas was dir weiterhilft:
http://www.gamedev.net/community/forums/topic.asp?topic_id=339282
http://forum.cheatengine.org/viewtopic.php?p=4289508&sid=

X
xyzMann Themenstarter:in
15 Beiträge seit 2010
vor 14 Jahren

hab auch schon daran gedacht das es nicht geht... hab deshalb mal mit osk versucht und mit der gehts und die macht doch auch nix anderes? oder?!

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo FZelle,

  1. Ist das Cheaten verboten

auf viele Onlinespiele wird das zutreffen. Für viele Offline-Spiele aber nicht. Ein so generelles Verbot, dass man fest davon ausgehen kann, dass der Fragesteller etwas verwerfliches vor hat, gibt es also sicher nicht.

Hallo xyzMann,

Und auch wenn es dir nicht passt, dieses Forum wird sich nicht an illegalen Aktionen beteiligen (wollen).

das stimmt natürlich uneingeschränkt. Wenn du also wirklich etwas rechts- oder vertragswidriges vorhaben solltest, bitten wir dich dringend, davon Abstand zu nehmen und auch keine weiteren Nachfragen zu stellen.

herbivore

X
xyzMann Themenstarter:in
15 Beiträge seit 2010
vor 14 Jahren

auf viele Onlinespiele wird das zutreffen. Für viele Offline-Spiele aber nicht. Ein so generelles Verbot, dass man fest davon ausgehen kann, dass der Fragesteller etwas verwerfliches vor hat, gibt es also sicher nicht.

ich habe nix "verwehrfliches" vor - also cheaten indem ich mir ein vorteil gegenüber andere. Zocke nur offline games online spiele sind mir zu zeitaufwenig und zu kostenspielig

R
100 Beiträge seit 2009
vor 14 Jahren

@xyzMann: Probier mal mit der PostMessage API. m_ipHandle ist handle von Windows wo du Taste senden willst.

Keys keySpace;
        const uint WM_KEYDOWN = 0x100;
        const uint WM_KEYUP = 0x101;
        public void BuffPet()
        {           
            keySpace = Keys.Space;
            PostMessage(m_ipHandle, WM_KEYDOWN, (uint)keySpace, 0);
            Thread.Sleep(100);
            PostMessage(m_ipHandle, WM_KEYUP, (uint)keySpace, 0);
            //System.Windows.Forms.SendKeys.Send("");
        }

X
xyzMann Themenstarter:in
15 Beiträge seit 2010
vor 14 Jahren

huhu

also danke erstmal für die antworten hatte jetzt zeit mal bichen rumzuprobieren...

also ich nutz visual studio 2008

@rongchaua
also PostMessage kennt er nich - fehlt mir ein using?
Thread sleep ... mit system.threading.thread.sleep gehts...

was genau ist m_ipHandle? - meinst du den keycode?


der code klang auhc nicht schlecht

SendInput function is the right answer. Correct way to use it with DInput is something like this:

//*********************************************************  
// Sets a button to down state  
static void SetInputDX(WORD input_code_set)  
{  
INPUT inp[1];  
memset(inp,0,sizeof(INPUT));  
inp[0].type = INPUT_KEYBOARD;  
inp[0].ki.wScan = input_code_set;  
SendInput(1, inp, sizeof(INPUT));  
  
}  
//*********************************************************  
// Sets a button to up state  
static void ReleaseInputDX(WORD input_code_release)  
{  
INPUT inp[1];  
memset(inp,0,sizeof(INPUT));  
inp[0].type = INPUT_KEYBOARD;  
inp[0].ki.dwFlags |= KEYEVENTF_KEYUP;  
inp[0].ki.wScan = input_code_release;  
SendInput(1, inp, sizeof(INPUT));  
  
}  
  

For DInput to see these codes properly you should pass DInput constants like:
DIKEYBOARD_A but only first two bytes (letter "a" is 0x041e , and so on).
I'we tried this, it realy works.

aber da kommt er auch aus dem meckern nich mehr raus ^^

weis aber auch nicht für was die variablen stehen wie INPUT und das array inp[1]...

könnte mir einer die funktion erklären bitte?

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo xyzMann,

siehe zunächst [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen).

also PostMessage kennt er nich - fehlt mir ein using?

PostMessage ist eine Win32-Funktion, die du per DllImport einbinden musst. Beispiele findest du im Netz.

aber da kommt er auch aus dem meckern nich mehr raus ^^

Das ist auch kein C#-, sondern C- oder C++-Code. Den kannst du so nicht verwenden.

herbivore

X
xyzMann Themenstarter:in
15 Beiträge seit 2010
vor 14 Jahren

hab mich mal allein durchgewurstelt leider funkioniert folgender code nicht =/

er aktiviert mir mein fenster aber die taste wird nicht geschickt:

  [DllImport("USER32.DLL")]
        public static extern IntPtr FindWindow(string lpClassName,
        string lpWindowName);

        [DllImport("USER32.DLL")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int PostMessage(IntPtr hwnd, int msg, int wparam, int lparam);


        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr calculatorHandle = FindWindow(null, "Rechner");
            if (calculatorHandle == IntPtr.Zero)
            {
                MessageBox.Show("Programm ist nicht offen");
                return;
            }
            SetForegroundWindow(calculatorHandle)

            int WM_KEYDOWN = 0x100;
            int WM_KEYUP = 0x101;
            int Taste1 = 0x31;
           
            PostMessage(Handle, WM_KEYDOWN, Taste1, 0);
            System.Threading.Thread.Sleep(200);
            PostMessage(Handle, WM_KEYUP, Taste1, 0);
        }

könnte mir bitte einer erklären warum X(

danke

1.130 Beiträge seit 2007
vor 14 Jahren

Directinput wird von vielen spielen verwendet und umgeht direkt die windowsnachrichten. das lässt sich wiederum umgehen

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

X
xyzMann Themenstarter:in
15 Beiträge seit 2010
vor 14 Jahren

ich kann aber meine "1" nichtmal an den calc schicken!

R
100 Beiträge seit 2009
vor 14 Jahren

@xyzMann:

  • Dein Code hat vielleicht Fehler drin
PostMessage(Handle, WM_KEYDOWN, Taste1, 0);

Die "Handle" Variable muss calculatorHandle sein.

  • Nach dem Korrigieren muss dein Code funktionieren. Ich habe schon getestet. Darunter ist mein Code. Es kann nummer 1 ans Calculator (ich habe Windows Englisch Version) Programm schicken.

  • Außerdem prüfst du nochmal mit Spy++ ob Name des Rechner Fensters richtig ist.

[DllImport("USER32.DLL")]
        public static extern IntPtr FindWindow(string lpClassName,
        string lpWindowName);

        [DllImport("USER32.DLL")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int PostMessage(IntPtr hwnd, int msg, int wparam, int lparam);

        static void Main(string[] args)
        {
            IntPtr calculatorHandle = FindWindow(null, "Calculator");
            if (calculatorHandle == IntPtr.Zero)
            {
                return;
            }

            int WM_KEYDOWN = 0x100;
            int Taste1 = 0x31;

            PostMessage(calculatorHandle, WM_KEYDOWN, Taste1, 0);        
        }
X
xyzMann Themenstarter:in
15 Beiträge seit 2010
vor 14 Jahren

@rongchaua

ah danke =) jetzt funzt es nur leider nur im calc =/ nicht im game

@floste

sendinput habe ich schon versucht postmessage jetzt auch sendkeys funzt sowieso nicht =/

gibt es noch irgendeine möglichkeit =(?
nochmal danke für die echt gute hilfe hier 👍

X
xyzMann Themenstarter:in
15 Beiträge seit 2010
vor 14 Jahren

keiner mehr eine idee =(?

R
103 Beiträge seit 2009
vor 14 Jahren

Kar hab ich ne Idee! Besorg Dir ne billige usb Tastatur für 5 Euro und kleb die Taste mit sekundenkleber fest. Dann anschliessen und bingo 😉

L
23 Beiträge seit 2008
vor 14 Jahren

Wenn du etwas Geld ausgeben kannst/willst, dann könntest du dir von Logitech eine G11/G15/... besorgen. Die haben Programmierbare Tasten, die entweder eine Tastenabfolge (inkl. Pausen), oder Scripte abspielen können.
Hab selber die G15 zu Hause und bisher hat das Abspielen von Tastaturabfolgen immer funktioniert. An das Scripten hab ich mich bisher noch nicht herangewagt, da ich es noch nicht gebraucht habe.
Die Scriptsprache ist LUA, wenn ich mich nicht irre.

Hoffe das hilft dir weiter.

MfG LaMa Jan

X
xyzMann Themenstarter:in
15 Beiträge seit 2010
vor 14 Jahren

ok hardwarelösung ^^

aber software mäßig gibbet nix mehr?

V
78 Beiträge seit 2008
vor 14 Jahren

Hast du denn meine erste Antwort bereits getestet (keybd_event)? Ist zwar nicht garantiert, dass das funktioniert hat aber bei mir schon oefter funktioniert.

Ich finde es ist einen Versuch wert 😉

Du koenntest vll auch mal schreiben, von was fuer einem Spiel du redest.

X
xyzMann Themenstarter:in
15 Beiträge seit 2010
vor 14 Jahren

@Vitab

ja hab ich =/

hab folgenden code versucht:

        void PressKey(byte keyCode)
        {
            const int KEYEVENTF_EXTENDEDKEY = 0x1;
            const int KEYEVENTF_KEYUP = 0x2;
            keybd_event(keyCode, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
            keybd_event(keyCode, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
        }

funzt im calc super im game nich bzw nur im chat =(

also ums mal konkret zu machen es handelt sich um das spiel shaiya - und bevor hier wieder cheating vorwürfe kommen - ich spiel es NICHT online und ich will mir keinen bot bauen (die könnt ich mir schnell im netz runterladen xD)

hab das keyevent in warcraft 3 probiert klappt super nur in shaiya irwie nich =(

1.130 Beiträge seit 2007
vor 14 Jahren

haste ma den scancode eingetragen? irgendwie gibts sowas wie mapvirtualkey (oder ähnlich, auf mycsharp gibts was) und außerdem uipi und uac beachten

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

X
xyzMann Themenstarter:in
15 Beiträge seit 2010
vor 14 Jahren

@Floste danke erstmal für die antwort =)

also hatte jetzt mal wieder zeit und hab mapvirtualkey versucht

        [DllImport("user32.dll")]
        static extern uint MapVirtualKey(uint uCode, uint uMapType);

        [DllImport("user32.dll")]
        static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);

        public const int KEYEVENTF_EXTENDEDKEY = 0x01;
        public const int KEYEVENTF_KEYUP = 0x02;

das prog funzt im calc wieder super xD... in shaiya leider nur wenn ich was schreibe im spiel selber nicht =(

uipi kann ich damit glaub ausschließen (musste googeln was du damit meinst ^^) denn wenn das beim schreiben funzt und sonst nich hats ja nix mit dem prozess als soches zu tun oder?
uac same like uipi hab gegloogelt und würd sagen das is völlig egal ob ichs mit admin oder nich start ^^

X
xyzMann Themenstarter:in
15 Beiträge seit 2010
vor 14 Jahren

keine Idee mehr da?

R
103 Beiträge seit 2009
vor 14 Jahren

Also, was auf jeden Fall geht, wäre einen eigenen Tastaturtreiber zu schreiben und den einzubinden.
das geht aber dann definitiv nicht mehr in C#, sondern nur in C(++) mit dem DDK.

X
xyzMann Themenstarter:in
15 Beiträge seit 2010
vor 14 Jahren

Ty 4 Info

ich dachte immer das c# besser is als c++ ^^

leider hab ich von c++ 0 ahnung XD hat des schonmal einer gemacht mit dem treiber? bzw is des schwer ^^

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo xyzMann,

ich dachte immer das c# besser is als c++ ^^

solch pauschale Aussagen stimmten stimmen selten absolut. Es kommt eben immer auch auf den Einsatzzweck an.

hat des schonmal einer gemacht mit dem treiber? bzw is des schwer ^^

Für jemanden, der das noch nie gemacht hat, ist das sicher alles andere als trivial.

Zumal man mit einen falsch programmierten Treiber leicht das ganz System runterreißen kann, was einem bei normaler Anwendungsprogrammierung ja eher selten passiert.

herbivore

R
103 Beiträge seit 2009
vor 14 Jahren

Kann Herbivore nur zustimmen, habe vergessen zun erwähnen, dass das absolut nicht zu empfehlen ist, wenn man nicht gerade fortgeschrittener C(++) Programmierer mit viel Hintergrundwissen und Treiberprogramierungs Know-How ist.

X
xyzMann Themenstarter:in
15 Beiträge seit 2010
vor 14 Jahren

und ein fertigen Treiber - bekommt man sowas? weil ich kann zwar c# (mehr oder weniger gut xD) aber c++ wär neuland

R
103 Beiträge seit 2009
vor 14 Jahren

Das hier sieht ganz vielversprechend aus:

http://www.oblita.com/hooking-part1

Wenn Du dich wirklich mit Treiberprogrammierung beschäftigen willst, dann must Du ein bischen nach DDK und "Keyboad Filter driver" googeln. Dafür sind aber zwingend weitreichende Kentnisse in C++ und Windows Treiberprogrammierung notwendig und selbst dann ist das ganze umständlich, weil es kaum Debugmöglichkeiten gibt und Fehler im treiber das ganze System lahmlegen. Zusätlich meckert Windows noch rum, wenn man unsignierte treiber installieren will und dann hat man noch Ärger wegen geänderteten Treiberschnittstellen unter W2K,XP , Vista und Win7.
Also kurz gesagt : VERGISS ES. 😉

Vielleicht bringt dich ja auch der link oben weiter.

X
xyzMann Themenstarter:in
15 Beiträge seit 2010
vor 14 Jahren

ok dann danke euch allen für die hilfe =)

ich gebs dann auf X(