Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Sendkeys, "Enter" einbauen (https://www.delphipraxis.net/191585-sendkeys-enter-einbauen.html)

derseitzer 30. Jan 2017 13:00

Delphi-Version: 10 Seattle

Sendkeys, "Enter" einbauen
 
Hey Leute,
Ich habe im Internet diesen Code gefunden der auch einwandfrei funktioniert:
Code:
uses
  Windows;

{$POINTERMATH ON}
procedure SendKeys(const S: String);
var
  InputEvents: PInput;
  I, J: Integer;
begin
  if S = '' then Exit;
  GetMem(InputEvents, SizeOf(TInput) * (Length(S) * 2));
  try
    J := 0;
    for I := 1 to Length(S) do
    begin
      InputEvents[J].Itype := INPUT_KEYBOARD;
      InputEvents[J].ki.wVk := 0;
      InputEvents[J].ki.wScan := Ord(S[I]);
      InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE;
      InputEvents[J].ki.time := 0;
      InputEvents[J].ki.dwExtraInfo := 0;
      Inc(J);
      InputEvents[J].Itype := INPUT_KEYBOARD;
      InputEvents[J].ki.wVk := 0;
      InputEvents[J].ki.wScan := Ord(S[I]);
      InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE or KEYEVENTF_KEYUP;
      InputEvents[J].ki.time := 0;
      InputEvents[J].ki.dwExtraInfo := 0;
      Inc(J);
    end;
    SendInput(J, InputEvents[0], SizeOf(TInput));
  finally
    FreeMem(InputEvents);
  end;
end;
Jetzt möchte ich aber auch die Möglichkeit haben "Enter" zu simulieren.. hat jemand eine Idee, wie ich den Code modifizieren könnte? Oder hat jemand einen Code, mit dem beides funktoniert
und mit dem ich diesen hier ersetzen könnte? Viele Dank schon mal im voraus :)

t.roller 30. Jan 2017 13:45

AW: Sendkeys, "Enter" einbauen
 
Delphi-Quellcode:
Keybd_Event(VK_RETURN,0,0,0);              //Taste drücken
Keybd_Event(VK_RETURN,0,KEYEVENTF_KEYUP,0); //Taste loslassen

himitsu 30. Jan 2017 14:10

AW: Sendkeys, "Enter" einbauen
 
Ich wäre ja erstmal auf die doofe Idee gekommen und hätte mir die Dokumentation zu MSDN-Library durchsuchenSendInput angesehn und mich da bis zur gewünschten Information duchgeklickt.

also
https://msdn.microsoft.com/de-de/lib.../ms646310.aspx
https://msdn.microsoft.com/de-de/lib.../ms646270.aspx
https://msdn.microsoft.com/de-de/lib.../ms646271.aspx
https://msdn.microsoft.com/de-de/lib.../dd375731.aspx

derseitzer 30. Jan 2017 14:13

AW: Sendkeys, "Enter" einbauen
 
Vielen Dank!! noch eine Frage: wenn ich in meiner sendkeys funktion etwas auf meiner Tform einbinden will (z.b. ein label1) erkennt mein Programm das nicht, wahrscheinlich weil ich in der funktion nur "(const S: String)" übergebe..
siehe Code... wie baue ich noch den "Sender: TObejct" ein? so: (Sender: TObject, const S: String); funktioniert nicht :/

HolgerX 30. Jan 2017 17:18

AW: Sendkeys, "Enter" einbauen
 
Hmm..

einfach mit

SendKeys(#13);

versucht?

EWeiss 30. Jan 2017 19:18

AW: Sendkeys, "Enter" einbauen
 
Vielleicht hilfst..

gruss

derseitzer 31. Jan 2017 07:21

AW: Sendkeys, "Enter" einbauen
 
Code:
{$POINTERMATH ON}
procedure TForm1.SendKeys(const S: String);
var
  InputEvents: PInput;
  I, J: Integer;
begin

  if S = '' then
  begin
    if Checkbox1.checked=True then
    begin
    Keybd_Event(VK_RETURN,0,0,0);                         //Taste drücken
    Keybd_Event(VK_RETURN,0,KEYEVENTF_KEYUP,0);           //Taste loslassen
    end;
    Exit;
  end;
  GetMem(InputEvents, SizeOf(TInput) * (Length(S) * 2));
  try
    J := 0;
    for I := 1 to Length(S) do
    begin
      InputEvents[J].Itype := INPUT_KEYBOARD;
      InputEvents[J].ki.wVk := 0;
      InputEvents[J].ki.wScan := Ord(S[I]);
      InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE;
      InputEvents[J].ki.time := 0;
      InputEvents[J].ki.dwExtraInfo := 0;
      Inc(J);
      InputEvents[J].Itype := INPUT_KEYBOARD;
      InputEvents[J].ki.wVk := 0;
      InputEvents[J].ki.wScan := Ord(S[I]);
      InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE or KEYEVENTF_KEYUP;
      InputEvents[J].ki.time := 0;
      InputEvents[J].ki.dwExtraInfo := 0;
      Inc(J);
    end;
    SendInput(J, InputEvents[0], SizeOf(TInput));
  finally
    FreeMem(InputEvents);
  end;
end;
Habe es hiermit probier, allerdings macht er immernoch kein Enter:/

haentschman 31. Jan 2017 07:32

AW: Sendkeys, "Enter" einbauen
 
Moin...8-)
Zitat:

Ich habe im Internet diesen Code gefunden der auch einwandfrei funktioniert:
Was hast du denn vor? Was soll der Code deiner Meinung nach tun? :gruebel:
Vieleicht gibt es auch was einfaches um mit ENTER zum nächsten Feld zu gelangen. :zwinker: (nur eine Vermutung)

derseitzer 31. Jan 2017 07:45

AW: Sendkeys, "Enter" einbauen
 
hab meinen Fehler gefunden:) Diese Entertaste die ich oben implementiert habe zu simulieren, wird nie ausgeführt, da der Code durchlaufen wird, dann eben die Schleife und das wars.. Habe den Code also einfach falsch implementiert :oops:

haentschman 31. Jan 2017 07:50

AW: Sendkeys, "Enter" einbauen
 
Zitat:

Was hast du denn vor? Was soll der Code deiner Meinung nach tun?
...bitte antworte noch auf die Rückfrage. :wink:

t.roller 31. Jan 2017 07:59

AW: Sendkeys, "Enter" einbauen
 
@TE: Aus Deinem Code geht nicht hervor, was die RETURN-Simulation machen soll.
Die 2 Zeilen Code brauchen natürlich ein Objekt, das auf die RETURN-Simulation reagiert - siehe Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
caption:= 'B1';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Button1.SetFocus;

Keybd_Event(VK_RETURN,0,0,0); //Taste drücken
Keybd_Event(VK_RETURN,0,KEYEVENTF_KEYUP,0); //Taste loslassen

end;

derseitzer 31. Jan 2017 08:35

AW: Sendkeys, "Enter" einbauen
 
ehrlich gesagt weiß ich das selber nicht genau:)
Ich wollte einfach erstmal einen Text schreiben indem ich Tastendrücke simuliere und wollte auch ein "Return" simulieren können:)
Also so wirklich die Idee dahinter hatte ich nicht :|

t.roller dein Code hat geklappt wie gesagt, ich habe ihn nur falsch angewendet.. er wurde nie ausgeführt, dort, wo ich ihn als erstes implementiert hatte:). Funktioniert jetzt alles:)
Danke an alle:)))

haentschman 31. Jan 2017 09:11

AW: Sendkeys, "Enter" einbauen
 
Zitat:

Als ich meinem Therapeuten gesagt habe, alle ignorieren mich sagte er: Der nächste Bitte...
...:roll:

derseitzer 31. Jan 2017 10:12

AW: Sendkeys, "Enter" einbauen
 
haentschman wie gesagt, ich wollte einfach mal einen Text schreiben über simulierte Tasten, mehr nicht :-D
Ich gebe einen String vor und die Anzahl der Wiederholungen. die Checkbox macht eben das return, oder eben kein return zischen den Wiederholungen..
beispiel: string: ABC, WDH: 5, checkbox:=True ->
ABC
ABC
ABC
ABC
ABC

Code:
procedure TForm1.SendKeys(const S: String);
var
  InputEvents: PInput;
  I, J: Integer;
begin
  if S = '' then
    Exit;
  GetMem(InputEvents, SizeOf(TInput) * (Length(S) * 2));
  try
    J := 0;
    for I := 1 to Length(S) do
    begin
      InputEvents[J].Itype := INPUT_KEYBOARD;
      InputEvents[J].ki.wVk := 0;
      InputEvents[J].ki.wScan := Ord(S[I]);
      InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE;
      InputEvents[J].ki.time := 0;
      InputEvents[J].ki.dwExtraInfo := 0;
      Inc(J);
      InputEvents[J].Itype := INPUT_KEYBOARD;
      InputEvents[J].ki.wVk := 0;
      InputEvents[J].ki.wScan := Ord(S[I]);
      InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE or KEYEVENTF_KEYUP;
      InputEvents[J].ki.time := 0;
      InputEvents[J].ki.dwExtraInfo := 0;
      Inc(J);
    end;
    SendInput(J, InputEvents[0], SizeOf(TInput));
    if Checkbox1.checked=True then
     begin
     Keybd_Event(VK_RETURN, 1, KEYEVENTF_EXTENDEDKEY, 0) ;
     Keybd_Event(VK_RETURN, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
     end;
  finally
    FreeMem(InputEvents);
  end;
end;

haentschman 31. Jan 2017 15:07

AW: Sendkeys, "Enter" einbauen
 
Hallo...:P
Zitat:

ich wollte einfach mal einen Text schreiben über simulierte Tasten, mehr nicht
...dann ist es ja gut. 8-)


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