Autor Beitrag
HRNICKEL
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 21.12.10 16:12 
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);
{ ************************************************************
  * Procedure PostKeyEx32
  *
  * Parameters:
  *  key    : virtual keycode of the key to send. For printable
  *           keys this is simply the ANSI code (Ord(character)).
  *  shift  : state of the modifier keys. This is a set, so you
  *           can set several of these keys (shift, control, alt,
  *           mouse buttons) in tandem. The TShiftState type is
  *           declared in the Classes Unit.
  *  specialkey: normally this should be False. Set it to True to
  *           specify a key on the numeric keypad, for example.
  * Description:
  *  Uses keybd_event to manufacture a series of key events matching
  *  the passed parameters. The events go to the control with focus.
  *  Note that for characters key is always the upper-case version of
  *  the character. Sending without any modifier keys will result in
  *  a lower-case character, sending it with [ssShift] will result
  *  in an upper-case character!
  ************************************************************ }

type
  TShiftKeyInfo = record
    shift: byte;
    vkey: byte;
  end;

  byteset = set of 0 .. 7;
const
  shiftkeys: array [1 .. 3of 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), 00);
  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 }
// Samples
// ---------------------------------------------------------
// PostKeyEx32(VK_LWIN, [], False);
// PostKeyEx32(Ord('D'), [], False);
// PostKeyEx32(Ord('C'), [ssctrl, ssAlt], False);
// ---------------------------------------------------------

procedure SendKeyboard(nKey: Word);
Begin
  PostKeyEx32(nKey, [], False);
End;

procedure SendTextKeyboard(ctext: String);
Var
  i: Integer;
  W: Char;
  N: Word;
Begin

for i := 1 to Length(cText) do
Begin
  W := cText[i];
  N := Ord(W);
  SendKeyboard(N);  // so gehts N I C H T    ###
  //N := Ord('H');  // so gehts
  SendKeyboard(N);
End;

Wo liegt der Fehler. (Delphi2010)
Wie sieht es korrekt aus?
Danke im Vorraus.

Gruß Roland

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19316
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 21.12.10 17:21 
Nimm einfach AnsiString und AnsiChar, dann geht es auch.

Mit Unicodezeichen wie du sie bei dir verwendest, muss man da noch etwas anpassen, aber dann sollte auch das gehen. Dafür müsste ich es mir aber erst genauer anschauen.

// EDIT:
Nein, mit Unicode musst du SendInput verwenden:
msdn.microsoft.com/e...646310(v=vs.85).aspx
Das ist ja die Nachfolgefunktion von keybd_input, wie du ja sicher schon in der Dokumentation gelesen hast.