Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Keyboard Hook, Denkfehler? (https://www.delphipraxis.net/119664-keyboard-hook-denkfehler.html)

rawsoul 29. Aug 2008 12:40


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:
procedure TfrmMain.Initialize;
begin
  hook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0);
end;
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?

LG,
Frank.

shmia 29. Aug 2008 16:38

Re: Keyboard Hook, Denkfehler?
 
Zitat:

Zitat von rawsoul
- der BalloonHint wird trotzdem nicht geöffnet, wenn ich Space drücke. Wo liegt denn hier der Fehler?

Da gibt es zwei Möglichkeiten:
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.

rawsoul 29. Aug 2008 16:42

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 ;)

shmia 29. Aug 2008 16:50

Re: Keyboard Hook, Denkfehler?
 
Zitat:

Zitat von rawsoul
das Problem liegt am Hook selbst. Die BalloonTipMessage war nur zum Prüfen da ;)

Beim Debuggen ist wichtig, dass die Debugausgaben 150% ankommen. Ein BalloonTip wäre mir zu unsicher.

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;

rawsoul 29. Aug 2008 18:35

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:
SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0);
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?

//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 06:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz