Wie mit ReadConsole() Strings einlesen?

partitionist

Erfahrenes Mitglied
Hallo, ich möchte ein Programm erstellen welche auf bestimmte Tastatur Knöpfe reagiert (TAB-Taste), wenn diese Taste nicht gedrückt wird dann soll normale Eingabe erfolgen, nur wie macht man das mit der ReadConsole() Funktion

Code:
#include <windows.h> 
#include <stdio.h> 
#include <iostream> 
#include <string> 
 
using namespace std; 
 
VOID ErrorExit(LPSTR); 
VOID KeyEventProc(KEY_EVENT_RECORD);  
  
int main(VOID)  
{         
    cout << "Eingabe:>"; 
 
    HANDLE hStdin;  
    DWORD cNumRead, fdwMode, fdwSaveOldMode, i;  
    INPUT_RECORD irInBuf[128];  
    int counter=0; 
  
    // Get the standard input handle.  
  
    hStdin = GetStdHandle(STD_INPUT_HANDLE);  
    if (hStdin == INVALID_HANDLE_VALUE)  
        ErrorExit(TEXT("GetStdHandle"));  
  
    // Save the current input mode, to be restored on exit.  
  
    if (! GetConsoleMode(hStdin, &fdwSaveOldMode) )  
        ErrorExit(TEXT("GetConsoleMode"));  
  
    // Enable the window and mouse input events.  
  
    fdwMode = ENABLE_WINDOW_INPUT;  
    if (! SetConsoleMode(hStdin, fdwMode) )  
        ErrorExit(TEXT("SetConsoleMode"));  
  
    // Loop to read and handle the input events.  
  
    while (counter++ <= 100)  
    {  
        // Wait for the events.  
  
        if (! ReadConsoleInput(  
                hStdin,      // input buffer handle  
                irInBuf,     // buffer to read into  
                128,         // size of read buffer  
                &cNumRead) ) // number of records read  
            ErrorExit(TEXT("ReadConsoleInput"));  
  
        // Dispatch the events to the appropriate handler.  
  
        for (i = 0; i < cNumRead; i++)  
        { 
            switch(irInBuf.EventType)  
            {  
                case KEY_EVENT: // keyboard input  
                    KeyEventProc(irInBuf[i].Event.KeyEvent);  
                    break;              
            }  
        } 
    }  
  
    return 0;  
} 
 
VOID ErrorExit (LPSTR lpszMessage)  
{  
    fprintf(stderr, "%s\n", lpszMessage);  
    ExitProcess(0);  
} 
 
VOID KeyEventProc(KEY_EVENT_RECORD ker) 
{ 
    //Wartet auf TAB Taste 
    if(ker.wVirtualKeyCode == VK_TAB) 
    {     
        if(ker.bKeyDown) 
            cout << "#TAB EVENT PRESSED#"; 
        else  
            cout << "#TAB EVENT RELEASED#";             
    } 
 
    //Normale Eingabe 
    else 
    { 
        //hier kommt die normale eingabe 
        cout << "#Ausgabe#" << endl; 
    }     
}
 
Hallo

du bekommst ja pro Tastaturaktion einen KEY_EVENT, also auch für jedes eingegebene Zeichen. Diese Zeichen sollten dann in "UnicodeChar" bzw. "AsciiChar" der KEY_EVENT_RECORD-Struktur stehen. Du musst dann halt aus allen eingehenden Events die Zeichen herausfischen, den Input zusammenbauen und dabei auch auf besondere Eingaben (RETURN-Taste u.ä.) reagieren.

Gruß
MCoder
 
Hab folgendes versucht:

Code:
VOID KeyEventProc(KEY_EVENT_RECORD ker) 
{ 
    //Wartet auf TAB Taste 
    if(ker.wVirtualKeyCode == VK_TAB) 
    {     
        //....
    } 
 
    //Normale Eingabe 
    else 
    {         //FEHLER !
        cout << ker.uChar << endl;
    }     
}

Ich wollt zuerst testen welche Zeichen eingegeben wurden doch bekomme folgenden Fehler:

Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ '' akzeptiert (oder keine geeignete Konvertierung möglich)



[EDIT]
SORRY, habs hinbekommen: ker.uChar.UnicodeChar
 
Zuletzt bearbeitet:
Habe meine Funktion erweitert, doch meine eingegebenen Zeichen werden gespeichert in input doch ich kann die Eingabe nicht sehen.

Code:
VOID KeyEventProc(KEY_EVENT_RECORD ker)
{
    //Wartet auf TAB Taste
    if(ker.wVirtualKeyCode == VK_TAB)
    {    
        if(ker.bKeyDown)
            cout << "#TAB EVENT PRESSED#";
        else 
            cout << "#TAB EVENT RELEASED#";            
    }

    //Wartet auf Enter Taste
    if(ker.wVirtualKeyCode == VK_RETURN)
    {        
        cout << "NEWLINE" << endl;
        cout << "INPUT: " << input << endl;
        //Input löschen
        input.clear();
    }

    if(ker.wVirtualKeyCode == VK_BACK)
    {    
        cout << "löschen" << endl;
    }    

    //Normale String Eingabe
    else
    {
        if(ker.bKeyDown){}
        else
            input += ker.uChar.AsciiChar;        
    }
}

Hab noch einige Fragen:

1) Wie kann ich die eingegeben Zeichen in der Console sehen, was muss ich umstellen?

2) Muss ich die typischen Consolen Funktionen wie löschen von Zeichen oder neue Zeile mit Enter selber schreiben oder kann man in der Funktion SetConsoleMode() http://msdn2.microsoft.com/en-us/library/ms686033.aspx diese einstellen?
 
Zurück