Autor Beitrag
theomega
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Sa 21.12.02 14:01 
Hallo Leute
ich will an ein Spiel (konkret: Need for Speed: Hot Pursuit 2) einen Tastendruch senden. Dazu benutze ich folgenden Befehl:
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
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?

Danke
TO
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Mi 01.01.03 22:22 
Ich wieß es zwar nicht genau, aber mit hoher Wahrscheinlichkeit fragt NFS die Tasten mit MS DirectInput ab. Damit kenne ich mich nicht aus. Villeicht solltest dich hier bei AUQ mal erkundigen, wie man Hotkeys an DInput postet (zumindest vermute ich, dass es so geht).

Oder, was ich aber eher ausschließe, kannst du versuchen, mit PostMessage() die WM_KEYDOWN bzw. WM_KEYUP Nachricht zu schicken. Das würde ich versuchen, bevor man es mit DInput probeirt.