![]() |
Keyboard Hook, Denkfehler?
Tag beisammen,
ich versuche, einen Keyboard Hook zu schreiben, um vordefinierte Tastenfolgen durch einen einfachen Tastendruck an die Zielanwendung zu senden. Daher soll er global sein - Also bitte nichts falsches denken :s Der Umsetzung liegt ein Tutorial zugrunde. Die interessanten Stellen:
Delphi-Quellcode:
var
frmMain: TfrmMain; function KeyboardHookProc(code: Integer; wParam: Word; lParam: LongWord): LongWord; stdcall;
Delphi-Quellcode:
function KeyboardHookProc(code: Integer; wParam: Word; lParam: LongWord): LongWord;
stdcall; begin if code < 0 then begin Result := CallNextHookEx(frmMain.hook, code, wParam, lparam); end; if lParam = VK_SPACE then begin frmMain.trayIcon.BalloonHint := 'You pressed Space!'; frmMain.trayIcon.ShowBalloonHint; end; Result := 0; end;
Delphi-Quellcode:
Das Problem: Der Quelltext gleicht vom Grundprinzip dem des Tutorials - der BalloonHint wird trotzdem nicht geöffnet, wenn ich Space drücke. Wo liegt denn hier der Fehler?
procedure TfrmMain.Initialize;
begin hook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0); end; LG, Frank. |
Re: Keyboard Hook, Denkfehler?
Zitat:
a.) dein Keyboard Hook funktioniert nicht richtig b.) der Code zu dem Ballonhint funktioniert nicht richtig Ersetze die Zeile mit ShowBalloonHint durch ein ShowMessage('Leertaste gedrückt') und du hast dein Problem sagen wir mal halbiert. |
Re: Keyboard Hook, Denkfehler?
Tschuldige, das hatte ich vergessen zu erwähnen - das Problem liegt am Hook selbst. Die BalloonTipMessage war nur zum Prüfen da ;)
|
Re: Keyboard Hook, Denkfehler?
Zitat:
Wird denn KeyboardHookProc überhaupt jemals von aussen aufgerufen?
Delphi-Quellcode:
function KeyboardHookProc(code: Integer; wParam: Word; lParam: LongWord): LongWord; stdcall;
begin OutputDebugString('in KeyboardHookProc()'); Assert(Assigned(frmMain)); frmMain.Caption := 'in KeyboardHookProc()'; // <==== if code < 0 then begin Result := CallNextHookEx(frmMain.hook, code, wParam, lparam); end; |
Re: Keyboard Hook, Denkfehler?
Also, nochmals getestet, musste durch deinen Vorschlag die Form wieder auf Visible := True setzen. Wie es aussieht, muss der Focus auf der App sein - allerdings war es geplant, einen globalen Hook zu setzen.
//Edit: Heißt soviel wie: Jetzt klappts. ;)
Delphi-Quellcode:
Der letzte Parameter, dwThreadId könnte somit das Problem sein. Die Doku bringt mich auch nicht weiter - laut Google ist 0 der richtige Wert für einen globalen Hook, oder irre ich mich?
SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0);
//Edit 2: Ich hätte wohl gründlicher lesen sollen - globale Hooks müssen in DLL's ausgelagert werden (Stichwort IPC - danke Assarbad ;)) Das Thema hat sich hiermit erledigt - danke shmia für die Hilfe :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:36 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