AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Keyboard Hook, Denkfehler?

Ein Thema von rawsoul · begonnen am 29. Aug 2008 · letzter Beitrag vom 29. Aug 2008
Antwort Antwort
Benutzerbild von rawsoul
rawsoul

Registriert seit: 29. Okt 2006
Ort: Düsseldorf
249 Beiträge
 
Delphi 2005 Personal
 
#1

Keyboard Hook, Denkfehler?

  Alt 29. Aug 2008, 13:40
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.
Frank Dumont
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Keyboard Hook, Denkfehler?

  Alt 29. Aug 2008, 17:38
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von rawsoul
rawsoul

Registriert seit: 29. Okt 2006
Ort: Düsseldorf
249 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Keyboard Hook, Denkfehler?

  Alt 29. Aug 2008, 17:42
Tschuldige, das hatte ich vergessen zu erwähnen - das Problem liegt am Hook selbst. Die BalloonTipMessage war nur zum Prüfen da
Frank Dumont
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Keyboard Hook, Denkfehler?

  Alt 29. Aug 2008, 17:50
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;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von rawsoul
rawsoul

Registriert seit: 29. Okt 2006
Ort: Düsseldorf
249 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Keyboard Hook, Denkfehler?

  Alt 29. Aug 2008, 19:35
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.
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
Frank Dumont
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:54 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