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