Tasteneingabe simulieren
-
Hab schon in andren Foren und auf einigen Seiten nach der Lösung des Problems gesucht leider nix gefunden, vielleciht fällt hier ja jemandem was ein.
Also mein Programm soll einen einfachen Tastendruck auf der Tastatur simulieren. Per keybd_event eigentlich kein Problem, aber nicht alle Programme fallen darauf rein (vermute das die Programme bei denen es nicht funktioniert die Tastatureingaben per DX abfragen oder anderweitig), hat also jemand ne andere Variante die halt "tiefer" (Hardwaremäßig) ansetzt.
P.S. SendInput funzt genausowenig.
-
Wird bei DirectInput nicht direkt der Status der Hardware abgefragt? Da kann man dann natürlich schlecht etwas simulieren
-
Wenn dem wirklich so ist wird wohl meine Aussage falsch sein
-
Sry @MysticEmpires aber ich war leider nicht in der Lage deinen letzten Satz zu übersetzen
.
Leider helfen mir die Überlegungen über DirectInput auch nicht viel weiter. Es war eh nur ne Vermutung von mir, das diese Programme bei denen das Tastensimulieren per keybd_event nicht funzt per DirectInput arbeiten, 100%ig sicher bin ich mir da nicht (es handelte sich eben um nen Emulator der nach einer Fehlermeldung von ihm zu urteilen, über DirectDraw gearbeitet hat zu vermuten wäre das er evtl. auch über DInput die Tasten abfragt, aber wie gesagt sicher ist es nicht, sondern sicher ist nur das einige Programme nicht auf keybd_event reagieren).
Also gibt es irgendeine 100%ige Lösung Tasten zu senden.
Direkt über Ports per ASM was ja nicht so leicht in C++ einzubinden/erlaubt wäre, oder sonst noch ne Variante?!
-
DirectInput weiß nicht, ob es eine deutsche oder englische Tastatur ist.
Es liefert AFAIK den Scancode, der grob gesagt von der Position der Taste auf der Tastatur abhängt. Die Taste mit dem Code DIK_Z ist auf einer deutschen Tastatur halt zufälligerweise mit 'Y' beschriftet...Wie wird das in HalfLife gemacht? Falls HalfLife DirectInput benutzt, ruft es ziemlich sicher einfach nur IDirectInputDevice8::GetDeviceState auf. An die Implementierung dieser Funktion wirst du nicht rankommen.
Du kannst unter Windows übrigens auch mit Assembler keine Ports ansprechen, geschweige denn Tastendrücke damit hardwaremäßig simulieren.
p.s.:
Vielleicht könnte man die DirectInput.dll faken. Wenn eine DirectInput.dll im Arbeitsverzeichnis der Exe liegt, wird diese anstelle der richtigen genommen.
Bei dem DirectX 9 SDK ist das Programm "D3DSpy" dabei, das macht genau das für Direct3D. Ist aber wahrscheinlich nicht gerade einfach.
-
Au man keine guten Nachrichten schade. Und jep das mit den Ports hat ich schon befürchtet.
Ich hatte ja wenigstens gehofft das wenn DInput das schon Hardwaremäßig abfragen sollte, es auch selber eine umgekehrte Variante anbietet (naja hab außer mit Joysticks nich so viel mit DInput am Hut, und hab auch leider kein passendes SetDeviceState oder was auch immer gefunden).
Gut auf jeden fall danke, sollte jemand noch was finden wär ich schon sehr gespannt drauf.
-
up