Keyboardhook



  • Hallo,

    manch einer bekommt bei dem Titel vielleicht einen Anfall, weil das Thema wohl schon öfters behandelt wurde. Ich habe auch die FAQ durchsucht, gegoogelt etc., aber nichts gefunden, was meinen Kriterien entspräche.
    Vielleicht bin ich aber auch nur blind, das will ich nicht ausschließen 😛

    Also, zu meinem Problem. Ich möchte ein Programm schreiben, das einen Hook verwendet, der die "Tasten" der Tastatur vertauschen soll (Benutzer drückt A => "System" drückt X). Ich habe soweit schon alles fertig, die DLL, das Programm etc. Der Hook wird auch aufgerufen, die Abfrage für die Tasten, die ersetzt werden sollen, funktioniert auch. Nur: Die Tastendrücke werden nicht durch andere ersetzt.

    Zu Anfang dachte ich, wenn ich in meiner HookProc z.B. den "Virtual-Key Code" von A, gespeichert in wParam, durch

    wParam = VK_ESCAPE;
    

    ersetze und dann anschließend CallNextHookEx(...) aufrufe, klappt das. Leider ist dem nicht so.

    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. Das Aufrufen der HookProc sieht daher etwas kryptisch aus

    (HOOKPROC)GetProcAddress(g_hHookDLL, (LPCSTR)"?KeyboardHook@@YGJHIJ@Z");
    

    Trotzdem funktioniert DAS einwandfrei :).
    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.
    Kann es vielleicht an einem davon liegen? Oder hat der wParam letzlich keinen Einfluss, wenn man ihn verändert und man muss das ganze "tiefer" angehen?

    Für Hilfe wäre ich dankbar.

    PS.: Ich hoffe, dass alles verständlich ist 🙂



  • Keiner eine Idee?



  • 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


Anmelden zum Antworten