Entwickler-Ecke

Windows API - GetAsnycKeyState Problem


matze - So 07.09.08 10:25
Titel: GetAsnycKeyState Problem
Hallo.

Ich habe ein Problem:
Ich habe im Forum den folgenden Code gefunden:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure keylogger;
var i: integer;
begin
  while true do
  begin
    for i := 10 to 200 do
      if boolean(getasynckeystate(i)) then
        form1.memo1.lines.Text :=
        form1.Memo1.lines.Text + char(i);
    sleep(10);
  end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var tid: cardinal;
begin
  createthread(0,0,@keylogger,nil,0,tid);
end;
und zwar hier: http://www.delphi-forum.de/viewtopic.php?p=519810#519810

Ich möchte also mit getasynckeystate Tasten abfragen. Ich will diesen Code nicht eins zu eins übernehmen, aber ich benutze ihn um ein bisschen zu experimentieren. Dabei ist mir aufgefallen, dass ich damit nicht herausbekomme, ob der Buchstabe gerade groß oder klein geschrieben wurde.
Wie kann ich denn das herausbekommen?

Danke,
Matze


Xion - So 07.09.08 10:37

Hi,

naja, ist ja klar, dass es nicht auf groß/klein achtet, da es ja nur den Zustand der Taste übermittelt. Du musst halt gucken, ob Shift(#16), Strg((#17), Alt(#18 ) gedrückt wird. Oder CapsLock [http://www.delphi-forum.de/viewtopic.php?t=25537&highlight=caps]


matze - So 07.09.08 10:41

ok klar.

Nur leider wird nur einmal übermittelt, wenn SHIFT gedrückt wird. Wenn der Benutzer also mehrere GROSSbuchstaben hintereinander eingibt, dann geht es wieder nicht.


Xion - So 07.09.08 10:47

wie ich sehe, scheint das wie bei CapsLock über GetKeyBoardState zu funktionieren (Quelle [http://www.delphi-forum.de/viewtopic.php?t=52078&highlight=shiftstate])

Edit:
Delphi-Hilfe hat folgendes geschrieben:
You can use the virtual-key code constants VK_SHIFT, VK_CONTROL, and VK_MENU as values for the vKey parameter. This gives the state of the SHIFT, CTRL, or ALT keys without distinguishing between left and right.


Edit2:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Timer1Timer(Sender: TObject);
var C: String;    A: integer;
begin
  for A:= 65 to 122 do
    if bool(GetAsyncKeyState(A)) then
      begin
        C:=chr(A);
        if not bool(GetAsyncKeyState(VK_Shift)) then
          C:=AnsiLowerCase(C);
        LabeledEdit1.Text:=LabeledEdit1.Text+C;
      end;
end;

so gehts ganz gut


matze - So 07.09.08 11:21

Hey Danke!
Das klappt.

Warum bin ich da nicht drauf gekommen? Hach. Ich werd alt...

Danke nochmals an alle!