Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Tastensimilation an Programm senden (https://www.delphipraxis.net/31679-tastensimilation-programm-senden.html)

maximus Caesar 12. Okt 2004 15:26


Tastensimilation an Programm senden
 
Hallo!
Hab schon die DP durchsucht, aber nichts gefunden, was mir hilft.
Ich möchte für meine Schwester ein programm schreiben, das folgende Tastenkombinationen an das Spiel Tropico sendet:
Strg+p+e+s+o+s
Strg+c+o+n+t+e+n+d+o
Strg+r+a+p+i+d+o

Dies aber auch nur, wenn man im Spiel z.B. die Taste F9 (F10, F11) drückt.
Kann mir jemand helfen?

Dax 12. Okt 2004 15:30

Re: Tastensimilation an Programm senden
 
Du baust dir einen Tastaturhook, der F9/F10 abfängt und entsprechen mit der Hier im Forum suchenSendkeys-Unit von Hier im Forum suchenKen Henderson die Tasten sendet.

maximus Caesar 12. Okt 2004 15:35

Re: Tastensimilation an Programm senden
 
Kannst du mir auch einen direkten Link geben, wo ich die Unit runterladen kann?

toms 12. Okt 2004 15:47

Re: Tastensimilation an Programm senden
 
Zitat:

Du baust dir einen Tastaturhook
Hi,

Eine Hook wäre dafür etwas übertrieben.
Hier im Forum suchenRegisterHotkey() tuts auch.


Tasten simulieren:
http://www.swissdelphicenter.ch/de/showcode.php?id=220

maximus Caesar 12. Okt 2004 16:05

Re: Tastensimilation an Programm senden
 
Hab jetzt SendKeys ausprobiert, komme aber mit senden der Strg-Taste nicht zurecht.
kann mir jemand ein Beispiel geben, wie es mit Strg+p+e+s+o+s funktioniert?

Robert Marquardt 12. Okt 2004 16:11

Re: Tastensimilation an Programm senden
 
Die richtige Funktion dazu ist keybd_event bzw. SendInput.
Bei keybd_event muessen die ersten beiden Parameter ausgefuellt sein, sonst akzeptiert DirectInput die Tasten nicht.
Man sendet natuerlich Ctrl-Down, p-Down, p-Up, e-Down, e-Up, s-Down, s-Up, o-Down, o-Up, s-Down, s-Up, Ctrl-Up

maximus Caesar 12. Okt 2004 16:21

Re: Tastensimilation an Programm senden
 
hab jetzt über einen anderen Thread was zu RegisterHotKey gefunden und testwiese folgendes geschrieben:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure WMHotKey(var Msg : TWMHotKey); message WM_HOTKEY;
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotKey(self.Handle,0, 0, ord('A')); ;
end;

procedure TForm1.WMHotKey(var Msg : TWMHotKey);
begin

  if Msg.HotKey = ord('A') then begin
    showmessage('A');
  end;
   end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(Form1.Handle, ord('A'));
end;


end.
Wenn jetzt das Programm läuft, und ich uaf die A-Taste drücke passiert nichts.
Was muss ich noch hinzufügen?

toms 12. Okt 2004 16:30

Re: Tastensimilation an Programm senden
 
Hi,

Sollte so funktionieren:

Delphi-Quellcode:
  private
    id1: Integer;
    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
  if Msg.HotKey = id1 then
    ShowMessage('Taste A gedrückt !');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  id1 := GlobalAddAtom('Hotkey1');
  RegisterHotKey(Handle, id1, 0, ord('A'));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnRegisterHotKey(Handle, id1);
  GlobalDeleteAtom(id1);
end;

maximus Caesar 12. Okt 2004 16:34

Re: Tastensimilation an Programm senden
 
Woll ein bisschen was falschgemacht, beim tippen? :-D

Edit: Jetzt passt's wieder!

maximus Caesar 12. Okt 2004 16:40

Re: Tastensimilation an Programm senden
 
FUNKTIONIERT! :thumb:

Danke!

maximus Caesar 12. Okt 2004 16:50

Re: Tastensimilation an Programm senden
 
Zitat:

Zitat von Robert Marquardt
Die richtige Funktion dazu ist keybd_event bzw. SendInput.
Bei keybd_event muessen die ersten beiden Parameter ausgefuellt sein, sonst akzeptiert DirectInput die Tasten nicht.
Man sendet natuerlich Ctrl-Down, p-Down, p-Up, e-Down, e-Up, s-Down, s-Up, o-Down, o-Up, s-Down, s-Up, Ctrl-Up

Bei mir wird Ctrl nicht erkannt!(vone Ctrl-Down)
kann mir jemand ein Code Beispiel geben?

toms 13. Okt 2004 07:19

Re: Tastensimilation an Programm senden
 
Hast du SendInput auch probiert?

Robert Marquardt 13. Okt 2004 08:02

Re: Tastensimilation an Programm senden
 
SendInput ist ein Aufsatz auf keybd_event. Es sollte sich also gleich verhalten.
Poste doch mal die bisherigen Sourcen.

maximus Caesar 13. Okt 2004 12:35

Re: Tastensimilation an Programm senden
 
Hier der aktuelle Source-Code:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, SRUtils;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
  ID1:Integer;
  PROCEDURE WMHOTKEY(VAR MSG: TWMHOTKEY); MESSAGE WM_HOTKEY;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

PROCEDURE TFORM1.FORMCREATE(SENDER: TOBJECT);
BEGIN
 ID1 := GLOBALADDATOM('HOTKEY1');
 REGISTERHOTKEY(HANDLE, ID1, 0, ORD('B'));
END;

PROCEDURE TFORM1.WMHOTKEY(VAR MSG: TWMHOTKEY);
BEGIN
 IF MSG.HOTKEY = ID1 THEN
 begin
 Keybd_Event(VK_CONTROL,0,0,0);
 sendkeys('pesos');

 Keybd_Event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
 end;
END;

PROCEDURE TFORM1.FORMDESTROY(SENDER: TOBJECT);
BEGIN
 UNREGISTERHOTKEY(HANDLE, ID1);
 GLOBALDELETEATOM(ID1);
END;


end.
Strg wird jetzt zwar simuliert, aber nicht, das die Taste während der Eingabe von "pesos" weiterhin gedrückt wird!

Robert Marquardt 13. Okt 2004 14:13

Re: Tastensimilation an Programm senden
 
Muss man denn alles zweimal schreiben?
Die beiden ersten Parameter von keybd_event muessen ausgefuellt werden.
Zusaetzlich wuerde ich alle Keycodes mit keybd_event verschicken.

maximus Caesar 13. Okt 2004 18:17

Re: Tastensimilation an Programm senden
 
Kannst du mir dann bitte ein Beispiel mit Code geben?
Währe sehr hilfreich!

Robert Marquardt 13. Okt 2004 18:40

Re: Tastensimilation an Programm senden
 
Da muss ich noch ein bischen rumexperimentieren. "MapVirtualKey(VK_CONTROL, 0) shl 16" ist glaube ich die korrekte Berechnung fuer den zweiten Parameter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 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