Benutzer mit den meisten Antworten
Eine Tastatureingame im Spiel machen bzw eine Taste drücken

Frage
-
Hallo und eine schöne Ostern Euch allen.
Ich wende mich nun mittlerweile völlig verzweifelt an die Profis unter Euch. Ich wollte für meine Tochter ein Programm schreiben, das in einem DirectX10 Spiel eine Taste drückt, um genau zu sein die Taste (Q). ( damit wird der Chat aufgerufen. Leider ist bis Jetzt alles was ich versucht habe fehlgeschlagen. Folgendes habe ich versucht:
SendKeys.SendWait("Q")
das das nicht geht hatte ich schon geahnt. Nächster Versuch :
2 3 Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Int32, ByVal dwExtraInfo As Int32) Private Const VK_Q = &H51 ' Taste Q drücken Private Const KEYEVENTF_KEYUP = &H2 'loslassen ' Aufruf: Call keybd_event(VK_Q, 0&, 0&, 0) System.Threading.Thread.Sleep(200) Call keybd_event(VK_Q, 0&, KEYEVENTF_KEYUP, 0&)
Auch dies funktioniert in dem Spiel nicht, aber beide funktionieren zb im Wordpad ohne Probleme. Nun hatte ich schon die befürchtung das es generell nicht geht, weil das Spiel vieleicht nich auf befehle von "Fremdprogrammen" nicht reagiert, aber wenn ich zb mit der Gamingmaus ein Makro aufzeichne, und das dann abrufe geht es ja auch, und das ist ja im Prinzip auch ein Fremdprogramm. Nun suche ich schon seit Tagen nach eine Lösung, aber finde nix was mich irgendwie weiterbringt.
Kann man per Visual Basic eine Tastatureingabe so simmulieren als wenn sie diereckt von der Tastatur kommt??? Was habe ich noch für möglichkeiten?
Gruß Ronny
Antworten
-
Oh man, so einfach kann es sein...
Erklären warum es so ist kann ich dir zwar nicht, für die Adminrechte, siehe hier: http://csharp-tricks.blogspot.de/2010/05/c-anwendung-mit-administratorrechten.html
In VB.NET geht das ganz genau so.
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
Einen Konverter zwischen C# und VB.NET Code gibt es hier.- Als Antwort markiert Wild-Life78 Mittwoch, 3. April 2013 15:47
Alle Antworten
-
Hallo,
spiele sind in der Hinsicht schon ne seltsame Sache. Manche Sachen werden einfach geblockt o.ä., wie bspws. Screenshots, warum auch immer.
Mit den beiden Versuchen von dir Simulierst du eine Tastatureingabe, für das Programm selbst macht das keinen Unterschied. Ich glaube, das es daran liegt das das Spiel (DirectX) die Tasten dierekt vom USB Port aufzeichnet.
Bei meiner Recherche habe ich folgende Seiten gefunden:
http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/29cf2de9-412e-44dd-9050-174089d8e2a2/
http://stackoverflow.com/questions/8544271/how-can-i-send-keyboard-input-to-a-opengl-directx-game-windowIch hoffe das hilft dir.
PS: auch noch ein schönes Ostern :)
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke. -
Also was ich den Links entnehmen konnte, das es wohl mit einem Tastaturhook gehen könne, aber aber keine Ahnung was das ist, und wo ich ansetzen muss, auch den Codebeispielen werde ich nicht Schlau
....... Nachtrag, habe mich inzwischen etwas über Tastaturhooks belesen. Bin mir nicht sicher das das die Lösung sein soll.
Hier ein Bildausschnitt aus Spy++ da ist zu sehen was im Spiel passiert, wenn ich "Q" drücke, weiß nicht ob das hilft
- Bearbeitet Wild-Life78 Montag, 1. April 2013 12:35
-
Ein hook ist ein Programmteil, welcher sich in ein anderes Programm/System "einhackt". In dem Fall in die Tastatur.
Bevor wir uns da heran wagen (nicht ganz einfach), ich habe noch folgenden Thread gefunden:
http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/55eff6a9-62a0-4529-a828-b33a3b8e8aa0/
Die SendInput-Funktion geht vielleicht.Es scheint viele mögliche Lösungen zu geben, ob Sie funktionieren kann ich leider nicht testen.
Vielleicht hilft auch noch folgendes: http://foren.activevb.de/forum/directx/thread-3968/beitrag-3968/Sendkeys-in-directX-spiel/<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke. -
So bin wiede da, war mal mit den Kiddys unterwegs, muss auch mal sein. habe gerade nur kurz auf die links geschaut, werde jetzt aber noch mal in Ruhe drauf schauen. Aber schon mal vielen Dank das du mir helfen willst, wäre echt schön wenn wir das hinbekommen.
Ja die Sendinput Funktion könnte wohl das richtige sein, allerdings sind viele Sachen die ich bereits darüber gefunden habe in C# oder C++ geschrieben, und mir als "Laie" fällt es schwer das in Visual Basic umzusetzen. Bin zwar nicht mehr so neu in VB und hier im Forum, habe aber fast 3 Jahre nix mehr gemacht. Dachte VB wäre wie fahradfahren, und man verlernt es nicht, werde aber zur Zeit vom Gegenteil überzeugt. ^^
Gruß Ronny
- Bearbeitet Wild-Life78 Montag, 1. April 2013 15:39
-
Also der letzte Link sah ganz gut aus, endete aber irgendwie im Nichts, überhaupt wenn ich die ganzen Googlesuchergebnisse mir so anschaue, sieht man viele ansätze und wenn man den Foren weiterliest verläuft es im Sand, finde nicht ein in Vb geschriebenes bsp., was einigermaßen vernüftig erklärt ist oder am Ende funtioniert, weil einfach Copy/Paste bringt mich nur bedingt weiter, denn am Ende möchte ich auch verstehen was da passiert.
- Bearbeitet Wild-Life78 Montag, 1. April 2013 16:57
-
Zum konvertieren von C# in VB.NET kann ich folgende Seite empfehlen:
http://codeconverter.sharpdevelop.net/SnippetConverter.aspx
einfach und funktioniert (fast) immer.Ich bin bei Problemen immer so vorgegangen, das ich eine Lösung gesucht habe und nur bedingt darauf achtete was da nun geschiet. Wenn es dann funktionierte sah ich mir den Code nochmal genauer an um ihn zu verstehen, wobei das bei der WinAPI manchmal echt nicht ganz leicht ist.
Wie lief es denn mit SendInput? Laut PInvoke.net sieht die Deklaration so aus:
<DllImport("user32.dll", SetLastError:=True)>
Wenn mir noch etwas einfällt melde ich mich, jedoch gehen mir langsam die Ideen aus was man noch machen könnte.
Private Shared Function SendInput(ByVal cInputs As Integer, ByRef pInputs As MOUSEINPUT, ByVal cbSize As Integer) As Integer
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke. -
Hey, Danke für den Converter glaube das der mir sehr nützlich sein wird. Mit Pinvoke .... Da war ich heute früh schonmal, denke mal das Du diesen link meinst :http://www.pinvoke.net/default.aspx/user32.sendinput Ja die Deklaration sah gut aus was mich abgeschreckt hatte war das das was darunter kommt nicht in vb.net war allerdings werde ich das Morgen nochmal probieren, hatte heute wenig Ruhe und gebe jetzt erstmmal auf. Werde mich aber nochmal melden.
-
Hallo habe auf dieser Seite etwas gefunden, von dem ich dachte es könnte funtionieren oder zumindest weiterhelfen: http://content.gpwiki.org/index.php/DirectX:DirectInput:Tutorials:VBNET:DX9:Keyboard_Handling
Leider bekomme ich schon beim Import Probleme, und weis auch nicht genau was er hier importieren will. Aber vieleicht könnt ihr mir weiterhelfen. Hier mal der code den ich 1zu 1 übernommen habe
Imports Microsoft.DirectX Imports Microsoft.DirectX.DirectInput.CooperativeLevelFlags Imports Microsoft.DirectX.DirectInput Public Class Form1 Inherits System.Windows.Forms.Form Dim KB As New DirectInput.Device(DirectInput.SystemGuid.Keyboard) Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load KB.SetCooperativeLevel(Me, Background Or NonExclusive) Me.Show() KB.Acquire() End Sub Private Sub Form1_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed KB.Dispose() KB = Nothing End Sub Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick Dim State As DirectInput.KeyboardState State = KB.GetCurrentKeyboardState If State.Item(Keys.Escape) Then Me.Close() If State.Item(Keys.A) Then Label1.Text &= "a" If State.Item(Keys.B) Then Label1.Text &= "b" If State.Item(Keys.C) Then Label1.Text &= "c" End Sub End Class
Hoffe das ihr mir etwas dazu sagen könnt was mir weiterhilft. -
Ich nehme mal an das du die Verweise fürs DirectX noch nicht hinzugefügt hast. Als erstes brauchst du die entsprechend SDK dafür:
Normalerweise sollten sich die Dateien im Installationsordner unter Developer Runtime befinden, bei mir fand ich Sie jedoch unter C:\Windows\assembly\GAC\Microsoft.DirectX bzw. Microsoft.DirectX.DirectInput\Versionsnummer\*.dll
Mehr dazu hier: http://social.msdn.microsoft.com/Forums/en-US/gametechnologiesdirectx101/thread/88311c18-cad6-4279-9a24-9728ddd8fba2/
Leider kann man den Tasten nichts zuweisen, da Item Readonly ist:
State.Item(Key.Q) = True
Was aber vielleicht erfolg bringt ist das erstellte KB-Feld im Code. Diese hat einige Set/Send-Methoden, unter anderem auch SendHardwareCommand(), diese verlagt aber Parameter zu denen ich nichts sagen kann. Microsoft sagt da auch mal wieder sehr viel dazu: http://msdn.microsoft.com/en-us/library/windows/desktop/bb321417%28v=vs.85%29.aspx
Aber vielleicht findest du noch etwas anderes im Internet dazu.
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
Einen Konverter zwischen C# und VB.NET Code gibt es hier. -
Also habe nach den ganzen imports,alle fehler aus dem code gehabt, beim starten bzw debuggen, stürz visual basic komplett ab ohne fehlermeldung ohne alles, keine ahnung was da beim formload geschieht. ist es wirklich so schwer ein programm dazu zubekommen die taste Q in einem directx 10 game zu drücken. verstehe das echt nicht, und nochweniger verstehe ich warum es mit einem makro von maus oder tastatur geht, ich meine beim aufnehmen des makro wird doch auch nur der tastenanschlag von der tastatur abfragt und später wiedergegeben. oder irre ich mich da?
- Bearbeitet Wild-Life78 Dienstag, 2. April 2013 13:37
-
Ich nehme mal an das das Makro dem Computer vorspielt die Taste sei geddrückt. Wenn man mit SendKeys einen Tastendruck sendet, dann ist das wie wenn du ganz kurz auf die Taste drückst. Das bekommt das Spiel auch mit aber es ignoriert die Meldung und Fragt selbst alle Tastenzustände periodisch ab. Entweder fragt das Spiel zu selten die zustände ab, sodass nie ein tastendruck registriert wird oder es wwerden direkt Daten von der Tastatur ausgelsen, also ohne das Windows dazwischen hängt. Deswegen waren unsere Ansätze auch immer an DirectX gekettet, da nur dieses sich so weit hinein hängen kann.
Mir sind die Ideen jetzt leider auch ausgegangen.
PS: Bei Windows 8 C++ Apps mit DirectX geht es übrigens auch nicht, habe es eben mal getestet.
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
Einen Konverter zwischen C# und VB.NET Code gibt es hier. -
Ist es denn möglich die Tastatur direckt anzusprechen? oder ein senkey zu verlangsamen, wobei das glaube quatsch ist, denn zb hiermit :
Call keybd_event(VK_Q, 0&, 0&, 0)
System.Threading.Thread.Sleep(200)
Call keybd_event(VK_Q, 0&, KEYEVENTF_KEYUP, 0&)Halte ich die Taste auch gedrückt 200ms
-
Um eine Hardware direkt anzusprechen müsste man sich in den Treiber hinein hängen, wovon ich abrate.
Dein Code sagt Windows zwar [Q] drücken > 200ms warten > [Q] loslassen, wenn du den Code jedoch ausführst wärend notepad im Vordergrund ist, wird nur ein einziges [Q] gedrückt. Darum wird auch zwischen "Down" und "Press" unterschieden. "Press" sendet periodisch, solange die Taste gedrückt ist, "Down" nur einmal. Du könntest es nochmal ersuchen indem du das senden in eine Dauerschleife (While True...While End) packst.
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
Einen Konverter zwischen C# und VB.NET Code gibt es hier. -
"ICH BIN JA SO EIN DEPP (-:" lach ^^kleine Selbstkritik folgenden Code habe ich bei meinen ersten Versuch vor ca einer Woche gemacht um zu testen ob ich in dem Spiel eine taste drücken. Was natürlich nicht funktioniert hat. Jetzt habe ich vor lauter verzweiflung das Programm mal erstellt, und mit Administratorechten gestartet. LOL und siehe da, es geht. Nun habe ich eine Woche voller verzweilflung nach einer Lösung gesucht, dabei hatte ich sie schon längst, wobei ich nicht ganz verstehe warum es mit Administratorechten geht, vllt kann mir das einer erklären.
Public Class Form1 'Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Int32, ByVal dwExtraInfo As Int32) Private Const VK_1 = &H31 ' Taste 1 Private Const KEYEVENTF_KEYUP = &H2 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Start() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Call keybd_event(VK_1, 0&, 0&, 0) System.Threading.Thread.Sleep(200) Call keybd_event(VK_1, 0&, KEYEVENTF_KEYUP, 0&) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Timer1.Start() End Sub End Class
Jetzt stellt sich mir noch eine Frage, wie kann im Code dem Programm von vornherein Administratorechte geben? wäre schon wenn das Programm gleich mit den nötigen Rechten startet. -
Oh man, so einfach kann es sein...
Erklären warum es so ist kann ich dir zwar nicht, für die Adminrechte, siehe hier: http://csharp-tricks.blogspot.de/2010/05/c-anwendung-mit-administratorrechten.html
In VB.NET geht das ganz genau so.
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
Einen Konverter zwischen C# und VB.NET Code gibt es hier.- Als Antwort markiert Wild-Life78 Mittwoch, 3. April 2013 15:47
-
Ok vielen Dank, jetzt kann ich mich erstmal wieder den eigentlichen Programm zuwenden, Die letzen Tage bestanden nur darin kleine Tools zu basteln und alles mögliche auszuprobieren. Naja zumindest bin ich davon nicht Dümmer geworden.
Vielen Dank nochmal