Low Level Keyboard Hook



  • Hallo,
    ich möchte bestimmte Tasten einer Tastatur umlegen, d.h. wenn beispielsweise STRG gedrückt wird, soll Windows den Druck der ALT Taste empfangen. Den Sinn erkläre ich, wenn mich jemand danach fragt 😉

    Dazu muss ich also das Keyboard global auf einer möglichst niedrigen Ebende hooken.
    In dieser DLL befindet sich der relevante Code; es wird von der Anwendung nur SetHook() aufgerufen und beim Beenden UnsetHook():

    #include <windows.h>
    
    HMODULE hDLLModule = NULL;
    HHOOK   hHook      = NULL;
    
    BOOL APIENTRY DllMain(HINSTANCE hDLLInstance, DWORD dwReason, LPVOID lpvReserved)
    {
    	if (dwReason == DLL_PROCESS_ATTACH)
    		hDLLModule = hDLLInstance;
    
    	return TRUE;
    }
    
    LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    	MessageBox(NULL, TEXT("Test"), NULL, NULL);
    
    	if (nCode == HC_ACTION)
    	{
    		// Vertauschen bestimmter Tasten
    	}
    
    	return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
    
    bool __stdcall SetHook()
    {
    	hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, hDLLModule, 0);
    	return (hHook != NULL);
    }
    
    bool __stdcall UnsetHook()
    {
    	if (!hHook) return true;
    
    	bool bResult = (UnhookWindowsHookEx(hHook) != 0);
    	hHook = NULL;
    
    	return bResult;
    }
    

    SetHook() liefert true - Aber es kommt kein einziges Mal die MessageBox mit "Test"... Dafür reagiert Windows auf jeden tastendruck ca. 2sec. verzögert... Was ist hier los??

    PS: Ich habe in die FAQ geschaut, die FoSu benutzt und google befragt, aber keine Lösung gefunden.

    MfG,
    Max



  • ripmav schrieb:

    ich möchte bestimmte Tasten einer Tastatur umlegen, d.h. wenn beispielsweise STRG gedrückt wird, soll Windows den Druck der ALT Taste empfangen.

    Scan Code Mapper for Windows

    Der primäre Grund dafür, daß dein Hook nicht funktioniert, dürfte übrigens sein, daß hHook für jede DLL-Instanz einmal existiert. In KeyboardProc() ist hHook demnach NULL, die einzige Ausnahme ist der Prozeß, der den Hook installiert hat.



  • Danke für den Link.

    Aber eigentlich dürfte hHook sehr wohl einen Wert haben:
    DLL_PROCESS_ATTACH wird ein einziges Mal ausgelöst (von meiner Anwendung).
    Ich habs gerade nochmal überprüft.
    => Es gibt nur eine einzige DLL-Instanz

    Außerdem müsste KeyboardProc() von Windows ja erstmal aufgerufen werden, dann könnte man nachschauen ob hHook NULL ist oder nicht, aber es wird ja nicht mal aufgerufen...

    Übrigens wird das ganze in der FAQ auch so gemacht.



  • hooks sind nix für kinder. wenn ihr sie schon verwenden wollt, dann lest wenigstens die paar seiten auf der msdn dazu durch. dauert 15 minuten und dann sind 9 von 10 fragen schon von selbst beantwortet 👎

    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.



  • Der Text, den du geposted hast, habe ich auch schon gelesen: http://msdn.microsoft.com/en-us/library/ms632589(VS.85).aspx.

    Ich habe in meinem ersten Post bereits angedeutet, dass ich schon überall gesucht habe, die MSDN war natürlich auch dabei!
    Leider erkenne ich meinen Fehler durch diesen Text nicht.

    Abgesehen davon warst du sicher auch nicht von Anfang an ein Profi im Umgang mit Hooks...



  • So, ich habe jetzt herausgefunden woran es lag:
    Die Anwendung, die die DLL benutzt hat, habe ich per Sleep(INFINITE) provisorisch am schließen gehindert - Wenn man einfach stattdessen z.b. eine MessageBox einbaut, die man nicht schließt, funktioniert alles.



  • Tip:

    um Tasten zu remappen gibt es ein tool das heißt remapkey (glaub ich), das ist in dem kostenlosen windowe server2003 ressource kit, dass auch unter winxp benutzt werden kann.


  • Mod

    Ein Remap ist auch über [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
    möglich.



  • ascda schrieb:

    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.

    Tatsächlich; ich hatte vergessen, daß die Lowlevel-Hooks gar nicht injiziert werden. Dann ist mein obiger Hinweis natürlich hinfällig.

    Martin Richter schrieb:

    Ein Remap ist auch über [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
    möglich.

    Liest du eigentlich auch, was vor dir gepostet wurde?


  • Mod

    audacia schrieb:

    Martin Richter schrieb:

    Ein Remap ist auch über [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
    möglich.

    Liest du eigentlich auch, was vor dir gepostet wurde?

    Ja! Was hast Du für ein Problem mit meiner Antwort?

    Wenn es um einen allgemeinen Remap geht, ist das eben weitaus einfacher zu machen. Im Schreiben des OP kann ich nicht sehen, dass er dies nicht evtl. permament machen möchte.



  • Ganz zufällig hatte ich im zweiten Post des Threads auf einen Artikel verlinkt, der die Verwendung des von dir genannten Registry-Keys erklärt 😉


  • Mod

    audacia schrieb:

    Ganz zufällig hatte ich im zweiten Post des Threads auf einen Artikel verlinkt, der die Verwendung des von dir genannten Registry-Keys erklärt 😉

    Upps Sorry! Den hatte ich gelesen, aber nich angesehen.


Anmelden zum Antworten