Ärger mit Keyhook



  • Hallo,

    Ich habe zuerst alle Keypresses mit GetKeyState abgefragt.
    Da dies ziemlich unprofessionell ist, habe ich eine eigene
    Hotkey-klasse geschrieben, die mit einem Keyboard-Hook funktioniert.

    Hier der code:

    //Setup
    [...]
    hook_keys  = SetWindowsHookEx(WH_KEYBOARD_LL,LLKeyboardProc,GetModuleHandle(0),0);
    [...]
    
    LRESULT CALLBACK LLKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
    {
    	PKBDLLHOOKSTRUCT hookstruct;
    
    	if (nCode == HC_ACTION) 
    	{
    		switch (wParam) 
    		{
    		case WM_KEYDOWN:  case WM_SYSKEYDOWN:
    		case WM_KEYUP:    case WM_SYSKEYUP:
    
    			hookstruct = (PKBDLLHOOKSTRUCT) lParam;
    
    			if(wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)
    			{
    				//Register Keypress for Hotkey system
    				Hotkeys->ModifyButtonState(hookstruct->vkCode,GetTickCount());
    			}
    			else if(wParam == WM_KEYUP || wParam == WM_SYSKEYUP)
    			{
    				//Register Keyrelease for Hotkey system
    				Hotkeys->ModifyButtonState(hookstruct->vkCode,false);
    			}
    
    			//Block windows keys
    			if(settings.blockwindowskeys && (hookstruct->vkCode == 0x5B || hookstruct->vkCode == 0x5C))  /* Left / Right WinButton */
    				return 1;
    			else
    				return CallNextHookEx(NULL, nCode, wParam, lParam);
    		}
    	}
    	return CallNextHookEx(NULL, nCode, wParam, lParam);
    }
    

    Das Problem:
    Manche user beschweren sich, dass mein Programm zwar super funktioniert. Allerdings andere Hotkey Programme, die auch auf die Tastatur zugreifen, nicht mehr funktionieren, wenn mein Tool läuft. (Die anderen Programme reagieren nicht mehr auf die in ihnen festgelegten Hotkeys)

    Bei Alternativen ist zu beachten, dass die hotkeys auch funktionieren sollen, wenn mein Programm z.B. im Tray ist.

    Vielen Dank schonmal für eure Hilfe!

    Gruß
    Listing



  • Wo steht, daß man CallNextHookEx() NULL als ersten Parameter übergeben darf?



  • Hui, ist das das Problem?

    Vielen Dank 🙂



  • Der erste param wird

    MSDN schrieb:

    Windows NT/XP/2003: Ignored.



  • Habe das geändert aber es gibt immernoch Probleme 😞



  • Halbwissen schrieb:

    Der erste param wird

    MSDN schrieb:

    Windows NT/XP/2003: Ignored.

    Ah, richtig.
    In meiner MSDN-Dokumentation steht das noch nicht drin. [/berechtigte_ausrede]


Anmelden zum Antworten