Im einem Spiel eine Taste drücken

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Wild-Life78.

    Im einem Spiel eine Taste drücken

    Guten Morgen
    Neuer Tag Neue Frage ;)
    Also heute hänge ich an einem neuen Problem was mir gerade graue Haare beschert
    Ich möchte in einem Spiel die Taste "1" drücken.... einach gesagt, aber die umsetzung scheint wohl nicht ganz so einfach zu sein.
    Mein ursprünglicher Plan

    VB.NET-Quellcode

    1. SendKeys.SendWait("1")

    mhh aber das war wol nix, kann die "Einsen" überall hinschreiben, Wordpat, Explorer etc. aber das Spiel zeigt sich davon sehr unbeindruckt, kurz gesagt: Nix passiert
    Nun möchte ich aber von Euch nicht einfach einen Lösungscode sondern zunächst erstamal verstehen warum das nicht geht.
    und dann vllt ein paar Lösungsansätze, was ich nicht möchte ist: ein verweiß auf die Suchfunktion, denn bitte glaubt mir, die benutze ich, da ich ja auch verstehen möchte was ich hier tue. Aber alles was ich gefunden habe sind 100 Treads mit verweiß auf die Suchfunktion. ha ha ha also bitte nur ernstgemeinte Hilfe
    Auch muss ich zugeben, das ich nicht so recht weiß wonach ich suchen muss.
    Aber es gibt sicherlich mehrere möglichkeiten um im Spiel die Taste 1 zu drücken, ich habe ein ähnliches Programm schonmal vor jahren für das selbe Spiel gemacht, da war "Sendkeys...." noch völlig ausreichend, aber scheinbar haben die in folge vieler Updates etwas geändert denn auch das alte Programm funktioniert nicht mehr.
    Das seltsame ist wenn ich zb. mit der Gamingmaus ein Makro aufnehme, dann ist es möglich den Tastendruck zu senden. Also muss es ja irgendwie gehen,was kann die Maus was ich nicht kann??? Was muss ich lernen und Wo muss ich ansetzen.

    Ach ja ich kenne auch die Metode mit (GetAsyncKeyState) aber irgendwie geht die auch nicht oder ich mache es falsch?

    wäre schön wenn ihr mir ein paar Tips oder direckte Links mit Lesestoff geben könnt, melde mich nach dem Ostereinkauf wieder
    Auch wäre gut zu wissen warum Sendkey... nicht mehr geht

    Gruß Wild-life78
    Get(Async)KeyState ist dafür da, um abzufragen, ob eine Taste gedrückt ist. Nicht um einen Tastendruck zu senden.
    Sendkeys funktioniert in Spielen nicht, da diese anders auf die Tastaturzugreifen wie normale Programme, da es in Spielen um Reaktionszeit geht und das sonst langamer wäre.
    Das Problem bei SendKeys ist, dass die Tasten nicht gedrückt halten werden.
    Die Tasten werden also sozusagen -- sofort wieder losgelassen.

    Besser geht das mit dem keybd_event API Call.

    VB.NET-Quellcode

    1. Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)


    Hier noch ein kleines Beispiel zur Benutzung:

    VB.NET-Quellcode

    1. 'Taste drücken
    2. keybd_event(32, 0, 0, 0)
    3. 'Taste loslassen
    4. keybd_event(32, 0, 2, 0)


    Wenn ich mich gerade nicht komplett täusche müsste dieses Snippet die Leertaste drücken.

    Gruß,
    Manawyrm

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Manawyrm“ ()

    Auch funktioniert das ganze mit der Inputsimulator-DLL, da kannst du einfach Texte an das Spiel senden oder auch einzelne Tasten. Alles sehr einfach gehalten.
    Für die Dll selbst guck mal bei den Anhängen hier: (Einfach InputSimulator.DLL downloaden)
    Pixelmagic - Eine Lib zur Bildbearbeitung

    Hier das Tutorial zur Nutzung:
    [VB 2010] Tastendruck Simulieren
    @ Telcrome, erstmal ein riesen Danke für Deine Dll, finde diese mal richtig genial, und vieles davon ist sehr nützlich. Aber leider auch hiermit das gleiche Problem, kann damit überall den Tastendruck 1 simmulieren, aber funktioniert auch nur wie Sendkey...
    Im Wordpad gehts, im Game tut sich nichts. Sollte es wirklich generell nicht möglich sein??? mhh aber zb. die Makrofunktion meiner Maus zeichnet ja auch nur Tastendrücke auf und gibt sie zurück, also kann es eigentlich nicht daran liegen, das es mit, ich nenne es mal Fremdprogrammen nicht möglich ist. Jetzt bin ich etwas Ratlos :(
    SendInput usw. schicken afaik nur Daten per Windows Message an eine Anwendung (korrigiert mich, wenn ich falsch liege). Das wird dann eben auch von WordPad etc. verwendet. Das simuliert aber nicht den Tastendruck auf Lowlevel-Ebene und somit sollte z.B. DirectInput keine Benachrichtigung erhalten, sofern das verwendet wird. Ich hoff' mal, dass du nicht cheaten willst und empfehle dich an DirectInput weiter. Ich hab's zwar selber nicht gemacht, aber ich glaube, dass es eine Prozedur gibt, die das kann (hab's selber nicht ausprobiert, aber ich denk' mal, dass die dafür da war).

    Gruß
    ~blaze~
    Nein also Vom Cheaten/Hacken bin ich weit weg, Im Prinzip möchte ich eigentlich ein Programm schreiben das genau das tut was ich bisher mit meiner Makromaus gemacht hat, kurze erklärung für die Jenigen die es interessirt. Im Spiel in dem man haupsächlich mit Schwertern kämpft kann man sich verschieden Combos erstellen die durch verschiedener kurz aufeinander folgender Tastenkombinationen ausglöst werden. Makros sind sozusagen eine Grundvorausetzung in dem Spiel und wird auch eigentlich von Jedem genutzt und ist auch nicht verrufen. Da meine Kinder mehrere solcher Spiele spielen, zugeben ich manchmal auch, sind die 6 Speicherplätze der Maus nicht ausreichend. Und genau für diese zwecke möchte ich dieses Programm machen.
    Leider bin ich jetzt ohne Eure Hilfe etwas aufgeschmissen da ich nach unzähligen Fehlversuchen nun nicht mehr weiß wo ich ansetzen soll. Der Reiz das irgendwie hinzubekommen, mit mehr oder weiniger Hilfe von Euch ist eigentlich größer als wie der Reiz des Spieles selbst. Nur möchte ich nicht das ihr Denkt das mit den Tool direckt ind das Spiel eingreifen will, oder ihr mir bei etwas "Unfairen" helft. Deshalb die kurze Erklärung.

    Aber eine Idee habe ich nun immer noch nicht.
    So nun habe ich viel gelesen und viel probiert aber, ich trete irgendwie auf der stelle.
    Mein letzter Fehlversuch sah so aus

    VB.NET-Quellcode

    1. Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Int32, ByVal dwExtraInfo As Int32)
    2. Private Const VK_1 = &H31 ' Taste 1 drücken
    3. Private Const KEYEVENTF_KEYUP = &H2 'loslassen


    Aufruf:

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. Call keybd_event(VK_1, 0&, 0&, 0)
    3. System.Threading.Thread.Sleep(200)
    4. Call keybd_event(VK_1, 0&, KEYEVENTF_KEYUP, 0&)
    5. End Sub


    Funktioniert überall aber im Spiel nicht :( Hat Jemand eine Idee oder einen Wink mit dem Zaunsphahl ???
    Es handelt sich nicht um Gw2, wobei ich das auch spiele. ich habe zwar mit deiner Dll etwas rumexperimentiert, und es auch hinbekommen das ich damit, etwas ins "WordPad" schreiben konnte, aber im Spiel hat es nicht funtioniert. Jedoch muss ich auch zugeben das ich nicht genau weiß was deine Dll mach, da ich die funktion nur aufgerufen habe. Wenn Du etwas Zeit hast und mir wirklich helfen möchtes, vieleicht kannst du Mir zeigen wie Du es in Gw2 machst, also das was Dein Code in der dll tut. Aufruf des Process und das senden Der Message an das Spiel, vieleicht werde ich so etwas schlauer draus, denn ich muss zugeben das ich hier gerade Neuland betrete.

    Gruß Wild-life78
    und frohe Ostern Euch allen


    ;)
    "Lol, bin doch ein Depp" kleine Selbstironie :D Habe jetzt Tage lang nach einer Lösung gesucht, nichts aber auch rein garnix hat funktioniert, nun habe ich die Variante meine letzten hier geposteten Codes mal min Administratorrechten versehen, und siehe da alles funktioniert.

    Danke an die Jenigen versucht haben mir zu helfen ;)