AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi String erkennen und Tastendrücke simulieren
Thema durchsuchen
Ansicht
Themen-Optionen

String erkennen und Tastendrücke simulieren

Ein Thema von Innos · begonnen am 13. Jun 2007 · letzter Beitrag vom 13. Jun 2007
Antwort Antwort
Innos

Registriert seit: 5. Jun 2007
142 Beiträge
 
#1

String erkennen und Tastendrücke simulieren

  Alt 13. Jun 2007, 13:02
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

vielen Dank schon ma
mfg
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: String erkennen und Tastendrücke simulieren

  Alt 13. Jun 2007, 13:23
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#3

Re: String erkennen und Tastendrücke simulieren

  Alt 13. Jun 2007, 13:32
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 }
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: String erkennen und Tastendrücke simulieren

  Alt 13. Jun 2007, 13:54
Ein stück kürzer hab ichs dann doch:
http://www.delphipraxis.net/internal...=562719#562719
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Innos

Registriert seit: 5. Jun 2007
142 Beiträge
 
#5

Re: String erkennen und Tastendrücke simulieren

  Alt 13. Jun 2007, 14:15
loooooooooooooooool toms 0o du hast ab jetzt gottstatus bei mir für den rest des tages 0o

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

@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

@SirThornberry dein schau ich mir grad an^^
  Mit Zitat antworten Zitat
Innos

Registriert seit: 5. Jun 2007
142 Beiträge
 
#6

Re: String erkennen und Tastendrücke simulieren

  Alt 13. Jun 2007, 14:21
ok^^ deins funktioniert mindestens genaus so gut kann auch alles is aba um EINIGES kürzer... versteh ich auch zu 20% immerhin

DANKE deins nehm ich
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: String erkennen und Tastendrücke simulieren

  Alt 13. Jun 2007, 14:24
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Innos

Registriert seit: 5. Jun 2007
142 Beiträge
 
#8

Re: String erkennen und Tastendrücke simulieren

  Alt 13. Jun 2007, 15:01
ha^^ jetzt versteh ich scho ca 80% über gut wär ich nie draufgekommen!!
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: String erkennen und Tastendrücke simulieren

  Alt 13. Jun 2007, 15:08
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Innos

Registriert seit: 5. Jun 2007
142 Beiträge
 
#10

Re: String erkennen und Tastendrücke simulieren

  Alt 13. Jun 2007, 19:19
cool^^ jetzt hab ich alles verstanden VIELEN DANK^^

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:09 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