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 das gedückthalten einer taste simulieren (https://www.delphipraxis.net/79421-das-gedueckthalten-einer-taste-simulieren.html)

ghost007 22. Okt 2006 02:23


das gedückthalten einer taste simulieren
 
Hallo,
ich glaube der titel sagt schon fast alles ;).
Ich möchte das gedrückthalten einer taste an eine anwendung senden.
Wie mach ich das?

MfG - Ghost

Light 22. Okt 2006 04:57

Re: das gedückthalten einer taste simulieren
 
Hi Ghost,

das ist ganz einfach:
Es gibt eine Message um eine Taste zu drücken-
und dazu gibt es auch die Passende Message um die Taste
wieder los zu lassen...

Delphi-Quellcode:
  Keybd_Event(Ord('H'),0,0,0);
  Keybd_Event(Ord('H'),0,KEYEVENTF_KEYUP,0);

  Keybd_Event(Ord('A'),0,0,0);
  Keybd_Event(Ord('A'),0,KEYEVENTF_KEYUP,0);

  Keybd_Event(Ord('L'),0,0,0);
  Keybd_Event(Ord('L'),0,KEYEVENTF_KEYUP,0);

  Keybd_Event(Ord('L'),0,0,0);
  Keybd_Event(Ord('L'),0,KEYEVENTF_KEYUP,0);

  Keybd_Event(Ord('O'),0,0,0);
  Keybd_Event(Ord('O'),0,KEYEVENTF_KEYUP,0);

  Keybd_Event(Ord(13),0,0,0);  //13 steht für die Entertaste
  Keybd_Event(Ord(13),0,KEYEVENTF_KEYUP,0);
Ansonsten gibt natürlich auch noch ganz viele andere Infos in dieser Richtung hier in der DP... Die Such freut sich :lol:

Leuchtende Grüße

Stefan


alias Light

ghost007 22. Okt 2006 10:26

Re: das gedückthalten einer taste simulieren
 
Hi,
danke für die schnelle antwort.
Aber das mit dem keyup funktioniert nicht... anscheinend nur bie shift tasten.
Was mach ich falsch?
Delphi-Quellcode:
procedure TForm1.startApressClick(Sender: TObject);
begin
  Edit1.SetFocus;
  keybd_event(Ord('A'), 0, 0, 0);
end;

procedure TForm1.stopApressClick(Sender: TObject);
begin
  Edit1.SetFocus;
  keybd_Event(Ord('A'),0,KEYEVENTF_KEYUP,0);
end;
MfG - Ghost

Namenloser 22. Okt 2006 11:05

Re: das gedückthalten einer taste simulieren
 
Ich nehme an, in dem Augenblick, in dem der Button StopAPress gedrückt wird verliert Edit1 den Fokus, sodass die Tastendrücke nicht mehr gesendet werden.

Light 22. Okt 2006 11:10

Re: das gedückthalten einer taste simulieren
 
Hi Ihr,

habs extra grad noch mal ausprobiert-
bei mir funktioniert es!

Leuchtende Grüße

Stefan

ghost007 22. Okt 2006 15:06

Re: das gedückthalten einer taste simulieren
 
hi,
d.h. er schreibt in deine edit lauter As bis du den 2. button drückst und er aufhört?

MfG - Ghost

P.S.Kannste vll dein project, indem das funst uploaden?

Neutral General 22. Okt 2006 15:11

Re: das gedückthalten einer taste simulieren
 
mhh wenn das Edit in deinem eigenen Programm ist dann machs doch einfach so:

Delphi-Quellcode:
repeat
 Edit1.Text := Edit1.Text + 'a';
 Application.Processmessages;
until BooleanVariable;
das in den ersten Button und in dem Zweiten:

Delphi-Quellcode:
BooleanVariable := true;
find ich einfacher...

Gruß
Neutral General

ghost007 22. Okt 2006 17:48

Re: das gedückthalten einer taste simulieren
 
hi,
danke für dienen tipp, aber das edit dient nur zum testen, normalerweise will ich die keys an eine andere anwendung senden.

MfG - Ghost

Light 23. Okt 2006 15:07

Re: das gedückthalten einer taste simulieren
 
Hi Ihr,

Bin grad nicht am Entwicklungsrechner..
Sobald ich den wieder zu verfügung hab stell ichs rein!


Leuchtende Grüße

Stefan

ghost007 23. Okt 2006 19:54

Re: das gedückthalten einer taste simulieren
 
oh, vielen dank =)

ghost007 26. Okt 2006 22:29

Re: das gedückthalten einer taste simulieren
 
öhm, wollte ma fragen ob noch jmd ne idee hat, weil das ganze hier anscheinend ins stoppen geraten ist.

MfG - ghost

ghost007 27. Okt 2006 21:03

Re: das gedückthalten einer taste simulieren
 
AHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH H I L F E bitte bitte bitte helft mir

MfG - Ghost

Light 28. Okt 2006 16:15

Re: das gedückthalten einer taste simulieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi @all,

wie versprochen kommt hier eine kleine DemoApplication
wo unter anderem das mit dem Tastatur ereignissen gezeigt wird.
Ich hab den Quelltext eigentlich aussagekräftig mit Komentaren versehen..
Compiliert und erstellt mit Turbo Delphi Explorer :zwinker:
es liegt auch die Fertige Exe mit im Zip archive. Dieses ist Selbstentpackend damit aufjedenfall jeder an die daten ran kommt...
Falls ihr Fragen dazu habt schreibt mir ne pm oder halt hier rein.

Noch kurz zu bedinung des Programms:
es arbeitet hauptsächlich mit einem SystemTrayIcon.
Über das PopUpMenü dieses kann man eigentlich alles was es gibt (is ja nich viel) steuern.

Also es ist wirklich nur ganz klein.
Wenn man in Edit2 einen Text eingibt und dann im TrayiconPopup den Punkt Key-Go! auswählt wird der Darin enthaltene Text original getreu (also mit Klein/Großschreibung) als Keybord messages ins ausgegeben..
Sonderzeichen (auser ' ') gehen allerdings nicht!

Bin über eure Meinung gespannt :-D

Leuchtende Grüße

Stefan

ghost007 28. Okt 2006 22:32

Re: das gedückthalten einer taste simulieren
 
-.- das is aber irgendwie nich die antwort auf meine frage, weil man damit auch nicht das >>gedrückthalten<< einer taste simulieren kann

MfG - Ghost

DocE 28. Okt 2006 23:31

Re: das gedückthalten einer taste simulieren
 
Also, das ist im Prinzip ganz einfach.

Mit

Delphi-Quellcode:
Keybd_Event(Ord('A'),0,0,0); // entspricht dem KeyDown
wird z.B. die Taste 'A' solange gedrückt (gehalten) bis man

Delphi-Quellcode:
Keybd_Event(Ord('A'),0,KEYEVENTF_KEYUP,0); // entspricht dem KeyUp
aufruft. Will man z.B. Shift und A drücken, ruft man nacheinander auf

Delphi-Quellcode:
Keybd_Event(VK_SHIFT,0,0,0);
Keybd_Event(Ord('A'),0,0,0);
und "läßt diese dann irgendwann wieder los" durch

Delphi-Quellcode:
Keybd_Event(Ord('A'),0,KEYEVENTF_KEYUP,0);
Keybd_Event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);

Grüsse
...Doc

ghost007 29. Okt 2006 02:28

Re: das gedückthalten einer taste simulieren
 
hi,
das is ja das problem dieser befehl hier:
Delphi-Quellcode:
Keybd_Event(Ord('A'),0,0,0);
beinahltet anscheinent das loslassen schon.

MfG - Ghost

DocE 29. Okt 2006 10:20

Re: das gedückthalten einer taste simulieren
 
Moin,

ich habe das gerade mal getestet...

Durch den Befehl wird KeyDown und KeyPress ausgelöst (kein KeyUp, die Taste bleibt also gedrückt).

Im Gegensatz zur echten Tastatur wird das KeyPress Ereignis, was z.B. für die Darstellung der Zeichen in visuellen Komponenten zuständig ist nur 1x ausgelöst. Es kommt jetzt darauf an, was Du machen möchtest. Prüft die Anwendung, die Du steuern möchtest den KeyDown oder den KeyPress Event?

Möchtest Du den KeyPress mehrfach ausführen, geht das z.B. so:

Delphi-Quellcode:
for i:=1 to 100 do // = 100x KeyDown/Press/Up
begin
  Keybd_Event(Ord('A'),0,0,0); // entspricht dem KeyDown + 1x KeyPress
  Keybd_Event(Ord('A'),0,KEYEVENTF_KEYUP,0); // entspricht dem KeyUp
  sleep(10); // wenn eine kurze Pause gewünscht
end;
Allerdings entspricht dies dann nicht dem "Gedrückthalten" sondern dem hundertmaligen Drücken und Loslassen der Taste.


Grüsse
...Doc

Lannes 29. Okt 2006 10:31

Re: das gedückthalten einer taste simulieren
 
Hallo,

nimm doch den Vorschlag von Neutral General #7 und bau Keybd_Event entsprechend ein, z.B.:
Delphi-Quellcode:
var
  Form1: TForm1;
  BooleanVariable : Boolean;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  BooleanVariable := False;
  Edit1.setfocus;
  repeat
    Keybd_Event(Ord('A'),0,0,0);
    sleep(50);
    Application.Processmessages;
  until BooleanVariable;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  BooleanVariable := True;
end;
Keybd_Event für KeyUp ist IMHO nicht erforderlich.

DocE 29. Okt 2006 10:38

Re: das gedückthalten einer taste simulieren
 
Stimmt, das Key Up kann weggelassen werden. Allerdings wird dann trotzdem jeweils KeyDown und KeyPress (anstatt nur KeyPress) aufgerufen. Zum Schluss dann das KeyUp nicht vergessen.

Und ein Sleep (oder sonstige Verzögerung) ist zwingend erforderlich! Gerade noch einmal probiert...

Grüsse
...Doc

ghost007 29. Okt 2006 14:12

Re: das gedückthalten einer taste simulieren
 
hallo,
danke für eure antworten, ich glaube so wie es lannes geschreiben hat, könnte es funktionieren.
Nun habe ich aber folgendes problem, wohin wird das keyevent gesendet? nicht an die application mit dem fokus?

MfG - Ghost

r2c2 29. Okt 2006 14:27

Re: das gedückthalten einer taste simulieren
 
Bin mir nicht sicher, obs in diesem konkreten Fall was hilft, aber such mal nach Sendkeys oder sndkeys. Das is IIRC ne Unit, die das ganze Tastengedrücke etwas vereinfacht. Ich hab mich - noch - nicht damit beschäftigt, kann also relativ wenig zu sagen, aber du kannst ja mal gucken...

mfg

Christian

ghost007 29. Okt 2006 15:08

Re: das gedückthalten einer taste simulieren
 
hi,
ja diese unit kenn ich und hab se auch schon verwendet.
Aber das gedrückhalten funktioniert mit der nicht.

MfG - Ghost

DocE 29. Okt 2006 15:41

Re: das gedückthalten einer taste simulieren
 
Zitat:

Nun habe ich aber folgendes problem, wohin wird das keyevent gesendet? nicht an die application mit dem fokus?
Doch genau an die Applikation mit dem Fokus wird das gesendet. Eher gesagt wir der Tastendruck simuliert, also die Message erzeugt und Windows gibt dann die Message an die aktive Anwendung weiter.

Wenn Du also eine fremde Anwendung ansprechen möchtest, musst Du das ganze verzögert ausführen, wenn es z.B. bei einem ButtonClick passieren soll, sonst ist ja gerade Deine eigene Anwendung aktiv, bei der gerade der Button gedrückt wurde.


Grüsse
...Doc

ghost007 30. Okt 2006 16:38

Re: das gedückthalten einer taste simulieren
 
ok, ich werde damit ein wenig experimentieren.
danke

MfG - Ghost


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