![]() |
keybd_event und spezialzeichen (/ , .)
hallo zusammen,
der Befehl "keybd_event" wird hier in ein paar Einträgen erklärt...funktioniert auch wunderbar. Was ich allerdings noch nicht hingekriegt habe ist, dass man damit auch Sonderzeichen ausgeben kann. Zum Beispiel: ich möchte den Text "c:\test1.jpg" ausgeben. Meine Funktion sieht folgendermassen aus:
Delphi-Quellcode:
Leider werden die sonderzeichen wie Backslash ignoriert...was mache ich falsch?
procedure FillInput(const AText: string);
var xInd : integer; begin for xInd := 0 To Length(AText) Do begin keybd_event(Ord(AText[xInd]), MapVirtualKey(Ord(AText[xInd]),1), 0, 0 ); keybd_event(Ord(AText[xInd]), MapVirtualKey(Ord(AText[xInd]),1), KEYEVENTF_KEYUP, 0 ); Application.ProcessMessages; Sleep(5); end; end; |
Re: keybd_event und spezialzeichen (/ , .)
Hallo,
der Index für die Zeichen eines Strings beginnt bei 1, die zulässigen Virtual-Key Codes findest du in der WIN32 Online Hilfe und Sleep(5) ist eine unnötige Bremse. Grüße vom marabu |
Re: keybd_event und spezialzeichen (/ , .)
Du hast die Funktion noch nicht richtig verstanden.
Der erste Parameter der Funktion keybd_event verlangt nicht ein Zeischen sondern einen Tastencode. um ein "a" oder ein "A" darzustellen ist der Tastencode gleich (ist schließlich die gleiche Taste auf der Tastatur). Wenn du jedoch ein großes "A" haben willst musst du zuvor die Shift-Taste drücken und danach wieder los lassen. Daraus ergibt sich dann das Ord(AText[xInd]) an dieser Stelle falsch ist denn ord('a') und ord('A') ergeben obwohl "a" und "A" auf der gleichen Taste liegt. Ord gibt dir also nur den Ascii-Wert des Zeischens (oder wars Ansi - ist aber egal). den Tastaturcode eines zeischens bekommst du mit
Delphi-Quellcode:
in diesem Tastaturcode ist auch enthalten ob die Shifttaste dazu gedrückt sein muss etc.
VkKeyScan(AText[xInd])
Mit
Delphi-Quellcode:
bekommst du aber noch nicht das gewünschte Ergebnis da hier nicht berücksichtigt wird das Shift etc. mit gedrückt werden muss.
for xInd := 1 To Length(AText) Do
begin lByte := VkKeyScan(AText[xInd]); keybd_event(lByte, MapVirtualKey(Ord(AText[xInd]),1), 0, 0 ); keybd_event(lByte, MapVirtualKey(Ord(AText[xInd]),1), KEYEVENTF_KEYUP, 0 ); Application.ProcessMessages; end; Wenn also AText = "ABCabc" ist würdest du bei diesem Beispiel dann noch "abcabc" bekommen weil eben die Shifttaste nicht gedrückt wird. Du musst also noch die Bits von lByte auswerten welche festlegen ob die shifttaste, strg-Taste oder Alttaste mit gedrückt werden muss. |
Re: keybd_event und spezialzeichen (/ , .)
Ich hab mir jetzt mal die Arbeit gemacht das ganze wie es korrekt ist in eine Funktion zu packen (ich hoffe die gibts nicht schon zig mal):
Delphi-Quellcode:
procedure EnterText(AText: String);
var lCount : Integer; lScanCode : Smallint; lWithAlt, lWithCtrl, lWithShift : Boolean; begin for lCount := 1 To Length(AText) Do begin lScanCode := VkKeyScan(AText[lCount]); //Ermitteln ob Shift gedrückt wurde lWithShift := lScanCode and (1 shl 8) <> 0; //Ermitteln ob Strg gedrückt wurde lWithCtrl := lScanCode and (1 shl 9) <> 0; //Ermitteln ob Alt gedrückt wurde lWithAlt := lScanCode and (1 shl 10) <> 0; if lWithShift then keybd_event(VK_SHIFT, 0, 0, 0); if lWithCtrl then keybd_event(VK_CONTROL, 0, 0, 0); if lWithAlt then keybd_event(VK_MENU, 0, 0, 0); keybd_event(lScanCode, 0, 0, 0); keybd_event(lScanCode, 0, KEYEVENTF_KEYUP, 0); if lWithAlt then keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0); if lWithCtrl then keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); if lWithShift then keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0); end; end; |
Re: keybd_event und spezialzeichen (/ , .)
vielen Dank für die Unterstützung, klappt alles wunderbar! :dancer:
|
Re: keybd_event und spezialzeichen (/ , .)
Müsste das nicht statt
Delphi-Quellcode:
so heißen:
if lWithShift then
keybd_event(VK_SHIFT, 0, 0, 0 ); if lWithCtrl then keybd_event(VK_CONTROL, 0, 0, 0 ); if lWithCtrl then keybd_event(VK_MENU, 0, 0, 0 );
Delphi-Quellcode:
??? :gruebel:
if lWithShift then
keybd_event(VK_SHIFT, 0, 0, 0 ); if lWithCtrl then keybd_event(VK_CONTROL, 0, 0, 0 ); if lWithAlt then //<<<<<<<<< keybd_event(VK_MENU, 0, 0, 0 ); (unten entsprechend) |
Re: keybd_event und spezialzeichen (/ , .)
du hast recht. Da hatte sich ein copy-paste-Fehler eingeschlichen. Habs geändert.
Das ist ähnlihc wie die Variable "lShortInt". Da hatte ich versehentlich auch vorher ein ShortInt draus gemacht bis ich mitbekommen hab das es ein SmallInt sein muss. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 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