Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Key-Generator - unerklärbare Ergebnisse


Marco D. - Mi 25.01.06 22:09
Titel: Key-Generator - unerklärbare Ergebnisse
Hallo,

ich wolltet mal schnell einen Keygen coden. Er soll achtstellige Strings ausgeben, welche aus Klein-/Großbuchstaben und Zahlen bestehen. Dafür habe ich folgenden Code:


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:
84:
85:
86:
87:
88:
89:
90:
91:
procedure MachArrayVoll;
begin
  arr[1]:='a';
  arr[2]:='b';
  arr[3]:='c';
  arr[4]:='d';
  arr[5]:='e';
  arr[6]:='f';
  arr[7]:='g';
  arr[8]:='h';
  arr[9]:='i';
  arr[10]:='j';
  arr[11]:='k';
  arr[12]:='l';
  arr[13]:='a';
  arr[14]:='n';
  arr[15]:='o';
  arr[16]:='p';
  arr[17]:='q';
  arr[18]:='r';
  arr[19]:='s';
  arr[20]:='t';
  arr[21]:='u';
  arr[22]:='v';
  arr[23]:='w';
  arr[24]:='x';
  arr[25]:='y';
  arr[26]:='z';
  arr[27]:='A';
  arr[28]:='B';
  arr[29]:='C';
  arr[30]:='D';
  arr[31]:='E';
  arr[32]:='F';
  arr[33]:='G';
  arr[34]:='H';
  arr[35]:='I';
  arr[36]:='J';
  arr[37]:='K';
  arr[38]:='L';
  arr[39]:='M';
  arr[40]:='N';
  arr[41]:='O';
  arr[42]:='P';
  arr[43]:='Q';
  arr[44]:='R';
  arr[45]:='S';
  arr[46]:='T';
  arr[47]:='U';
  arr[48]:='V';
  arr[49]:='W';
  arr[50]:='X';
  arr[51]:='Y';
  arr[52]:='Z';
  arr[53]:='0';
  arr[54]:='1';
  arr[55]:='2';
  arr[56]:='3';
  arr[57]:='4';
  arr[58]:='5';
  arr[59]:='6';
  arr[60]:='7';
  arr[61]:='8';
  arr[62]:='9';


end;


function BerechneKey(laenge:integer) : string;
var i:integer;
begin
  randomize;
  result:='';
  for i :=1 to laenge do
  begin
    result:=result+arr[random(62+1)];
  end;
end;


procedure TForm1.Button5Click(Sender: TObject);
var i:integer;
begin
MachArrayVoll;
memo1.lines.clear;
for i := 1 to 100 do
begin
  memo1.lines.add(berechnekey(8));
end;
end;



Jedoch ist dann im Memo folgendes:


Zitat:

3HVaOoxV
C3MKYiFC
4NKBUlsT
Yi
5_EÈA‘ >W{ÂÝn(€èQŠœ›ì”ãvÆY–aæöo™$³ˆQÝåLÕ¡'³,*Fa¹ š%2·™ªÄeÈØm?ð ̹Ê20*ê)ÿs«i¾‚r`å†Ú¾¶{\•WQÝc¿2šHqÂl@ÈÇÛÙnq£xª˜ÚQ|q7ðè<›ŽIÀÈâ…<ÅòO¬P’EãóÙd^¼ ,F©BäÀèÄ
ùØcnEÈœ«¬¢áC:i¹š|ÝeQBÄ0êP
QLohiNyy
hyQc0HnB
NDBkQJOa
YABGiEZN
eb6pICDy
1FdlyaIE
eEhMsKDe
Ih4Lxiiv
sVRDZoxp
bqAe3PU5
HKulKAoJ
4v0OZlzK
lPQuNJ9O
iP5JLnn1
x9224zbS
Ezw75bEd
FZep3rC8
44arMpza
Yj67aj3v
CrOHGvRX
a7Lf2T6M
3sfUiRJZ
fUxMaPGL
QjWtcyK4
Z7xbse1q
lefTpTfe
0oaezkYq
ptigiiVG
KfYpXRfi
7i2aelro
tU2AhyCd
l3RFq6e5
AVUUoh3A
1bAfeMUQ
wiFKVoar
TlJIcTyy
3N8aKGL7
Cai8KaVF
4xQZ75Kn
ueB5bSCU
ZF
YORW67dT
EF
Rc3LXCOn
8SX1yAqj
VUaT4ju6
QUo7xsRZ
YRELouh8
1aegsd2R
EiXRLpPi
rkbJg9U4
OnfHzE6F
6fSXdqD2
Qf2KhHWE
Go1wQ1I7
3F
A6MReLa1
7iyF
aG3BuwlD
L7nSXnlF
hR6rZPKy
YLvl2ulu
pPj1qn8c
ywdV5Ws2
F3qOHFRU
lWQJJlsQ
SHxhMNQJ
unlOfsMv
zilDkgo5
Txec9pLT
klQOKCAT
R6yaN4ZL
vF
St3VqzTe
IC2GZTFH
GrAZQGSN
jYUgDiFI
nhtLH2pr
atinJaru
kThZ7xF7
YSE19rth
1aewcbd1
7jF
voh9nxKc
Nvg8eNoo
2vkyEGai
Y9kxoXto
ZZXUHcrD
f6VUxt6Q
MQCtAUtJ
18fo3wgI
ehP48tcu
QZMgwrF
0kjexPoh
ihN0I2TD
hWHaZtXW


Könnt ihr mir sagen. wo der Fehler liegt?


LLCoolDave - Mi 25.01.06 22:27

Setz mal in Zeile 77 das +1 hinter die Klammer, also Random(62)+1


Marco D. - Mi 25.01.06 22:29

:autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch:


Danke, da lag der Fehler!!!!


F34r0fTh3D4rk - Mi 25.01.06 22:31

erstmal ist das hier:

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:
procedure MachArrayVoll;
begin
  arr[1]:='a';
  arr[2]:='b';
  arr[3]:='c';
  arr[4]:='d';
  arr[5]:='e';
  arr[6]:='f';
  arr[7]:='g';
  arr[8]:='h';
  arr[9]:='i';
  arr[10]:='j';
  arr[11]:='k';
  arr[12]:='l';
  arr[13]:='a';
  arr[14]:='n';
  arr[15]:='o';
  arr[16]:='p';
  arr[17]:='q';
  arr[18]:='r';
  arr[19]:='s';
  arr[20]:='t';
  arr[21]:='u';
  arr[22]:='v';
  arr[23]:='w';
  arr[24]:='x';
  arr[25]:='y';
  arr[26]:='z';
  arr[27]:='A';
  arr[28]:='B';
  arr[29]:='C';
  arr[30]:='D';
  arr[31]:='E';
  arr[32]:='F';
  arr[33]:='G';
  arr[34]:='H';
  arr[35]:='I';
  arr[36]:='J';
  arr[37]:='K';
  arr[38]:='L';
  arr[39]:='M';
  arr[40]:='N';
  arr[41]:='O';
  arr[42]:='P';
  arr[43]:='Q';
  arr[44]:='R';
  arr[45]:='S';
  arr[46]:='T';
  arr[47]:='U';
  arr[48]:='V';
  arr[49]:='W';
  arr[50]:='X';
  arr[51]:='Y';
  arr[52]:='Z';
  arr[53]:='0';
  arr[54]:='1';
  arr[55]:='2';
  arr[56]:='3';
  arr[57]:='4';
  arr[58]:='5';
  arr[59]:='6';
  arr[60]:='7';
  arr[61]:='8';
  arr[62]:='9';


end;

sehr unschön, das geht um einiges kürzer:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var
  x, y, z, c: integer;
begin
  c := 0;
  for x := 65 to 90 do
  begin
    inc(c);
    arr[c] := chr(x);
  end
  for y := 97 to 122 do
  begin
    inc(c);
    arr[c] := chr(y);
  end
  for z := 48 to 57 do
  begin
    inc(c);
    arr[c] := chr(z);
  end
end;

geht eventuell noch kürzer ;)


Marco D. - Mi 25.01.06 22:33

Hallo,

das mag ja sein, aber ich versteh nur Bahnhof :wink:

Wie kommst du bei 'for' dort auf die Zahlen (57 usw.) ?

Und was macht chr?


LLCoolDave - Mi 25.01.06 22:34

Ja, wir schmeissen den array einfach ganz raus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function BerechneKey(laenge:integer) : string;
var i:integer;
begin
  randomize;
  result:='';
  for i :=1 to laenge do
  begin
    case random(3of
      0: result:=result+chr(65+Random(26));
      1: result:=result+chr(97+Random(26));
      2: result:=result+chr(48+Random(10));
    end;
  end;
end;


0xCC - Mi 25.01.06 22:35

guck mal in die ascii-tabelle (MS-DOS 6.22 Handbuch, Seite 264)


Marco D. - Mi 25.01.06 22:37

Wo soll ich ein MSDOS-Handbuch hernehmen???? :wink:


F34r0fTh3D4rk - Mi 25.01.06 22:38

hast du ne formelsammlung ? such einfach nach ascii tabelle

ich frag mich nur, wie du den key auf gültigkeit prüfen willst, ich denke nicht, dass du damit beim 2. anlauf die gleiche checksumme rausbekommen wirst ;)

(außer du lässt randomize weg und startest dein programm neu, bei der gleichen anzahl versuche hast du wieder den gleich key);


Marco D. - Mi 25.01.06 22:40

Mein Kumpel brauchte eine lange Liste von achtstelligen Strings. Die hätte man sich auch ohne Computer ausdenken können, das Wort 'Key-Generator' passt hier nicht ganz, das stimmt.


F34r0fTh3D4rk - Mi 25.01.06 22:42

vielleicht solltest du mal nach bruteforcing gucken, weil ich weiß nicht, was man mit 8 stelligen zufälligen (und dann auch noch merkwürdig kompliziert zufälligen) strings anfangen soll :shock:

oder wird das ein passwort generator ?


Marco D. - Mi 25.01.06 22:45

Das sind Zugangscodes für Mitglieder unseres Vereins für die Vereinswebsite.


Blackheart666 - Mi 25.01.06 22:46

ASCII
http://www.delphi-forum.de/topic_Ascii+Wert+Anzeigen_52563.html


0xCC - Mi 25.01.06 23:19

http://de.wikipedia.org/wiki/ASCII-Tabelle


Darth Sitthiander - Mi 01.03.06 17:10

ich würde es eher so machen:

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:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function BerechneKey(laenge:integer) : string;
var i:integer;
begin
  randomize;
  result:='';
  for i :=1 to laenge do
  begin
    case random(3of
      0: result:=result+chr(65+Random(26));
      1: result:=result+chr(97+Random(26));
      2: result:=result+chr(48+Random(10));
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
memo1.lines.clear;
for i := 1 to 100 do
begin
  memo1.lines.add(berechnekey(4)+'-'+berechnekey(4)+berechnekey(4)+'-'+berechnekey(4));
end;
end;
end.

wobei man hier:

Delphi-Quelltext
1:
2:
3:
4:
5:
memo1.lines.clear;
for i := 1 to 100 do
begin
  memo1.lines.add(berechnekey(4)+'-'+berechnekey(4)+berechnekey(4)+'-'+berechnekey(4));
end;


Statt 4 überall ne 5 oder 6 einsetzen kann. Sorry wenns als pushen gilt.

PS: Weiss einer wie ich die Buchstaben grossgeschrieben kriege?

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconChristian S.: Size-Tags entfernt


F34r0fTh3D4rk - Mi 01.03.06 17:57

upcase oder uppercase


Darth Sitthiander - Mi 01.03.06 18:04

THXXXXXXXXXXXXXXXXXXXXXXXX
Ich hab noch ein paar sachen eingebaut:

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:
unit serialnummer;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    SaveDialog1: TSaveDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function BerechneKey(laenge:integer) : string;
var i:integer;
begin
  randomize;
  result:='';
  for i :=1 to laenge do
  begin
    case random(3of
      0: result:=result+chr(65+Random(26));
      1: result:=result+chr(97+Random(26));
      2: result:=result+chr(48+Random(10));
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
a, b:string;
begin
a:= Inputbox ('Anzahl Keys''Gib die anzahl Keys an, die generiert werden sollen','');
b:= Inputbox ('Anzahl Zahlen''Gib die anzahl Zahlen an, die nach dem - stehen solen','');
memo1.lines.clear;
for i := 1 to strtoint(a) do
begin
  memo1.lines.add(UpperCase(berechnekey(strtoint(b))+'-'+berechnekey(strtoint(b))+'-'+berechnekey(strtoint(b))+'-'+berechnekey(strtoint(b))));
end;
savedialog1.execute;
if savedialog1.execute then
Memo1.lines.SaveToFile(savedialog1.FileName);
end;
end.


Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt


BenBE - Mi 01.03.06 18:37

user profile iconDarth Sitthiander hat folgendes geschrieben:
PS: Weiss einer wie ich die Buchstaben grossgeschrieben kriege?

Jup. Ganz einfach:

Delphi-Quelltext
1:
Font.Size := 500;                    


Ansonsten mal UpperCase ausprobieren *g*


Delete - Mi 01.03.06 21:06

gehört zwar nicht hier her, aber deine zeichenkette aus der du dein passwort zusammensetzt kannst du auch einfacher haben.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
 keystring: string;
begin
 zufallstr := '';
 keystring:= 'abcdefghijklmnopqrstuvwxyz1234567890'//string;
 for i = 0 to länge do 
  zufallstr:= zufallstr + keystring[random(length(keystring))];

....


da kannst du das ganze auch in einer ini ablegen und den anwender seinen favorisierten zeichencode festlegen lassen.

noch viel spass


Darth Sitthiander - Mi 01.03.06 21:27

Wie soll man das genau in dei unit einbinden? wo? beim button? oder function? kannste das bei meinem quelltext zeigen? thx


Delete - Do 02.03.06 01:17

hallo dirthy, das wäre deine funktion berechne key.


Darth Sitthiander - Do 02.03.06 18:56

Also sorry aber das einzige was er bei mir jetzt macht ist, dass er die datei doppelt speichert. kann mir einer sagen wie ich es schaffen kann, das er die datei als txt speichert und ich sie dann direkt öffnen kann, ohne erst noch den editor angeben zu müssen? Ich habe filter drinnen, aber die nützen irgendwie nix.
edit: ich habs! statt:
Memo1.lines.SaveToFile(savedialog1.FileName);
muss da stehen:
Memo1.lines.SaveToFile(savedialog1.FileName+'.txt');


Delete - So 05.03.06 14:11

tja, hat mich mal interessiert... deswegen hab ich es schnell mal nachprogrammiert. hier der quelltext:


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:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
unit uKeyGen;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, inifiles, StdCtrls, Spin, Buttons;

type
  TForm5 = class(TForm)
    msg: TPanel;
    bbGen: TBitBtn;
    cbAlpha: TCheckBox;
    cbZiffer: TCheckBox;
    cbSonder: TCheckBox;
    GroupBox1: TGroupBox;
    seLaenge: TSpinEdit;
    GroupBox2: TGroupBox;
    cbCaseSensitive: TCheckBox;
    lbKeys: TListBox;
    GroupBox3: TGroupBox;
    bbSave: TBitBtn;
    SaveDialog: TSaveDialog;
    procedure bbSaveClick(Sender: TObject);
    procedure bbGenClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    ini: tIniFile;
    procedure ReadIni;
    procedure WriteAndFreeIni;
    function CreateKeyString(Alpha, ziffern, sonder, CaseSensitive: boolean): string;
    function Keys(Zeichen: string; Laenge: integer): string;
  public
    { Public-Deklarationen }
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

procedure TForm5.bbGenClick(Sender: TObject);
var
 SchlueselString: string;
  i: Integer;
begin
 SchlueselString := CreateKeyString(cbAlpha.Checked,
                                    cbZiffer.Checked,
                                    cbSonder.Checked,
                                    cbCaseSensitive.Checked);

 lbKeys.Clear; bbSave.Enabled := false;
 for i := 1 to 20 do
  lbKeys.Items.Add(Keys(SchlueselString, seLaenge.Value));

 bbSave.Enabled := true;
end;

procedure TForm5.bbSaveClick(Sender: TObject);
var
 fileName: string;
 i: Integer;
 f: textfile;
begin
 saveDialog.Execute;
 FileName := savedialog.FileName;
 assignfile(f, filename);
 if fileexists(Filename) then
  system.append(f)
 else
  system.rewrite(f);
 for i := 0 to lbKeys.Count - 1 do
  writeln(f, lbKeys.Items[i]);
 system.close(f);
end;

function TForm5.CreateKeyString(Alpha, ziffern, sonder,
  CaseSensitive: boolean): string;
begin
 result := '';
 if alpha then
  result := 'abcdefghijklmnopqrstuvwxzy';
 if CaseSensitive then
  result := result + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
 if Ziffern then
  result := result + '0123456789';
 if Sonder then
  result := result + '.,-_:;!$%&/()=?';
end;

procedure TForm5.FormCreate(Sender: TObject);
begin
 msg.Caption := '';
 lbKeys.Clear;
 randomize;
 ReadIni;
 bbSave.Enabled := false;
end;

procedure TForm5.ReadIni;
var
 IniName: String;
begin
 IniName := copy(paramstr(0),1,length(paramstr(0))-3)+'INI';
 ini := tInifile.Create(IniName);
 cbAlpha.Checked         := ini.ReadBool(   'Param''Alpha',         true);
 cbZiffer.Checked        := ini.ReadBool(   'Param''Ziffer',        false);
 cbSonder.Checked        := ini.ReadBool(   'Param''Sonder',        false);
 cbCaseSensitive.Checked := ini.ReadBool(   'Param''CaseSensitive', false);
 seLaenge.Value          := ini.ReadInteger('Param''Laenge',        6);
end;

procedure TForm5.WriteAndFreeIni;
begin
 ini.WriteBool(   'Param''Alpha',         cbAlpha.Checked);
 ini.WriteBool(   'Param''Ziffer',        cbZiffer.Checked);
 ini.WriteBool(   'Param''Sonder',        cbSonder.Checked);
 ini.WriteBool(   'Param''CaseSensitive', cbCaseSensitive.Checked);
 ini.WriteInteger('Param''Laenge',        seLaenge.Value);
 ini.Free;
end;

procedure TForm5.FormDestroy(Sender: TObject);
begin
 WriteAndFreeIni;
end;

function TForm5.Keys(Zeichen: string; Laenge: integer): string;
var
  i: Integer;
begin
 result := '';
 for i := 1 to Laenge do
 begin
  result := result + zeichen[random(length(zeichen))+1];
 end;
end;

end.


Darth Sitthiander - So 05.03.06 16:53

Cool! Aber die Sonderzeichen würd ich rausnehmen. Und auch ein paar andere funktionen.


F34r0fTh3D4rk - So 05.03.06 17:22

auch als funktion, prozedur wie auch immer


Delete - So 05.03.06 17:53

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
auch als funktion, prozedur wie auch immer

????? :nixweiss: kann mir das mal einer auf deutsch übersetzten. ich komm da nicht ganz mit.


F34r0fTh3D4rk - So 05.03.06 18:09

das heißt so viel wie "guck dir das anfänger tutorial von christian an"


Larus - Fr 10.03.06 20:14

für die ascii tabellen braucht man keine formelsammlung...
ein normaler Freak weiß auch auswendig wo Zahlen klein- und Großbuchstaben anfangen :P


zemy - Sa 11.03.06 19:53

Ich kann mir das nie merken... Hab da eigentlich immer ne Exe daliegen, die mir den entsprechenden Code der Taste ausgiebt, die ich gerade gedrückt habe.... Vieleicht nicht unbedingt wegen A-Z usw, eher wegen den Steuerzeichen (Cursor, Backspace, Leertaste, etc.)

MfG