Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Tastaturdruck Emulieren (https://www.delphipraxis.net/9202-tastaturdruck-emulieren.html)

Pseudemys Nelsoni 20. Sep 2003 13:33


Tastaturdruck Emulieren
 
hoiho

wie emulier ich z.b ein enter?

ich möchte das beim programmstart meines progs (onactivate) einfach einen Key(taste) senden, es hat dabei kein besonderes ziel (memo oder sonstwas) es geht einfach darum das es so aussehen soll als wäre es von der tastatur gekommen, wie kriege ich sowas hin?

Alexander 20. Sep 2003 13:45

Re: Tastaturdruck Emulieren
 
Kuck dir mal keybd_event an...

Pseudemys Nelsoni 20. Sep 2003 14:02

Re: Tastaturdruck Emulieren
 
hm irgendwie komm ich damit nicht klar, damit kann man virtuelle keys senden?

Alexander 20. Sep 2003 14:07

Re: Tastaturdruck Emulieren
 
Jein, du musst sie mit ORD umwandeln...

Christian Seehase 20. Sep 2003 14:08

Re: Tastaturdruck Emulieren
 
Moin Silent,

such doch hier mal nach Hier im Forum suchenWM_KEYUP bzw. Hier im Forum suchenWM_KEYDOWN
Vielleicht hilft das ja auch.

Pseudemys Nelsoni 20. Sep 2003 14:15

Re: Tastaturdruck Emulieren
 
@alexander: ich versteh das nicht so ganz :\
@christian: ich bin mal einem thread gefolgt und hab einfach mal

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMessage(Edit1.Handle,WM_KEYUP,VK_DOWN,0);
  SendMessage(Edit1.Handle,WM_KEYUP,VK_UP,0);
end;
aus einem thread kopiert (ob das sinn macht weiss ich nicht)

es geht darum das ich ein programm auf dem pc habe, das JEDEN tastaturdruck zählt...also für jedentastendruck +1...nun möchte ich halt keys senden (ohne tastatur) das einfach immer so +1 hinzugefügt wird

Alexander 20. Sep 2003 14:21

Re: Tastaturdruck Emulieren
 
Probier mal so:
Delphi-Quellcode:
 keybd_event(ORD(VK_RETURN), 0, 0, 0);

Christian Seehase 20. Sep 2003 14:24

Re: Tastaturdruck Emulieren
 
Moin Silent,

lies mal den Thread aus dem der Source stammt noch ein bisschen weiter.
Du hast genau den Code erwischt, der so nicht funktioniert ;-)

(falls es der Thread ist, den ich meine, steht noch was dazu drin)

Pseudemys Nelsoni 20. Sep 2003 14:25

Re: Tastaturdruck Emulieren
 
hoi alexander, jo das geht so halb, hatte das mal so versucht:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to 10000 do
  begin
    Application.ProcessMessages;
    keybd_event(ORD(VK_RETURN), 0, 0, 0);
    label1.Caption := IntToStr(StrToInt(label1.Caption)+1);
  end;
end;
aber nach ca 3 sek gibts nen zugriffsfehler?

Pseudemys Nelsoni 20. Sep 2003 14:28

Re: Tastaturdruck Emulieren
 
Hi Christian 8), ich habe es aus diesem thred: http://www.delphipraxis.net/topic101...a00d63492f44fd und ganz zuende gelesen.

Alexander 20. Sep 2003 14:30

Re: Tastaturdruck Emulieren
 
schreib mal statt
Delphi-Quellcode:
label1.Caption := IntToStr(StrToInt(label1.Caption)+1);
das hier
Delphi-Quellcode:
label1.Caption := label1.Caption + IntToStr(i);

Christian Seehase 20. Sep 2003 14:33

Re: Tastaturdruck Emulieren
 
Moin Silent,

genau den meinte ich, und da stand auch noch:

Zitat:

Zitat von Christian Seehase
Ein Tastendruck setzt sich aus zwei SendMessage zusammen. Einmal um das Drücken der Taste zu simulieren, ein zweites mal für das Loslassen.

Demzufolge kann das was Du da oben gepostet hast nicht funktionieren
Erst wird die Taste VK_DOWN losgelassen, dann die Taste VK_UP losgelassen. Nur gedrückt werden sie nicht. ;-)

Pseudemys Nelsoni 20. Sep 2003 14:37

Re: Tastaturdruck Emulieren
 
dann wird eine 0 nach der anderen der label1.caption angefügt, der zugriffsfehler kommt trotzdem:

http://www.angelfire.com/bug/delphi/zfehler.JPG


es ist nur der code im button, also ist alles andere auszuschliessen

Pseudemys Nelsoni 20. Sep 2003 14:38

Re: Tastaturdruck Emulieren
 
@Christian: oh, das hab ich nicht bemerkt, wie drücke ich sie denn, "press" ?

mal mit keydown testen

Pseudemys Nelsoni 20. Sep 2003 14:45

Re: Tastaturdruck Emulieren
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMessage(self.Handle,WM_KEYDOWN,VK_DOWN,0);
  SendMessage(self.Handle,WM_KEYUP,VK_UP,0);
end;
so geht es aber auch nicht O_o

Christian Seehase 20. Sep 2003 14:56

Re: Tastaturdruck Emulieren
 
Moin Silent,

kann ja auch nicht.
Du drückst VK_DOWN und lässt VK_UP los.

Pseudemys Nelsoni 20. Sep 2003 16:49

Re: Tastaturdruck Emulieren
 
hm, wie geht es dann? teste schon fast ne stunde :(

Christian Seehase 21. Sep 2003 00:52

Re: Tastaturdruck Emulieren
 
Moin Silent,

ist doch ganz einfach:

Um einen Tastendruck zu simulieren, muss eine Taste gedrückt und dann wieder losgelassen werden, wie ich weiter oben, und in dem schon besprochenen anderen Thread gesagt habe, also statt:

Code:
SendMessage(self.Handle,WM_KEYDOWN,[color=red]VK_DOWN[/color],0);
SendMessage(self.Handle,WM_KEYUP,[color=red]VK_UP[/color],0);
muss es

Code:
SendMessage(self.Handle,WM_KEYDOWN,[color=red]VK_DOWN[/color],0);
SendMessage(self.Handle,WM_KEYUP,[color=red]VK_DOWN[/color],0);
heissen.

Pseudemys Nelsoni 21. Sep 2003 05:00

Re: Tastaturdruck Emulieren
 
Hallo Christian,

bei einem druck auf dem button passiert einfach nichts, das heisst das andere programm registriert das nicht als tastendruck, wenn ich normal tippe wird für jeden druck die variable des anderen programms um 1 erhöht, aber per button geht das einfach nicht, gibt es da noch eine alternative?

Erstmal danke für die hilfe

Luckie 21. Sep 2003 05:38

Re: Tastaturdruck Emulieren
 
Schick eine BN_CLICK an den Button.

Pseudemys Nelsoni 21. Sep 2003 05:39

Re: Tastaturdruck Emulieren
 
hoi luckie,

ne, vieleicht habe ich mich eben falsch ausgedrückt, es soll ein tastaturdruck simuliert werden,...sagen wir einfach mal das ein <A> in die "luft" geschrieben wird

Luckie 21. Sep 2003 05:42

Re: Tastaturdruck Emulieren
 
Du kannst nichts in die "Luft" schreiben. Irgendwo muß es ja landen, sonst kannst du dir das gleich sparen. BTW was ist für dich Luft?

Pseudemys Nelsoni 21. Sep 2003 06:36

Re: Tastaturdruck Emulieren
 
sagen wir mal ich schreibe einfach ein "A"(als beispiel) in einem IE Fenster, dawürde ja nichts passieren, da ja kein schreibfeld etc da ist, aber das Programm das ich habe loggt den geschriebenen buchstaben (also als tastendruck). Ich möchte das mein programm, wenn ich button1 anklicke, ein "A" schreibt, ein Ziel gibt es eigentlich nicht, nur das andere Programm muss diesen registrieren

Christian Seehase 21. Sep 2003 14:40

Re: Tastaturdruck Emulieren
 
Moin Silent,

wenn Du nicht das Handle hast, an das Du die Taste schicken willst, musst Du es mit keybd_event machen.
Dabei stehst Du mit Deiner Umsetzung allerdings vor einem Problem:
keybd_event wirkt sich auf das Fenster aus, das den Tastaturfokus hat, was automatisch Deines ist, wenn Du dabei einen Button anklickst.

Nimm mal einen Button und einen Timer und mach mal das Notepad auf.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  keybd_event(VK_SHIFT,0,0,0);
  keybd_event(ord('A'),0,0,0);
  keybd_event(ord('A'),0,KEYEVENTF_KEYUP,0);
  keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Button1Click(nil);
end;
Als erstes startest Du Dein Programm mal mit Timer1.Enabled := false, wechselst auf das Notepad, und klickst dann den Button in Deinem Formular an. Im Notepad rührt sich nichts.
Jetzt noch einmal das gleiche mit aktiviertem Timer.
Es werden im Sekundenabstand A in das Notepad geschrieben.

Im ersten Fall hat der Button den Tastaturfokus, und erhält das A, darum klappt es nicht.

Pseudemys Nelsoni 21. Sep 2003 17:01

Re: Tastaturdruck Emulieren
 
hoi Christian,

danke für den Code, der funzt einwandfrei :)
Das Programm loggt den zwar nicht (muss wohl irgendwie ein schutz sein :(). Aber wenigstens weiss ich wie es überhaupt geht keys zu senden 8)

Tyrael Y. 23. Sep 2003 17:05

Re: Tastaturdruck Emulieren
 
nochmal vielleicht zur Verdeutlichung, da mir der Christian in dme anderem Thread geholfen hatte



SendMessage(Handle,WM_KEYDOWN,VK_DOWN,0);

Handle : Handle zur Komponente/Fenster in der Tastendruck simuliert werden soll

WM_KEYDOWN: bedeutet simuliere einen keydown-Ereignis
(bei WM_KEYUP wird halt ein keyup-Ereignis simuliert)

VK_DOWN: <-- der Tastendruck der ausgelöst werden soll (VK_DOWN = Richtungstaste nach oben, hier kann man alle möglichen virtuellen Tasten angeben, also auch z.B. VK_RETURN, VK_ESCAPE...usw.)


so dass sollte jetzt zum Verständnis für jeden reichen...

... hat ja auch für mich gereicht :lol:

SirThornberry 23. Sep 2003 17:13

Re: Tastaturdruck Emulieren
 
Keybd_Event(VK_RETURN, 0, 0, 0); //key down
Keybd_Event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0); //key up

Pseudemys Nelsoni 16. Jan 2004 13:58

Re: Tastaturdruck Emulieren
 
hoi,

ich habe immernoch das problem...also der simulierte tastendruck funktioniert zwar, aber das prog das diese keys loggt, loggt diesen nicht mit bzw zählt ihn nicht..gibt es nich noch ne andere möglichkeit?

also mit :

Delphi-Quellcode:
Keybd_Event(VK_RETURN, 0, 0, 0); //key down
Keybd_Event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0); //key up
loggt das prog (nicht meins) diesen key nicht


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:23 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 by Thomas Breitkreuz