AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi keybd_event und spezialzeichen (/ , .)
Thema durchsuchen
Ansicht
Themen-Optionen

keybd_event und spezialzeichen (/ , .)

Ein Thema von skyware · begonnen am 12. Jun 2006 · letzter Beitrag vom 12. Jun 2006
Antwort Antwort
skyware

Registriert seit: 11. Dez 2002
Ort: Wetzikon, Zürich
151 Beiträge
 
Delphi 6 Enterprise
 
#1

keybd_event und spezialzeichen (/ , .)

  Alt 12. Jun 2006, 12:17
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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: keybd_event und spezialzeichen (/ , .)

  Alt 12. Jun 2006, 14:40
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: keybd_event und spezialzeichen (/ , .)

  Alt 12. Jun 2006, 15:47
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
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  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: keybd_event und spezialzeichen (/ , .)

  Alt 12. Jun 2006, 16:23
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
skyware

Registriert seit: 11. Dez 2002
Ort: Wetzikon, Zürich
151 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: keybd_event und spezialzeichen (/ , .)

  Alt 12. Jun 2006, 17:09
vielen Dank für die Unterstützung, klappt alles wunderbar!
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

Re: keybd_event und spezialzeichen (/ , .)

  Alt 12. Jun 2006, 18:45
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 );
???

(unten entsprechend)
  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: keybd_event und spezialzeichen (/ , .)

  Alt 12. Jun 2006, 18:59
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  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 14:33 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