Auf TAB Taste in der Konsole reagieren...
-
Hallo, ich möchte versuchen eine Shell zu programmieren welche auf auf die TAB Taste reagiert und dann bestimmte Befehle auflistet wie bei Unix Tab-Completition oder ihr könnt es auch mit der cmd testen, geht auch.
Ich weiß nicht wie ich das realisieren soll, dass die Konsole ständig auf TAB Taste wartet und dann an dieser Position soll dann jeweils die Befehle angezeigt werden.
Ich habe mal ein kurzes Beispiel gemacht, welches aber erst zu spät die TAB erkennt, wegen dem string vergleich:
#include <windows.h> #include <iostream> #include <string> using namespace std; int main() { string str; do { cout << "EINGABE:"; getline(cin, str); if(str == "exit") return 0; if(str == "\t") cout << "TAB" << endl; cout << str << endl; }while(1); return 0; }
Ich weiß jetzt nicht ob die Reaktion auf die TAB Taste eine Aufgabe vom Fenster-Handles oder der internen Konsole ist?
Wenn man nun in dem Beispiel oben die TAB Taste drückt, springt der Cursor weiter was nicht passieren soll, wie kann das verhindern?
-
Ich frage nochmal, ist es möglich auf die TAB-Taste in der Konsole zu reagieren oder funktioniert es nur mit WIN32 Anwendungen oder irre ich mich da?
Bitte um Hilfe!
-
Das geht schon. Nur nicht mit getline in der Form wie Du es machst. Denn Tab ist ein whitespace Zeichen und wird gesondert von cin behandelt!
-
Also wie müsste ich vorgehen, gib mir paar tipps denn ich weiß nicht wie ich anfangen soll
In Java kann man auf spezielle Key-Events warten und reagieren wie sieht das hier aus?
-
PeekConsoleInput / ReadConsoleInput
-
Oder _getch!
-
Hab mir folgendes zusammengebastelt:
#include <windows.h> #include <iostream> using namespace std; HANDLE StdIn = GetStdHandle(STD_INPUT_HANDLE); bool KeyHit() { DWORD NumEvents, NumEventsRead; INPUT_RECORD *InputRecord; DWORD i; GetNumberOfConsoleInputEvents(StdIn, &NumEvents); InputRecord = (INPUT_RECORD *)malloc(sizeof(INPUT_RECORD)*NumEvents); PeekConsoleInput(StdIn, InputRecord, NumEvents, &NumEventsRead); for(i = 0; i < NumEventsRead; i++) { if(InputRecord[i].EventType & KEY_EVENT && InputRecord[i].Event.KeyEvent.bKeyDown) { if(InputRecord[i].Event.KeyEvent.wVirtualKeyCode == VK_TAB) { cout << "TAB" << endl; free(InputRecord); return true; } } } free(InputRecord); return false; } int main() { while(!KeyHit()); }
Ich brauche nur die TAB-Funktion, welche der anderen Funktionen kann ich weglassen?
Was muss man an dem code verändern, dass wenn die TAB n-mal gedrückt wird nicht das Fenster geschlossen wird, also den return-Wert weglassen?
-
Hab noch was bessere gefunden
#include <windows.h> #include <iostream> #include <string> using namespace std; bool Keypress(char &Key) { INPUT_RECORD Event; DWORD NumberOfEvents, EventsRead, EventCounter; GetNumberOfConsoleInputEvents(GetStdHandle(STD_INPUT_HANDLE), &NumberOfEvents); if (NumberOfEvents == 0) return false; for (EventCounter = 0; EventCounter < NumberOfEvents; EventCounter++) { PeekConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &Event, 1, &EventsRead); if ((Event.EventType == KEY_EVENT) && ((Event.Event.KeyEvent.bKeyDown))) { ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &Event, 1, &EventsRead); Key = Event.Event.KeyEvent.wVirtualKeyCode; if (!(FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)))) exit(0); return true; } else ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &Event, 1, &EventsRead); } return false; } int main() { string str; char key = 0; cout << "Eingabe:"; do { getline(cin, str); if (Keypress(key)) { if (key == VK_TAB) cout << "TAB"; if (key == VK_ESCAPE) return 0; } }while(1); return 0; }
Wenn ich in dem Code die getline() Funktion auskommentiere funktioniert die Tab Taste wie gewünscht, d.h. es wird gleich beim Druck auf die Taste reagiert.
Ich habe folgendes Problem wie bekommt man getline() mit der Keypress Funktion zusammen, so dass ich Befehle eingebe aber gleichzeitig geprüft wird ob die TAB Taste gedrückt wird??
Als Hauptgerüst will ich nur ein string ausgeben (TAB), folgendes sollte eingegeben und gedrückt[] werden:
abcd [TAB-TASTE] bla [TAB-TASTE]
So sollte die Ausgabe dann aussehen:
"abcd TAB bla TAB"
Bitte um Hilfe !!
-
Ich bitte euch hilft mir, ich weiß nicht weiter