W
Hi,
Ebenfalls (vielleicht?) problematisch ist die Tatsache, dass die DLL unabhängig vom eigentlichen Programm läuft. Das heißt, dass keine Informationen, außer dem Namen und den "Funktionsnamen" der HookProc, über die DLL vorhanden sind.
Was meinst du mit unabhängig vom Programm?? Du lädst die Dll mit LoadLibrary, oder nicht? Wie ein Hook dann funktioniert, wissen wir ja.
Das Aufrufen der HookProc sieht daher etwas kryptisch aus
(HOOKPROC)GetProcAddress(g_hHookDLL, (LPCSTR)"?KeyboardHook@@YGJHIJ@Z");
Das sieht kryptisch aus weil deine DLL Funktion nicht extern "C" ist und du als C++ kompilierst.
Der erste Parameter von CallNextHookEx ist bei mir NULL (weil die DLL nicht den Handle zum Hook kennt), da der (laut MSDN) sowieso ignoriert wird.
Da in der MSDN steht, daß er ignoriert wird, kannst du ihn auch getrost ignorieren.
Du könntest einen WH_GETMESSAGE Hook installieren um die Nachrichten abzufangen und zu verändern, ungefär so (keine Garantie )
#include <Windows.h>
HHOOK hHook;
HINSTANCE hInstDll;
LRESULT CALLBACK GetMsgProc( int nCode, WPARAM wParam, LPARAM lParam )
{
PMSG pMsg;
if( nCode < 0 )
return CallNextHookEx( NULL, nCode, wParam, lParam );
pMsg = (PMSG)lParam;
if( pMsg->message == WM_CHAR && wParam == PM_REMOVE ) {
if( pMsg->wParam == 'a' )
pMsg->wParam = 'f';
}
return CallNextHookEx( NULL, nCode, wParam, lParam );
}
_declspec(dllexport) void SetupHook( BOOL bInstall )
{
if( bInstall )
hHook = SetWindowsHookEx( WH_GETMESSAGE, GetMsgProc, hInstDll, 0 );
else
UnhookWindowsHookEx(hHook);
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
TCHAR szBuf[128];
if( ul_reason_for_call == DLL_PROCESS_ATTACH ) {
/* wsprintf( szBuf, "Attaching GetMsg.dll to process (%i)",
GetCurrentProcessId());
MessageBox( NULL, szBuf, "DLL_PROCESS_ATTACH", MB_OK );*/
hInstDll = hModule;
}
return TRUE;
}
WebNubbi