[Erledigt] Input bei Consolen Interface



  • Hi Leute,

    also ich moechte mir ein paar kleine Klassen basteln die den Input bzw Output in der Console behandeln. Dafuer hab ich erst mal ne Consolen Klasse geschrieben in der man einen Hander angeben kann um neue Tastenanschlaege zu bekommen. Hier mal kurz ein stueckchen Code:

    unsigned __stdcall Console::InputHandlerThread(void* args)
    {
    	Console& Con = Console::Get();
    	HANDLE hStdInput = GetStdHandle(STD_INPUT_HANDLE);
    	DWORD dwEvents;
    	DWORD dwRead;
    	PINPUT_RECORD pInputRecord;
    
    	while(Con.m_bThreadRun)
    	{
    		switch( WaitForSingleObject( hStdInput, 500) )
    		{
    		case WAIT_OBJECT_0:
    			{
    				if( GetNumberOfConsoleInputEvents(hStdInput, &dwEvents) )
    				{
    					pInputRecord = new INPUT_RECORD[dwEvents];
    					if( pInputRecord)
    					{
    						if( ReadConsoleInput(hStdInput, pInputRecord, dwEvents, &dwRead) )
    						{
    							EnterCriticalSection(&Con.m_CritSecInputHandler);
    /* event an alle registrierten Handels verteilen*/							
    LeaveCriticalSection(&Con.m_CritSecInputHandler);
    						}
    						delete[] pInputRecord;
    					}
    				}
    				break;
    			}
    		}
    	}
    	_endthreadex(0);
    	return 0;
    }
    

    So nun hab ich das Problem, dass wenn ich eine Taste druecke kommen ja mehr als eine Nachricht an und somit sieht es so aus also ob die Taste mehrmals gedrueckt wurde. Mein erster versuch diese Problem zu loesen war zu pruefen ob die Taste losgelassen wurde und nur dann den Input zu behandeln. Ist aber nicht schoen wenn man z.B. meherer Leerzeichen machen will und immer die Taste druecken / loslassen muss um eins zu erzeugen. Mein zweiter Versuch war die Millisekunden zu pruefen wie lang der letzte Input her ist und nur nach ca. 50ms einen neuen anzunehmen. Hat aber auch nicht richtig geklappt. Btw sieht ungefaehr so aus:

    clock_t ClockElapsed = ( (clock() - m_ClockLastInput) / (float)CLOCKS_PER_SEC) * 1000;
    
    					return ( m_ClockLastInput == 0 || ClockElapsed >= m_uInputDelayMS);
    

    Und jetzt wollt ich euch fragen wie ich den Input am besten realisiern koennte um nicht zu viel Zeichen bei einem druck zu schreiben aber auch wenn man drauf bleibt auf der Taste mehrere Zeichen geschrieben werden !?

    Danke schon mal
    Praise the Lord
    C0de4Fun


  • Mod

    Du musst Dir schon die Mühe machn und ansehen was im INPUT_RECORD steht.
    http://msdn.microsoft.com/en-us/library/ms684166(v=VS.85).aspx

    Ich kann mir nicht vorstelen, dass es mehrere Nachrichten für eine Tastatureingabe gibt bei der bKeyDown true ist.
    http://msdn.microsoft.com/en-us/library/ms684166(v=VS.85).aspx

    Siehe auch Sample:
    http://msdn.microsoft.com/en-us/library/ms685035(v=VS.85).aspx



  • Also erstens mal hab ich mir den Eintrag fuer INPUT_RECORD in der MSDN angeschaut ;). Und dabei har mir dieser Absatz:

    wRepeatCount

    The repeat count, which indicates that a key is being held down. For example, when a key is held down, you might get five events with this member equal to 1, one event with this member equal to 5, or multiple events with this member greater than or equal to 1.

    glaub ich Probleme bereitet. Muss aber auch ehrlich sagen weiss nimmer wo mein Problem war 😮.
    Aber jetzt gehts wenn ich einfach pruef ob bKeyDown 1 ist und dann das bearbeite.

    Danke dir fuer den Denkanstoß. War halt mal wieder auf der Leitung gehockt :p

    Bun Babylon and praise him
    C0de4Fun


Log in to reply