Einzelnen Beitrag anzeigen

Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#13
  Alt 19. Jun 2003, 14:21
Hi,

danke erstmal für die Definition, habs dann mal in die ProgrammUnit eingebunden.
Aber irgendwie gehts immernoch nicht...

Diese Funktion habe ich aus einem anderen Tutorial (irgendwo bei Google gefunden) rausgenommen und so modifiziert, dass ich erstmal zum Gucken was ich da empfange, bevor ich mich an die "Abkürzungsverlängerung" mache, die gedrückten Tasten in eine Stringlist schreibe und später auf Buttonklick in ein Memo übertrage:

Delphi-Quellcode:
function hookproc(ncode: integer; wpara: wparam; lpara: lparam): longint; stdcall;
begin
  Result := 0;
  if ncode=Hc_action then
  begin
    if (Peventmsg(Lpara).message = wm_keydown) or (Peventmsg(Lpara).message = wm_syskeydown) then
    begin
      key:= Peventmsg(Lpara).paraml;
      key:= Peventmsg(lpara).paramH;
      key:= mapvirtualkey(key,0);
      universalkey(key); //gibt String für den jeweiligen key-Integer in keystr aus
      //den keystring in die Stringlist schreiben
      if keystr = '[ENTER]then list.Add(keystr) //wenn Enter gedrückt wurde, neue Zeile anfangen,
      else list[list.Count - 1]:= list[list.count - 1] + keystr; //sonst einfach anhängen
    end;
    if peventmsg(lpara).message = wm_keyup then
    begin
      key:= Peventmsg(Lpara).paraml;
      key:= mapvirtualkey(key,0);
    end;
  end;
end;
Key ist ein globaler Integer, list ist meine Stringlist die ich zuvor initialisiert habe.
Was ich an dieser Funktion schon die ganze Zeit fragwürdig finde ist, warum key drei mal hintereinander verschiedene Werte zugewiesen werden.

Als ich den Hook noch mit WH_KEYBOARD gesetzt hab, war es noch so, dass das Programm durch die zweite If-Abfrage durchkam (die wo geguckt wird, ob eine Taste oder eine Systemtaste gedrückt wurde) durchkam, dann aber die Funktion mapvirtualkey eine 0 zurückgab (weil das, was key vorher zugewiesen wurde, fast immer größer als 1000 war, aber auf jeden Fall immer größer als die ASCII- Range). Deswegen wurde auch jede Taste als Pause erkannt, weil universalkey der 0 die Taste Pause zuweist.
Mit WH_KEYBOARD_LL geht das Programm aber komplett an der zweiten if- Abfrage vorbei, es wird also durch den Tastendruck über den Hook zwar die Funktion ausgeführt, aber der Tastendruck wird dann als solcher nicht mehr erkannt.

So setze ich den Hook:

  setwindowshookex(WH_KEYBOARD_LL, hookproc, Hinstance, 0); Ist irgendwo irgendwas falsch? Oder gibts in der hookproc auch noch Teile, die so nur unter 9x funktionieren können?
Hoffe ihr könnt was finden.

Bis dann,

S - tefano
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat