 |
| |
|
|
 |
Autor |
Nachricht |
 |
| |
| rawsoul |
#1| Verfasst am: 29.08.2008, 12:40 Titel: Keyboard Hook, Denkfehler? |
 |
 |
 |
|
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 | 1 · · · 5 · · · · 10 · · · · 15 16
| 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. |
|
 |
|
|
|
| |
| shmia |
#2| Verfasst am: 29.08.2008, 16:38 Titel: Re: Keyboard Hook, Denkfehler? |
 |
 |
 |
|
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. |
|
 |
|
|
|
| |
| rawsoul |
#3| Verfasst am: 29.08.2008, 16:42 Titel: Re: Keyboard Hook, Denkfehler? |
 |
 |
 |
|
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 |
|
 |
|
|
|
| |
| shmia |
#4| Verfasst am: 29.08.2008, 16:50 Titel: Re: Keyboard Hook, Denkfehler? |
 |
 |
 |
|
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  |
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 |
 |
|
|
|
| |
| rawsoul |
#5| Verfasst am: 29.08.2008, 18:35 Titel: Re: Keyboard Hook, Denkfehler? |
 |
 |
 |
|
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.
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 |
Zuletzt bearbeitet von rawsoul am 30.08.2008, 13:00, insgesamt 2-mal bearbeitet. |
 |
|
|
|
 |
|
 |
| |
|
|
| |
 
|
|
| |
|
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.
|
|
 |