Ich versuche momentan einen Keyboard Hook zu programmieren, aber selbst nach viel Mühsal will es einfach nicht funktionieren. Ich habe mindestens 4 Beispiel-Projekte angesehen (Spy++..), ich habe in diesem Forum gesucht und alles gelesen was gefunden wurde, ich habe bei experts-exchange.com gesucht und beinahe alle Fragen angesehen, die etwas direkt oder indirekt mit systemweiten Hooks zu tun haben, ich habe auch auf codeproject.com Artikel über Dll's durchgelesen, ABER ich hab immer noch keinen systemweiten Hook zusammengebracht, geschweige denn das importieren von Funkionen aus meiner selbsterstellten Dll. Ich verliere bald meinen Verstand und driffte langsam in den Wahnsinn!
Hier ist der Code meiner Dll. Was mache ich falsch
KeyboardHook.h
KeyboardHook.cpp
Die folgenden Zeilen füge ich in die OnCreate(..)-Methode meiner Dialogfensterklasse ein (ist ein getrenntes MFC Projekt).
Ich kopiere die Dll in den Debug-Ordner, also sollte die Frage "Findet er die Dll überhaupt?" garnicht erst aufkommen
Beim Debuggen finde ich heraus, dass die Funktion "LoadLibrary" die Dll erfolgreich lädt aber der Funktionszeiger pInstallHook kriegt einfach keine Adresse ;(
Hier ist der Code meiner Dll. Was mache ich falsch
KeyboardHook.h
Code:
#ifndef _DEFINED_KEYBOARDHOOK
#define _DEFINED_KEYBOARDHOOK
#if _MSC_VER > 1000
#pragma once
#endif
#ifdef _COMPILING_KEYBOARDHOOK
#define KEYBOARDHOOK_API __declspec(dllexport)
#else
#define KEYBOARDHOOK_API __declspec(dllimport)
#endif // _COMPILING_KEYBOARDHOOK
KEYBOARDHOOK_API BOOL InstallHook(void);
KEYBOARDHOOK_API BOOL UnInstallHook(void);
#endif // _DEFINED_Dlltest
KeyboardHook.cpp
Code:
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#define _COMPILING_KEYBOARDHOOK
#include "KeyboardHook.h"
static LRESULT CALLBACK KeyboardHookProc(int, WPARAM, LPARAM);
HINSTANCE hDllInstance;
HHOOK hKeyboardHook;
BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
// Perform actions based on the reason for calling.
switch(fdwReason) {
case DLL_PROCESS_ATTACH:
// Initialize once for each new process.
// Return FALSE to fail DLL load
hDllInstance = hInstance;
break;
case DLL_THREAD_ATTACH:
// Do thread-specific initialization.
break;
case DLL_THREAD_DETACH:
// Do thread-specific cleanup.
break;
case DLL_PROCESS_DETACH:
// Perform any necessary cleanup.
break;
}
MessageBox(0, "Dll loaded.", "Dll entry", 0);
return TRUE; // Successful DLL_PROCESS_ATTACH.
}
__declspec(dllexport) BOOL InstallHook(void)
{
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProc, hDllInstance, NULL);
if (hKeyboardHook == NULL)
{
MessageBox(0,"The keyboard hook could not be installed.", "Fehler",MB_OK);
return FALSE;
}
return TRUE;
}
__declspec(dllexport) BOOL UnInstallHook(void)
{
return UnhookWindowsHookEx(hKeyboardHook);
}
static LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}
Die folgenden Zeilen füge ich in die OnCreate(..)-Methode meiner Dialogfensterklasse ein (ist ein getrenntes MFC Projekt).
Code:
typedef BOOL (*PINSTALLHOOK)(void);
m_hDLL = LoadLibrary("KeyboardHook.dll");
if(m_hDLL)
{
PINSTALLHOOK pInstallHook = (PINSTALLHOOK) GetProcAddress(m_hDLL, "InstallHook");
pInstallHook();
}
Ich kopiere die Dll in den Debug-Ordner, also sollte die Frage "Findet er die Dll überhaupt?" garnicht erst aufkommen
Beim Debuggen finde ich heraus, dass die Funktion "LoadLibrary" die Dll erfolgreich lädt aber der Funktionszeiger pInstallHook kriegt einfach keine Adresse ;(