Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DirectInput: GetDeviceData Hook (https://www.delphipraxis.net/150333-directinput-getdevicedata-hook.html)

Zacherl 14. Apr 2010 01:27


DirectInput: GetDeviceData Hook
 
Hey,

ich versuche ein paar kleine Tastatureingaben in ein Programm einzuschmuggeln, welches DirectInput verwendet. Jetzt habe ich es soweit geschafft, dass ich die GetDeviceData Methode des Device Interfaces gehookt habe.

Delphi-Quellcode:
function C_GetDeviceData(Self: IDirectInputDevice8A; cbObjectData: DWORD;
  rgdod: PDIDeviceObjectData; out pdwInOut: DWORD;
  dwFlags: DWORD): HResult; stdcall;
begin
  Result := O_GetDeviceData(Self, cbObjectData, rgdod, pdwInOut, dwFlags);
  if (Self = KeyboardInput) then
  begin

  end;
end;
Die Frage ist, wie bekomme ich es hin, dass ein 2 sekündiger Anschlag der Taste "C" simuliert wird? Habe schon mit den Parametern rumgespielt aber bisher ohne Erfolg. Das Einzige was funktioniert hat, war das Blocken aller Eingaben, indem ich rgdod mit ZeroMemory gelöscht habe.

Viele Grüße
Zacherl

Medium 14. Apr 2010 02:02

Re: DirectInput: GetDeviceData Hook
 
Wie sicher bist du, dass das Programm tatsächlich DI für Tastatureingaben verwendet? Es gibt von Microsoft nämlich die direkte Empfehlung dies nicht zu tun, sondern DI ausschließlich für Joysticks/-pads und ähnliches zu benutzen. (Abgesehen davon ist es auch noch ziemlich umständlich in der Umsetzung, so dass ich es nicht mal bevorzugen würde wenn es diese Empfehlung nicht gäbe :))

Grundsätzlich habe ich zur Simulation von Eingaben bisher kein Programm gesehen, dass nicht auf MSDN-Library durchsuchenSendInput() reagiert hätte. Falls du mit dem Programm aktiv auch Eingaben selber abfangen/verarbeiten möchtest, so würde ich einen MSDN-Library durchsuchenLow Level Hook empfehlen. Der dürfte auch greifen wenn eine DI Anwendung den Fokus hat, wobei ich das noch nicht bewusst getestet hab - es ging einfach bisher nur immer.

Zacherl 14. Apr 2010 14:37

Re: DirectInput: GetDeviceData Hook
 
Ich bin mir leider gar nicht sicher, dass die Anwendung DI verwendet. :( Es handelt sich um ein etwas spartanischeres Spiel, welches DirectX 9 verwendet. Denke allerdings schon dass DI zum Einsatz kommt, da meine Hook Callbacks ja ausgelöst werden und ich auch wie gesagt per ZeroMemory die kompletten Eingaben blocken kann.

Deine Möglichkeit werde ich direkt mal ausprobieren. Wenn das mit SendInput klappen würde, wäre das perfekt. Ich möchte nur Eingaben senden. Hatte es vorher mit keybrd_event() bzw. mouse_event() probiert, was leider keine Wirkung zeigte.

Edit: Mist. Im Optionsmenü, etc. funktioniert das mit SendInput ohne Probleme, soblad man aber im Spiel ist bleiben die Anschläge ohne sichtbare Wirkung -.-

Medium 14. Apr 2010 16:03

Re: DirectInput: GetDeviceData Hook
 
Hmm, das spricht ziemlich für DI, jau. Dafür darf sich der Hersteller mal dezent virtuell gerüffelt fühlen :stupid:

Da ich DI bislang immer bewusst vermieden hab (da ich bis dato nur mit Tastatur+Maus gearbeitet hab), kann ich dir zu Details dabei leider nicht weiter helfen :(

Zacherl 14. Apr 2010 21:48

Re: DirectInput: GetDeviceData Hook
 
Hab noch bisschen rumprobiert aber komischerweise greift mein Hook wohl nicht immer. Wenn ich die Werte logge, werden nur sporadische Eingaben aufgezeichnet, zumindest keine "Sondertasten". Naja das macht eigentlich nicht, nur bekomme ich es absolut nicht hin, Eingaben hinzuzufügen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz