TastaturHook zu schnell (?)



  • tagchen zusammen,
    ich benutze einen Tastaturhook, was auch wunderbar funktioniert, allerdings zu gut. Denn wenn ich zB 'a' antippe, dann schreibt er 'aa' in die Variable. Bei allen anderen Buchstaben genauso. Ich dachte erst, das könnte dadran liegen, dass die Tasten so schnell abgefragt werden, dass man sie noch nicht losgelassen hat, aber auch mit einem Sleep innerhalb der Funktion gibts doppelte Buchstaben. Da ich nicht genau weiß, was ich jetzt noch machen könnte, poste ich einfach mal den Code. oshi.pGui-> etc sind Klassen, die hier den Rahmen sprengen würden und auch nichts mit dem Problem zu tun haben, weswegen ich sie weglasse.

    char kleinbuchstaben[] = "abcdefghijklmnopqrstuvwxyz";
    char grossbuchstaben[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char zahlen[] = "0123456789";
    //---------------------------------------------------------------------------
    LRESULT CALLBACK KeyboardHook(int code, WPARAM wParam, LPARAM lParam)
    {
    	if(Cvars.x == 0)
    		return CallNextHookEx(oshi.pGui->KeyHookHandle, code, wParam, lParam);
    
    	if(oshi.pGui->CheckKey(code, wParam, lParam))
    		return TRUE;
    
    	return CallNextHookEx(oshi.pGui->KeyHookHandle, code, wParam, lParam);
    }
    //---------------------------------------------------------------------------
    bool Gui::CheckKey(int code, WPARAM wParam, LPARAM lParam)
    {
    	if(!oshi.pGui->guian)
    		return false;
    	//Sleep(200);
    	switch (wParam)
    	{
    		case VK_RETURN:
    		{
    			if(oshi.pGui->CommandLine.empty())
    				return true;
    			text.push_back(oshi.pGui->CommandLine);
    			oshi.pGui->CommandLine.clear();
    			return true;
    		}
    		case VK_SPACE:
    		{
    			oshi.pGui->CommandLine += ' ';
    			return true;
    		}
    		case VK_BACK:
    		{
    			if(oshi.pGui->CommandLine.length() > 0)
    				oshi.pGui->CommandLine.erase(oshi.pGui->CommandLine.length() - 1, oshi.pGui->CommandLine.length());			
    			return true;
    		}
    		default:
    		{	
    			if(wParam > 0x40 && wParam < 0x5B)
    			{
    				if(GetAsyncKeyState(VK_SHIFT))
    					oshi.pGui->CommandLine += grossbuchstaben[wParam - 0x41];
    				else
    					oshi.pGui->CommandLine += kleinbuchstaben[wParam - 0x41];
    				return true;
    			}
    			else if(wParam >= 0x30 && wParam <= 39)
    			{
    				if(GetAsyncKeyState(VK_SHIFT))
    					return false;
    				else
    					oshi.pGui->CommandLine += zahlen[wParam - 0x30];
    				return true;
    			}
    			else
    			{
    				char szKeyname[10];
    				if(GetKeyNameText(lParam, szKeyname, 10))
    				{
    					if(strlen(szKeyname) == 1)
    					{
    						oshi.pGui->CommandLine += szKeyname;
    					}
    					return true;
    				}
    			}
    		}
    	}
    	return false;
    }
    //---------------------------------------------------------------------------
    

    greetz KN4CK3R



  • KN4CK3R schrieb:

    Denn wenn ich zB 'a' antippe, dann schreibt er 'aa' in die Variable.

    Antippen --> WM_KEYDOWN + WM_KEYUP ?



  • ok danke, dadran habe ich nicht gedacht, nur wie baue ich das am besten ein? wparam wird ja schon für die Tasten benutzt. Oder funktioniert sowas hier in der Art?

    switch(wParam)
    {
          case WM_KEYDOWN:
                    switch(wParam)
                    {
                    //mein Code
                    }
    		break;
    }
    

    Oder irre ich mich und wird WM_KEYDOWN etc nicht mit wParam ausgeliefert?

    greetz KN4CK3R



  • Wenn dich eh nur einzelne Tasten interessieren, reicht es, nur WM_KEYUP abzufangen.



  • ok, habs jetzt damit gemacht:

    if(lParam &0x40000000 || lParam &0x80000000)
    

    Edit: wo wir grad dabei sind, wie ist der VK Code für . und -?

    greetz KN4CK3R




Anmelden zum Antworten