Hook funktioniert nicht
-
@rT!f@Ct schrieb:
also erstmal denke ich das du nicht ganz verstanden hast wozu so ein keyhook gut ist.
möglich. vielleicht verwechsel ich auch grad was.
was willst du mit dem keyhook in deinem programm? da ist er doch sinlos. in deinem programm kannst du tastaturnachrichten mit DEINER WindowProcedure abfangen.
einen Keyhook schleust man in ein fremdes programm ein, wenn man wissen will welche taste dort getrückt wurde.Im prinzip will ich folgendes:
wenn der benutzer irgendwann, irgendwo(in irgendeinem programm) irgendeine taste drückt, etwas machen. Z.b. sobald man F10 drückt schaltet sich der computer aus.und "ba" steht bei dir weil du in deiner WinMain die Funktion
SetupHook (HWND hParent)
aufrufst und direckt danach
std::cout << "a";wieso "ba" ausgegebn wird weiß ich, aber wieso niemls "c" ausgegeben wird weiß ich nicht.
/*******************************************************************/
/* KeyboardHookProc: wird jedes mal aufgerufen, wenn eine Taste betätigt wird */Das heißt für mich, dass ich entweder keine taste gedrückt habe, oder das irgend ein fehler im programm ist.
Achja, das gepostete programm ist natürlich noch sinnlos, aber erst sollte es prinzipiell funktionieren, dann baue ich die echten funktionen ein.
Mfg
-
wenn der benutzer irgendwann, irgendwo(in irgendeinem programm) irgendeine taste drückt, etwas machen. Z.b. sobald man F10 drückt schaltet sich der computer aus
dann solltest du den hook systemweit installieren und nicht in deinem programm.
kann nämlich gut möglich sein, das genau aus diesem grund (in deinem prog) der hook nicht funzt.ich habe vor etwas längere zeit das gleiche beispiel genutzt wie du und bei mir hat es geklappt.
auch solltest du in der Main.cpp folgendes definieren
typedef BOOL (*SetupHookDll)(HWND); typedef BOOL (*UninstallHookDll)(void); SetupHookDll m_pSetupHookDll = NULL; UninstallHookDll m_pUninstallHookDll = NULL;
in einer Funktion von der aus du den Hook inizialisieren willst sollte folgendes stehen.
HMODULE hMyDll = NULL; hMyDll = LoadLibrary("C:\\PfadZuDerHookDll\\KeyHook.dll"); if(hMyDll == NULL) { MessageBox(0,"Dll nicht gefunden!\n","",IDOK); return; } m_pSetupHookDll = (SetupHookDll)GetProcAddress(hMyDll, "SetupHook"); if(m_pSetupHookDll == NULL) { MessageBox(0,"SetupHookDll Funktionen nicht gefunden!\n","",IDOK); return; } m_pSetupHookDll(hWnd);
-
quark der code da oben funzt genauso gut. aber wenn du keine ahnung von der arbeitsweise von hooks hast, solltest du sie auch nicht verwenden. immer das gleiche hier, echt man. die hook callback wird im kontext des jeweiligen prozesses aufgerufen, d.h. die hook.dll wird in den prozess eingeblendet. mach dir das bitte klar und lies mal die msdn durch, glaubste bill gates und steve balmer haben das alles zum spaß da aufgeschrieben, damit es keiner liest??
-
ascda schrieb:
quark
Japp. Er verwendet einfach nur den falschen Hook.
Ich würde den da:WH_KEYBOARD_LL
LL = Low Level
verwenden, wobei die Hook-Prozedur in einer DLL liegen sollte. Nach M-Schrott darf sie auch Applications-Scope haben.
-
WH_KEYBOARD_LL ist ned global hook
-
ascda schrieb:
WH_KEYBOARD_LL ist ned global hook
Dann hat sich M-Schrott wohl geirrt:
Hook Scope
WH_CALLWNDPROC Thread or global
WH_CALLWNDPROCRET Thread or global
WH_CBT Thread or global
WH_DEBUG Thread or global
WH_FOREGROUNDIDLE Thread or global
WH_GETMESSAGE Thread or global
WH_JOURNALPLAYBACK Global only
WH_JOURNALRECORD Global only
WH_KEYBOARD Thread or global
WH_KEYBOARD_LL Global only << hier ....
WH_MOUSE Thread or global
WH_MOUSE_LL Global only
WH_MSGFILTER Thread or global
WH_SHELL Thread or global
WH_SYSMSGFILTER Global onlyWir schreiben einen Brief nach Redmond.
-
However, the WH_KEYBOARD_LL hook is not injected into another process. Instead, the context switches back to the process that installed the hook and it is called in its original context. Then the context switches back to the application that generated the event.
-
ascda schrieb:
However, the WH_KEYBOARD_LL hook is not injected into another process. Instead, the context switches back to the process that installed the hook and it is called in its original context. Then the context switches back to the application that generated the event.
Selbst wenn der Low Level Keyboard Hook nicht injeziert wird, ist er dennoch ein globaler Hook!
-
Hi,
danke erstmal die die vielen Antworten.
Ich hab jetzt einiges rumprobiert und auch den Code von @rT!f@Ct eingebaut. Es kommt die Meldung, dass er die Funktion "SetupHook" nicht findet. Die Dll findet er aber, was die vermutung nahelegt, dass das problem an der Dll, bzw. der Verwendung der dll liegt.Und wenn ich Zeile 46:
hhkHook = SetWindowsHookEx (WH_KEYBOARD, KeyboardHookProc, hDllInstance, NULL) ;
durch
hhkHook = SetWindowsHookEx (WH_KEYBOARD, KeyboardHookProc, NULL, GetCurrentThreadId()) ;
ersetzte, werden TastaturEvents registriert(Ausgabe von "c"), solange der Focus bei meiner eigenen Form ist, sonst nicht(mit WH_KEYBOARD_LL geht es gar nicht)
Mfg
-
ich denke das dein fehler in der deklaration der Funktionen UninstallHook & SetupHook liegt
UninstallHook & SetupHook sind KEINE Callback funktionen ändere mal die deklaration der beiden funktionen in der header & quellcode datei der DLL wie folgt ab
*.h
EXPORT BOOL UninstallHook (void); EXPORT BOOL SetupHook (HWND hParent);
*.cpp
EXPORT BOOL UninstallHook (void) { //..... } EXPORT BOOL SetupHook (HWND hParent) { //...... }
-
Hi,
VIELEN DANK
Das EXPORT war die entscheidende Stelle. Jetzt funktioniert er prima.
Danke für die viele Arbeit, die ihr da reingesteckt habtMfg DerBaer