Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi String erkennen und Tastendrücke simulieren (https://www.delphipraxis.net/93927-string-erkennen-und-tastendruecke-simulieren.html)

Innos 13. Jun 2007 13:02


String erkennen und Tastendrücke simulieren
 
Hiho liebe DP-Gemeinschaft^^

hab ma wieda ein problem -.-
ich hab ein edit feld in das ich ein ganzen Satz schreibe (mit groß- und kleinbuchstaben): z.B. "Hallo liebe DP-Gemeinschaft!"

dieser satz soll dann (in einem anderen programm) per Tastendruck simulation korrekt ausgegeben werden...

ich habe es bisher so, dass KEINE großbuchstaben und KEINE sonderzeichen geschrieben werden können -.-

Delphi-Quellcode:
Procedure SendString(Text:String);
var
  i : integer;
begin

  for i := 1 to (length(text)) do
    begin
   Keybd_Event(Ord(Text[i]),0,0,0);
   Keybd_Event(Ord(Text[i]),0,KEYEVENTF_KEYUP,0);
   end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var satz:String;
begin
satz:=Edit1.Text ;
SendString(satz);

end;
geht auch soweit alles aba ich darf in das edit feld NUR großbuchstaben eingeben... also wie erkennt er selber, was da für ein zeichen steht und wandelt das in deren addressen um?? bitte helft mir hab echt scho ewig probiert und die SuFu hat auch nix gebracht :roll:

vielen Dank schon ma :thumb:
mfg

DeddyH 13. Jun 2007 13:23

Re: String erkennen und Tastendrücke simulieren
 
Ungetestet:
Delphi-Quellcode:
Procedure SendString(Text:String);
var
  i : integer;
begin

  for i := 1 to (length(text)) do
    begin
      if text[i] in ['A'..'Z','Ä','Ö','Ü'] then
        Keybd_Event(VK_SHIFT,0,0,0);
      Keybd_Event(Ord(Text[i]),0,0,0);
      Keybd_Event(Ord(Text[i]),0,KEYEVENTF_KEYUP,0);
      if text[i] in ['A'..'Z','Ä','Ö','Ü'] then
        Keybd_Event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
   end;

end;

toms 13. Jun 2007 13:32

Re: String erkennen und Tastendrücke simulieren
 
Delphi-Quellcode:
Procedure PostKeyEx32( key: Word; Const shift: TShiftState;
                    specialkey: Boolean );
  Type
    TShiftKeyInfo = Record
                      shift: Byte;
                      vkey : Byte;
                    End;
    byteset = Set of 0..7;
  Const
    shiftkeys: Array [1..3] of TShiftKeyInfo =
      ((shift: Ord(ssCtrl); vkey: VK_CONTROL ),
      (shift: Ord(ssShift); vkey: VK_SHIFT ),
      (shift: Ord(ssAlt); vkey: VK_MENU ));
  Var
    flag: DWORD;
    bShift: ByteSet absolute shift;
    i: Integer;
  Begin
    For i := 1 To 3 Do Begin
      If shiftkeys[i].shift In bShift Then
        keybd_event( shiftkeys[i].vkey,
                    MapVirtualKey(shiftkeys[i].vkey, 0),
                    0, 0);
    End; { For }
    If specialkey Then
      flag := KEYEVENTF_EXTENDEDKEY
    Else
      flag := 0;
 
    keybd_event( key, MapvirtualKey( key, 0 ), flag, 0 );
    flag := flag or KEYEVENTF_KEYUP;
    keybd_event( key, MapvirtualKey( key, 0 ), flag, 0 );
 
    For i := 3 DownTo 1 Do Begin
      If shiftkeys[i].shift In bShift Then
        keybd_event( shiftkeys[i].vkey,
                    MapVirtualKey(shiftkeys[i].vkey, 0),
                    KEYEVENTF_KEYUP, 0);
    End; { For }
  End; { PostKeyEx32 }
Delphi-Quellcode:
Procedure SendText( S: String );
  Procedure SendRawCharacter( ch : Char );
    Var
      i: Integer;
      numStr: String;
    Begin
      numStr := Format('%4.4d',[Ord(ch)]);
      keybd_event( VK_MENU, MapVirtualKey(VK_MENU, 0),
                  0, 0);
      for i:= 1 to Length(numStr) do
        PostKeyEx32( VK_NUMPAD0 + Ord(numstr[i])-Ord('0'), [], false );      
      keybd_event( VK_MENU, MapVirtualKey(VK_MENU, 0),
                  KEYEVENTF_KEYUP, 0);
    End;
 
  Var
    flags: TShiftState;
    vcode: word;
    ret : word;
    i, n : Integer;
    mask : word;
  Begin { SendText }
    For i := 1  To Length(S) Do Begin
      ret := VkKeyScan( S[i] );
      If ret = $FFFF Then
        SendRawCharacter( S[i] )
      Else
      Begin
        vcode := Lobyte( ret );
        flags := [];
        mask := $100;
        For n := 1 To 3 Do Begin
          If (ret and mask) <> 0 Then
          Begin
            Case mask Of
              $100: Include( flags, ssShift );
              $200: Include( flags, ssCtrl );
              $400: Include( flags, ssAlt );
            End; { Case }
          End; { If }
          mask := mask shl 1;
        End; { For }
        PostKeyEx32( vcode, flags, false );
      End; { Else }
    End; { For }
  End; { SendText }

SirThornberry 13. Jun 2007 13:54

Re: String erkennen und Tastendrücke simulieren
 
Ein stück kürzer hab ichs dann doch:
http://www.delphipraxis.net/internal...=562719#562719

Innos 13. Jun 2007 14:15

Re: String erkennen und Tastendrücke simulieren
 
loooooooooooooooool toms 0o du hast ab jetzt gottstatus bei mir für den rest des tages 0o :shock: :shock:

habe absolut KEIN plan wie das geht und was du da geschrieben hast... habs einfach ma kopiert und eingefügt und es funktioniert noch besser als ich es je erwartet hab!!! selbst []}{() alle sonderzeichen kann der simulieren 0o DANKEE
wär natürlich geil wenn ich es noch zusätzlich verstehn würde :D

@DeddyH dein code versteh ich :) aba funktioniert iwie nicht ganz korrekt also sonderzeichen könnt ich damit eh vergessen -.- aba danke für deine müh :stupid:

@SirThornberry dein schau ich mir grad an^^

Innos 13. Jun 2007 14:21

Re: String erkennen und Tastendrücke simulieren
 
ok^^ deins funktioniert mindestens genaus so gut :D kann auch alles is aba um EINIGES kürzer... versteh ich auch zu 20% immerhin :D

DANKE deins nehm ich :)

SirThornberry 13. Jun 2007 14:24

Re: String erkennen und Tastendrücke simulieren
 
es macht auch das gleiche wie das von toms nur das es die bits nicht erst in einen enumtyp wandelt und später zurück

Innos 13. Jun 2007 15:01

Re: String erkennen und Tastendrücke simulieren
 
ha^^ jetzt versteh ich scho ca 80% über gut wär ich nie draufgekommen!!

SirThornberry 13. Jun 2007 15:08

Re: String erkennen und Tastendrücke simulieren
 
ok, zum verständnis das ganze nochmal mit kommentaaren.
Delphi-Quellcode:
procedure EnterText(AText: String);
var lCount    : Integer;
    lScanCode : Smallint;
    lWithAlt,
    lWithCtrl,
    lWithShift : Boolean;
begin
  //Alle bustaben des Strings durchgehen (schließlich soll jeder getippt werden)
  for lCount := 1 To Length(AText) Do
  begin
    //VkKeyScan gibt uns zurück welche Tasten auf der Tastatur gedrückt werden müssen
    //in den ersten 8 bit ist die eigentliche Taste und die anderen Bits sind gesetzt je nach dem welche
    //Tasten notwendig sind
    lScanCode := VkKeyScan(AText[lCount]);
    //Ermitteln ob Shift gedrückt wurde (wenn 9tes bit gesetzt ist)
    lWithShift := lScanCode and (1 shl 8) <> 0;
    //Ermitteln ob Strg gedrückt wurde (wenn 10tes bit gesetzt ist)
    lWithCtrl := lScanCode and (1 shl 9) <> 0;
    //Ermitteln ob Alt gedrückt wurde (wenn 11tes bit gesetzt ist)
    lWithAlt  := lScanCode and (1 shl 10) <> 0;

    //wenn für das Zeichen die Shifttaste notwendig ist müssen wir diese drücken (nicht loslassen)
    if lWithShift then
      keybd_event(VK_SHIFT, 0, 0, 0);
    //wenn für das Zeichen die Strgtaste notwendig ist müssen wir diese drücken (nicht loslassen)
    if lWithCtrl then
      keybd_event(VK_CONTROL, 0, 0, 0);
    //wenn für das Zeichen die Alttaste notwendig ist müssen wir diese drücken (nicht loslassen)
    if lWithAlt then
      keybd_event(VK_MENU, 0, 0, 0);

    //Jetzt drücken wir die eigentliche Taste - bei A also a
    //die eigentliche Taste sind zwar nur die ersten 8 bit, allerdings müssen wir diese nicht
    //abspalten da keybd_event die restlichen bits vernachlässigt - besser wäre lScanCode auf
    //Byte zu casten damit die anderen Bits verschwinden
    keybd_event(lScanCode, 0, 0, 0);
    //Jetzt lassen wir die eigentliche Taste los - bei A also a
    keybd_event(lScanCode, 0, KEYEVENTF_KEYUP, 0);

    //Wenn wir für die Darstellung des Zeichens die Alttaste drücken mussten lassen wir diese jetzt wieder los
    if lWithAlt then
      keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
    //Wenn wir für die Darstellung des Zeichens die Strgtaste drücken mussten lassen wir diese jetzt wieder los
    if lWithCtrl then
      keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
    //Wenn wir für die Darstellung des Zeichens die Shifttaste drücken mussten lassen wir diese jetzt wieder los
    if lWithShift then
      keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
  end;
end;

Innos 13. Jun 2007 19:19

Re: String erkennen und Tastendrücke simulieren
 
cool^^ jetzt hab ich alles verstanden VIELEN DANK^^ :angel:

hab aba nur noch eine frage: was is smallint (oben wird lscancode so deklariert...)?


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