Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Tastendrücke an Spiel (https://www.delphipraxis.net/1717-tastendruecke-spiel.html)

theomega 19. Dez 2002 13:13


Tastendrücke an Spiel
 
Hallo
nächstes Problem, ich will an ein Spiel (konkret: Need for Speed: Hot Pursuit 2) einen Tastendruch senden. Dazu benutze ich folgenden Befehl:
Code:


procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);
{************************************************************
* Procedure PostKeyEx32
*
* Parameters:
*  key   : virtual keycode of the key to send. For printable
*           keys this is simply the ANSI code (Ord(character)).
*  shift : state of the modifier keys. This is a set, so you
*           can set several of these keys (shift, control, alt,
*           mouse buttons) in tandem. The TShiftState type is
*           declared in the Classes Unit.
*  specialkey: normally this should be False. Set it to True to
*           specify a key on the numeric keypad, for example.
* Description:
*  Uses keybd_event to manufacture a series of key events matching
*  the passed parameters. The events go to the control with focus.
*  Note that for characters key is always the upper-case version of
*  the character. Sending without any modifier keys will result in
*  a lower-case character, sending it with [ssShift] will result
*  in an upper-case character! 
// Code by P. Below
************************************************************} 
type
  TShiftKeyInfo = record
    shift: Byte;
    vkey: Byte;
  end;
  byteset = set of 0..7;
const
  shiftkeys: array [1..3] of TShiftKeyInfo =
    ((shift: Ord(ssCtrl); vkey: VK_CONTROL),
    (shift: Ord(ssShift); vkey: VK_SHIFT),
    (shift: Ord(ssAlt); vkey: VK_MENU));
var
  flag: DWORD;
  bShift: ByteSet absolute shift;
  i: Integer;
begin
  for i := 1 to 3 do
  begin
    if shiftkeys[i].shift in bShift then
      keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0);
  end; { For }
  if specialkey then
    flag := KEYEVENTF_EXTENDEDKEY
  else
    flag := 0;

  keybd_event(key, MapvirtualKey(key, 0), flag, 0);
  flag := flag or KEYEVENTF_KEYUP;
  keybd_event(key, MapvirtualKey(key, 0), flag, 0);

  for i := 3 downto 1 do
  begin
    if shiftkeys[i].shift in bShift then
      keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0),
        KEYEVENTF_KEYUP, 0);
  end; { For }
end; { PostKeyEx32 }

.
.
.
.
.


PostKeyEx32(VK_UP,[],false);
das sollte jetzt einen Druck auf "Pfeil nach oben" ausführen und damit das Gasgeben simulieren. Tut nur nicht, NFS nimmt keine Tastendrücke aus meinem Programm entgegen, wogegen es mit "normalen" Windowsanwendungen (notepad, Word, Delphi) ganz perfekt geht.
Was mache ich falsch?

sakura 20. Dez 2002 12:38

Wahrscheinlich reagiert NFS auf Botschaften wie KeyDown und KeyUp, da diese zeitlich genauer sind als KeyPress.

theomega 20. Dez 2002 12:47

was heißt das für mich konkret? Was kann ich ändern?

sakura 20. Dez 2002 12:50

Das wiederum kann ich Dir leider nicht sagen, da ich mich mit der Materie nie weiter beschäftigt habe. Obiges, ist aber auch nur eine Vermutung.

Christian Seehase 20. Dez 2002 12:55

Moin The Omega,

schau Dir dazu mal die beiden Messages WM_KEYDOWN und WM_KEYUP an.
Eventuell kannst Du es damit simulieren.
Voraussetzung ist natürlich, dass Du dazu das entsprechende Fensterhandle hast.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:55 Uhr.

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