![]() |
Keyboardhook + D7 & BDS2006
Hallo!
Habe in meinem Projekt den Keyboardhook von William Egge in Gebrauch. Hier der Quellcode dazu:
Delphi-Quellcode:
Zu meinem Problem:
unit keyboardhook;
{ By William Egge Sep 20, 2002 [email]egge@eggcentric.com[/email] [url]http://www.eggcentric.com[/url] This code may be used/modified however you wish. } interface uses Windows, Classes; type TCallbackThunk = packed record POPEDX: Byte; MOVEAX: Byte; SelfPtr: Pointer; PUSHEAX: Byte; PUSHEDX: Byte; JMP: Byte; JmpOffset: Integer; end; // See windows help on KeyboardProc // Or press F1 while your cursor is on "KeyboardProc" TKeyboardCallback = procedure(code: Integer; wparam: WPARAM; lparam: LPARAM) of object; TKeyboardHook = class(TComponent) private { Private declarations } FHook: HHook; FThunk: TCallbackThunk; FOnCallback: TKeyboardCallBack; function CallBack(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall; procedure SetOnCallback(const Value: TKeyboardCallBack); protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published declarations } property OnCallback: TKeyboardCallBack read FOnCallback write SetOnCallback; end; procedure Register; implementation procedure Register; begin RegisterComponents('EggMisc', [TKeyboardHook]); end; { TKeyboardHook } function TKeyboardHook.CallBack(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; begin if Code < 0 then Result:= CallNextHookEx(FHook, Code, wparam, lparam) else begin if Assigned(FOnCallback) then FOnCallback(Code, wParam, lParam); Result:= 0; end; end; constructor TKeyboardHook.Create(AOwner: TComponent); begin inherited Create(AOwner); FThunk.POPEDX:= $5A; FThunk.MOVEAX:= $B8; FThunk.SelfPtr:= Self; FThunk.PUSHEAX:= $50; FThunk.PUSHEDX:= $52; FThunk.JMP:= $E9; FThunk.JmpOffset:= Integer(@TKeyboardHook.Callback)-Integer(@FThunk.JMP)-5; FHook:= SetWindowsHookEx(WH_KEYBOARD, TFNHookProc(@FThunk), 0, MainThreadID); end; destructor TKeyboardHook.Destroy; begin UnhookWindowsHookEx(FHook); inherited; end; procedure TKeyboardHook.SetOnCallback(const Value: TKeyboardCallBack); begin FOnCallback := Value; end; end. Ich bin kürzlich von Delphi 7 auf BDS 2006 umgestiegen. Seit dem kommen alle Ereignisse doppelt. Sprich also: "Key down", "Key down", "Key up", "Key up". Habe schon ein leeres Projekt erstellt, und die Komponente reingezogen. Dort ist das gleiche Verhalten. Sobald ich das Projekt mit D7 öffne geht es wieder. Kann mir jemand weiterhelfen? |
Re: Keyboardhook + D7 & BDS2006
ist das nur so wenn du es innerhalb von Delphi ausführst?
zu dem schreibst du etwas von: "Key down", "Key down", "Key up", "Key up". Innerhalb des geposteten Codes wird dies aber gar nicht ausgewertet. Könntest du den Teil noch posten in dem du auswertest ob "Key down", "Key up" etc. ausgelöst wird? Genrell wird bei Hooks "Key down" etc. tatsächlich mehrfach empfangen wenn zum Beispiel die Taste gedrückt gehalten wird |
Re: Keyboardhook + D7 & BDS2006
Ist auch bei der fertig Compilierten EXE so :-(
Die Auswertung ist einfach. Die Komponente (siehe Quelltext oben) befeuert ein Ereignis:
Delphi-Quellcode:
Und dieses Ereignis kommt bei BDS 2006 doppelt.
procedure TForm1.KeyboardHook1Callback(code, wparam, lparam: Integer);
begin memo1.lines.add(inttostr(lparam)); end; Also: Zitat:
Zitat:
|
Re: Keyboardhook + D7 & BDS2006
Du solltest dich nicht darauf verlassen wie oft es ausgelöst wird. Bei mir wurde es teilweise sogar 3 mal ausgelöst. Schau dir am besten die Hilfe zu SetWindowsHookEx und wh_keyboard an damit du weißt worauf du dich verlassen kannst und was nur glück/zufall ist.
Der Grund für das von dir unerwartete Verhalten sollte der sein: Zitat:
Habs auch so eben probiert: Durch mehrere Aufrufe von PeekMessage mit PM_NOREMOVE wird die Hookprocedure immer wieder aufgerufen (so wie in der Hilfe beschrieben [/Edit] |
Re: Keyboardhook + D7 & BDS2006
Muss doch aber irgendwie auch an Delphi liegen.
Unter Delphi 7 habe ich die Komponente schon seit 3 Jahren im Einsatz. Ohne ein einziges Problem, geschweige denn dass da jemals was doppelt gekommen wäre. Hat sich an der Nachrichten-Kette in Delphi irgendwas geändert? |
Re: Keyboardhook + D7 & BDS2006
scheint so, vermutlich wird jetzt PeekMessage verwendet, eventuell für Application-Events etc.
Auf jeden Fall muss irgendwo ein PeekMessage oder GetMessage hinzugekommen sein. Wobei GetMessage fast ausgeschlossen ist da nach einem Aufruf von GetMessage die Nachricht erstmal weg wäre sofern sie nicht zwischenbespeichert wird. |
Re: Keyboardhook + D7 & BDS2006
hm. Irgendeine Idee, wie ich das Verhalten weg bekomme?
Filtern wäre halt die unelegante Lösung. Ansonsten danke schonmal! |
Re: Keyboardhook + D7 & BDS2006
Zitat:
|
Re: Keyboardhook + D7 & BDS2006
Blind muss der Mensch sein. :oops:
Zitat:
das isses dann wohl so weit. Vielen dank fürs entfernen der Tomaten :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz