HotKey mit abfangen LowLevel Keyboard Hook



  • Hallooo, freunde,

    mein Programm hat zwei Zustände: A und B, wobei A der Standardzustand ist.
    Drücke (und halte) ich die Tastenkombination ALT-# soll mein Programm in Zustand B wechseln und wenn ich die beiden Tasten wieder loslasse, soll der Zustand A aktiviert werden.

    Der Hook läuft und das hier ist meine HookProc

    #define VK_RAUTE 0xBF // 191 - die Raute tasteeeeee
    LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
        if (nCode == HC_ACTION) {
    		KBDLLHOOKSTRUCT* kbdStruct = reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam);
    
    		switch (wParam) {
    			case WM_KEYDOWN: {
    				if (kbdStruct->vkCode == VK_RAUTE && kbdStruct->flags & LLKHF_ALTDOWN) {
    					MessageBox(NULL, "WE GOT IT", "", MB_OK);
    				}
    			} break;
    
    			case WM_KEYUP: {
    			} break;
    		}
        }
    
        return CallNextHookEx(g_HotKeyHook, nCode, wParam, lParam);
    }
    

    Leider Gottes wird die olle MessageBox nicht angezeigt, was heißt, dass meine if-Abfrage falsch ist.

    Wie muss die Abfrage richtig aussehen?
    Google konnte (oder wollte) mir nicht helfen.

    Danke und tschühühs



  • ...



  • ist der code in einer dll?



  • Nein, der LowLevel KBH ist in einer Application.

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) {
    	// Obacht: In der folgenden Zeile wird der Keaboardhook initialisiert!
    	g_HotKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, hInstance, 0);
    
    	InitCommonControls();
    	return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN_WINDOW), NULL, (DLGPROC) DlgMain);
    


  • CoderKiddi schrieb:

    if (kbdStruct->vkCode == VK_RAUTE && kbdStruct->flags & LLKHF_ALTDOWN)
    

    Bin mir jetzt grad nicht sicher aber um beide Aktionen zu beinhalten muss das doch so aussehen, oder??

    if((kbdStruct->vkCode == VK_RAUTE && ((kbdStruct->flags & LLKHF_ALTDOWN)!= 0))
    

    floorball



  • Folgendes habe ich gerade herausgefunden:
    Wenn ich ALT gedrückt halte und anschließend die Raute-Taste betätige, wird die WM_KEYDOWN Nachricht NICHT getriggert.

    Wieso ist das so?



  • EDIT: Weil die WM_SYSKEYDOWN getriggert wird, nicht WM_KEYDOWN...



  • CoderKiddi schrieb:

    Nein, der LowLevel KBH ist in einer Application.

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) {
    	// Obacht: In der folgenden Zeile wird der Keaboardhook initialisiert!
    	g_HotKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, hInstance, 0);
    
    	InitCommonControls();
    	return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN_WINDOW), NULL, (DLGPROC) DlgMain);
    

    Dein Hockaufruf wäre korrekt aufgerufen, wenn sich die Hockfunktion in einer DLL befinden würde, liegt der Code aber in deinem Programm, musst du SetWindowsHookEx mit anderen Parametern versorgen, lies dir hierfür die MSDN durch. Mein Tip: Parameter 3 und 4 ändern, den Rest solltest du durch Eigeninitiative lösen können.



  • Nö muss ich gar nicht :p


  • Mod

    @TheGoodGuy:
    Quatsch. Ein WH_KEYBOARD_LL muss nicht in eine DLL!


Anmelden zum Antworten