Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi keybd_event und spezialzeichen (/ , .) (https://www.delphipraxis.net/71273-keybd_event-und-spezialzeichen.html)

skyware 12. Jun 2006 12:17


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:
  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;
Leider werden die sonderzeichen wie Backslash ignoriert...was mache ich falsch?

marabu 12. Jun 2006 14:40

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

SirThornberry 12. Jun 2006 15:47

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:
VkKeyScan(AText[xInd])
in diesem Tastaturcode ist auch enthalten ob die Shifttaste dazu gedrückt sein muss etc.

Mit
Delphi-Quellcode:
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;
bekommst du aber noch nicht das gewünschte Ergebnis da hier nicht berücksichtigt wird das Shift etc. mit gedrückt werden muss.
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.

SirThornberry 12. Jun 2006 16:23

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;

skyware 12. Jun 2006 17:09

Re: keybd_event und spezialzeichen (/ , .)
 
vielen Dank für die Unterstützung, klappt alles wunderbar! :dancer:

jfheins 12. Jun 2006 18:45

Re: keybd_event und spezialzeichen (/ , .)
 
Müsste das nicht statt
Delphi-Quellcode:
 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 );
so heißen:
Delphi-Quellcode:
 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 );
??? :gruebel:

(unten entsprechend)

SirThornberry 12. Jun 2006 18:59

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 12:31 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