![]() |
Tastatur-Hook funktioniert nicht für alle Anwendungen
Moin moin
Ich versuche mich zur Zeit an der Programmierung mit Tastatur-Hooks, und bin dabei auf folgendes Problem gestoßen: Mein Tastatur-Hook funktioniert nicht für alle Anwendungen, die gerade laufen, sondern nur bisher nur für meine eigene Anwendung, dem Windows-Notepad und dem Windows-Explorer. Tastatureingaben, welche an andere Anwendungen gesendet werden, kann mein Hook nicht registrieren. Ich hab mich am Tutorial von Assarbad orientiert und den Grundquellcode im Wesentlichen übernommen. Ich poste einfach mal die entscheidenden Teile aus meinem Quellcode: DLL:
Delphi-Quellcode:
Hauptanwendung:
library keyboardhook;
uses Windows, Messages, Dialogs, SysUtils; var HookHandle: Cardinal = 0; AppHandle: HWND; function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); if nCode = HC_NOREMOVE then Exit; // if nCode = HC_ACTION then begin PostMessage(AppHandle, WM_USER + 1235, wParam, lParam); end; end; function InstallHook(ApplicationHandle: HWND): Boolean; stdcall; begin Result := False; if HookHandle = 0 then begin HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0); AppHandle := ApplicationHandle; Result := TRUE; end; end; function UninstallHook: Boolean; stdcall; begin Result := UnhookWindowsHookEx(HookHandle); HookHandle := 0; end; exports InstallHook, UninstallHook; end.
Delphi-Quellcode:
Die Funktion DllMessage empfängt halt alle Messages, die der Hook sendet und soll sie theoretisch erst einmal nur auflisten. Das funktioniert praktisch auch, aber nicht für alle Anwendungen. Wie gesagt, wenn ich im Notepad etwas schreibe, dann werden in meinem Memo-Feld auch alle Eingaben aufgelistet, aber bei meinem ICQ-Chatfenster beispielsweise, bleibt mein Memo-Feld leer.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Math, Menus, Grids, Unit2, IniFiles; type //... TFoMain = class(TForm) //... Memo1: TMemo; TiHook: TTimer; //... procedure TiHookTimer(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private procedure DllMessage(var Msg: TMessage); message WM_USER + 1235; //... end; function InstallHook(AppHandle: HWND): Boolean; stdcall; external 'keyboardhook.dll'; function UninstallHook: Boolean; stdcall; external 'keyboardhook.dll'; //... implementation {$R *.dfm} procedure TFoMain.TiHookTimer(Sender: TObject); begin TiHook.Enabled := False; InstallHook(Handle); end; procedure TFoMain.FormClose(Sender: TObject; var Action: TCloseAction); begin UninstallHook; end; procedure TFoMain.DllMessage(var Msg: TMessage); var Index, CharIndex, SlotIndex, CommandIndex: Integer; begin Memo1.Lines.Add(IntToStr(Msg.WParam) + ' / ' + IntToStr(Msg.LParam)); //... end; //... end. Bin für jede Hilfe dankbar :) MfG MiB-Agent |
Re: Tastatur-Hook funktioniert nicht für alle Anwendungen
Zitat:
64Bit Applikation zu 64 Bit Hook 32Bit Applikation zu 32 Bit Hook lg. Astat |
Re: Tastatur-Hook funktioniert nicht für alle Anwendungen
Ich verwende zur Zeit Windows XP 64-bit.
Allerdings ist mir noch nicht ganz klar, was ich jetzt genau ändern muss. Ist die DLL für den Keyboard-Hook automatisch nur für 64-bit Anwendungen verwendbar, weil das Betriebssystem 64-bit ist? :? Was ich auf jeden Fall brauche, ist ein Hook der speziell für 32-bit Anwendungen funktioniert. Ich bräuchte halt nur einen kleinen Hinweis, wie ich explizit einen 32-bit-Hook erstellen kann. :-D |
Re: Tastatur-Hook funktioniert nicht für alle Anwendungen
Zitat:
Damit werden dann unter einem Win64 Os alle 32 Bit Applicationen mit der erstellten DLL gehookt (Privileges beachten). Für einen globalen 64 Bit Hook brauchst Du einen 64 Bit Compiler, zB. FreePascal (FPC) mit Lazarus IDE. lg. Astat |
Re: Tastatur-Hook funktioniert nicht für alle Anwendungen
Also ich hab sowohl meine eigene Anwendung als auch die DLL mit Delphi 2009 erstellt, und zumindest in der Prozessliste steht hinter meiner Anwendung auch das "*32"-Symbol. Aber ich weiß nicht, ob man beim Compilieren der DLL noch irgendwas beachten muss, damit die auch wirklich 32-bit wird. :?
|
Re: Tastatur-Hook funktioniert nicht für alle Anwendungen
Zitat:
Also alles was Du unter Delphi > 1, Compillierst ist 32 Bit. lg. Astat |
Re: Tastatur-Hook funktioniert nicht für alle Anwendungen
Ich hab jetzt mal meine alte 32-bit XP-Version gestartet und meine Anwendung und den Hook getestet. Seltsamerweise funktioniert der dort überhaupt nicht, außer in meiner Hauptanwendung selbst. :(
Hab die unter 64-bit compilierte Version getestet und danach nochmal unter dem 32-bit System neucompiliert, aber funktioniert hat es in beiden Fällen nicht. :| Astat, was genau meintest du damit: Zitat:
|
Re: Tastatur-Hook funktioniert nicht für alle Anwendungen
Zitat:
Du musst Hier eine (IPC) InterprozessKommunikation mit Shared Mem, Pipes, Messages(WM_COPY_DATA), Sockets usw. implementieren, um mit der Host Applikation zu schwatzen.
Delphi-Quellcode:
lg. Astat
PostMessage(AppHandle,...
|
Re: Tastatur-Hook funktioniert nicht für alle Anwendungen
Zitat:
Hab das Apphandle jetzt durch FindWindow ersetzt, so dass die DLL das Fenster selbst sucht, damit funktioniert es einwandfrei. :-D Danke nochmal für deine Hilfe, Astat :cheers: MfG MiB-Agent |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:47 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 by Thomas Breitkreuz