Delphi-PRAXiS :: Das Forum für Fragen zu Delphi
Das Experten Forum für Delphi Programmierer
Hilfe für Borland Delphi gibts es hier im Forum
Delphi Quelltexte und Source Codes
 
Winter 2008 - lieben Dank an Julius für ds Bild
Delphi-PRAXiS :: Foren-ÜbersichtForen-Übersicht Delphi-PRAXiS Modul-ÜbersichtSite-Map Delphi-PRAXiS durchsuchenSuchen Delphi-PRAXiS Code-LibraryCode-Library Jetzt registrieren!Registrieren Login  
   
 
0
 
Delphi für Win32
Keyboard Hook, Denkfehler?
Ein Delphi (Win32)-Thema von rawsoul.

Vorheriges Thema anzeigen  |  Nächstes Thema anzeigen
Neuen Beitrag schreiben Auf Beitrag antworten
als PDF-Datei herunterladenThema ausdrucken
 
Delphi-PRAXiS Forum - Übersicht -> Windows API / MS.NET Framework API
Seite 1 von 1   [ 5 Beiträge ]  
 
 Autor 
 Nachricht 
 
rawsoul #1|Beitrag #933258Verfasst am: 29.08.2008, 12:40      Titel: Keyboard Hook, Denkfehler? Antworten mit Zitat
Mitglied
Alter: 19
Status: offline
Beiträge: 245
angemeldet: 29.10.2006
Wohnort: Düsseldorf
Delphi 2005 Personal

Sprache: Delphi (Win32)

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: markieren
var
  frmMain: TfrmMain;
  function KeyboardHookProc(code: Integer; wParam: Word; lParam: LongWord): LongWord;
    stdcall;

Delphi-Quellcode: zusammenfalten | markieren
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: markieren
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.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
shmia #2|Beitrag #933334Verfasst am: 29.08.2008, 16:38      Titel: Re: Keyboard Hook, Denkfehler? Antworten mit Zitat
Mitglied
Status: offline
Beiträge: 4.017
angemeldet: 02.03.2004
Delphi 5 Professional

rawsoul hat folgendes geschrieben:
- 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.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
rawsoul #3|Beitrag #933336Verfasst am: 29.08.2008, 16:42      Titel: Re: Keyboard Hook, Denkfehler? Antworten mit Zitat
Mitglied
Alter: 19
Status: offline
Beiträge: 245
angemeldet: 29.10.2006
Wohnort: Düsseldorf
Delphi 2005 Personal

Tschuldige, das hatte ich vergessen zu erwähnen - das Problem liegt am Hook selbst. Die BalloonTipMessage war nur zum Prüfen da Wink
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
shmia #4|Beitrag #933344Verfasst am: 29.08.2008, 16:50      Titel: Re: Keyboard Hook, Denkfehler? Antworten mit Zitat
Mitglied
Status: offline
Beiträge: 4.017
angemeldet: 02.03.2004
Delphi 5 Professional

rawsoul hat folgendes geschrieben:
das Problem liegt am Hook selbst. Die BalloonTipMessage war nur zum Prüfen da Wink

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: markieren
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;

Delphi Open Source:
http://sourceforge.net/softwaremap/tr ... mp;discrim=265&xdiscrim=9,8,7
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
rawsoul #5|Beitrag #933379Verfasst am: 29.08.2008, 18:35      Titel: Re: Keyboard Hook, Denkfehler? Antworten mit Zitat
Mitglied
Alter: 19
Status: offline
Beiträge: 245
angemeldet: 29.10.2006
Wohnort: Düsseldorf
Delphi 2005 Personal

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. Wink
Delphi-Quellcode: markieren
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 Wink)
Das Thema hat sich hiermit erledigt - danke shmia für die Hilfe Smile

 Zuletzt bearbeitet von rawsoul am 30.08.2008, 13:00, insgesamt 2-mal bearbeitet.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
Anzeige-Optionen:    
 
Delphi-PRAXiS Forum - Übersicht -> Windows API / MS.NET Framework API Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1   [ 5 Beiträge ]  
 
  Neuen Beitrag schreiben Auf Beitrag antworten
als PDF-Datei herunterladenThema ausdrucken
 
   
Gehe zu:  
Du darfst keine Beiträge in dieses Forum schreiben.
Du darfst auf Beiträge in diesem Forum nicht antworten.
Du darfst Deine Beiträge in diesem Forum nicht bearbeiten.
Du darfst Deine Beiträge in diesem Forum nicht löschen.
Du darfst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten.
Du kannst Dateien in diesem Forum nicht herunterladen.


Impressum / Kontakt
Allgemeine Geschäftsbedingungen
Verhaltenskodex & FAQ

Delphi-PRAXiS :: Das Forum für Delphi-Programmierer
Das Experten Forum für Delphi ProgrammiererHilfe für Borland Delphi gibts es hier im ForumDelphi Quelltexte und Source CodesDelphi-PRAXiS :: Das Forum für DelphiWindows APIInternet und NetzwerkeVCL und Datenbanken
 

Delphi-PRAXiS V.2005 III
© 2002-2008 by Daniel R. Wolf
powered by phpBB © phpBB Group

Impressum / Kontakt Allgemeine Geschäftsbedingungen