![]() |
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:
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:
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; vielen Dank schon ma :thumb: mfg |
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; |
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 } |
Re: String erkennen und Tastendrücke simulieren
|
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^^ |
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 :) |
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
|
Re: String erkennen und Tastendrücke simulieren
ha^^ jetzt versteh ich scho ca 80% über gut wär ich nie draufgekommen!!
|
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; |
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:59 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