Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Tastendruck "simulieren"


Arbengie - Do 22.07.10 11:38
Titel: Tastendruck "simulieren"
Hey, ich will einen kl. Keybinder für ein PC Spiel machen.
Den Chat öffnet man mit der Tasten "t", also muss ich den Tastendruck ja irgendwie "simulieren". Wie kann ich das machen? Mit GetAsyncKeyState prüft man ja, ob eine bestimmte Taste gedrückt worden ist, aber kann man damit auch einen Tastendruck simulieren, obwohl ich wie bei mir die Taste "t" selber nicht drücke.

MfG


elundril - Do 22.07.10 11:48

Hallo,

ich denke dieser [http://www.delphi-forum.de/viewtopic.php?t=46654] Thread könnte alles beinhalten was du dazu brauchst.

lg elundril


ASMFreak - Fr 23.07.10 09:55

Ich habe das nicht getestet, müsste aber so funktionieren:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var
  KeyState: TKeyboardState;
  NewKeyState: TKeyboardState; 
  I: Integer;
begin
  ...
  GetKeyboardState(KeyState);                                 // Sichern des aktuellen Zustands
  for I := Low(NewKeyState) to High(NewKeyState) do            // löschen aller nicht beötigten Tasten-
    NewKeyState[I] := 0;                                      // zustände
  NewKeyState[VK_SHIFT] := $81;                               // z.B., wenn [Shift] + [Taste]
  NewKeyState[VK_GewuenschteTaste]] := $81;                   // Taste, die gredrückt werden soll
  SetKeyboardState(NewKeyState);                              // "neuen" Zustand setzen
  try
    SendMessage(Handle, WM_KEYDOWN, VK_GewuenschteTaste, 1);  // Tastendruck simulieren
    SendMessage(Handle, WM_KEYUP, VK_GewuenschteTaste, 1);    // Taste auch wieder loslassen!
  finally
    SetKeyboardState(KeyState);                               // alten Zustand wiederherstellen
  end;
  ... 
end;

Gruß, Trutz


Jakob_Ullmann - Fr 23.07.10 10:56

oder einfacher:


Delphi-Quelltext
1:
2:
keybd_event(Ord('T'), 00,               0);
keybd_event(Ord('T'), 0, KEYEVENTF_KEYUP, 0);


ASMFreak - Fr 23.07.10 11:32

Diese Version nutzt die Windows-API und hat den Nachteil, dass die Message nicht direkt an das gewünschte Fenster geht.
Und wenn schon API, dann besser die modernere Variante SendInput.

Gruß, Trutz