Unicode und die Konsole
-
Guten Abend,
ich habe die folgende Funktion zur Eingabe von wstrings erstellt:
void WriteInput(wstring input){ wstring s; s.resize(2*input.size()); long j=0; for(unsigned long i=0;i<s.size();i+=2){ s[i]=input[j]; s[i+1]='_'; j++; } static HANDLE hConIn = GetStdHandle(STD_INPUT_HANDLE); INPUT_RECORD *ir; ir=new INPUT_RECORD[s.size()]; DWORD n=0; for(unsigned long i=0; i<s.size(); i+=2){ ir[i].EventType = KEY_EVENT; ir[i].Event.KeyEvent.bKeyDown = true; ir[i].Event.KeyEvent.dwControlKeyState = 0; ir[i].Event.KeyEvent.uChar.UnicodeChar = s[i]; ir[i].Event.KeyEvent.wRepeatCount = 1; ir[i].Event.KeyEvent.wVirtualKeyCode = MapVirtualKeyW(s[i], MAPVK_VK_TO_VSC); ir[i].Event.KeyEvent.wVirtualScanCode = MapVirtualKeyW(s[i], MAPVK_VK_TO_VSC); ir[i+1].EventType = KEY_EVENT; ir[i+1].Event.KeyEvent.bKeyDown = false; ir[i+1].Event.KeyEvent.dwControlKeyState = 0; ir[i+1].Event.KeyEvent.uChar.UnicodeChar = s[i]; ir[i+1].Event.KeyEvent.wRepeatCount = 1; ir[i+1].Event.KeyEvent.wVirtualKeyCode = MapVirtualKeyW(s[i], MAPVK_VK_TO_VSC); ir[i+1].Event.KeyEvent.wVirtualScanCode = MapVirtualKeyW(s[i], MAPVK_VK_TO_VSC); } WriteConsoleInput(hConIn,&ir[0],s.size(),&n); }
Diese soll in einem einfachen Texteditor verwendet werden. Aufgerufen mit
wstring test=L"abc 123 äöü"; while(true){ wcout << L"test enthält:" << test << endl; WriteInput(test); getline(wcin, test); }
erhalte ich folgende Ausgabe:
http://www.abload.de/img/vcss6nog9.png
Was genau nun jeweils im wstring steht und in der Konsole angezeigt wird, ist mir ein Rätsel. Weiß jemand genaueres?^^
lg
-
Eventuell würde es helfen die Ausgabe auf deutsch umzustellen ?
setlocale(LC_ALL, "German");
-
Ein wenig scheint es zu helfen, jetzt dürfte noch ein Fehler in meinem Code sein (außer dass ich vergaß, den Speicher wieder freizugeben^^):
-
Weiß keiner eine Lösung? Ich bau das jetzt einfach auf Ascii um und verbiete die Eingabe von Umlauten.
-
Falls jemand etwas in der Art braucht, poste ich mal die fertige Version für Ascii-Zeichen:
void WriteInput(string input, bool zurueck){ string s; s.resize(2*input.size()); long j=0; for(unsigned long i=0;i<s.size();i+=2){ s[i]=input[j]; s[i+1]='_'; ++j; } static HANDLE hConIn = GetStdHandle(STD_INPUT_HANDLE); INPUT_RECORD *ir; ir=new INPUT_RECORD[s.size()]; DWORD n=0; for(unsigned long i=0; i<s.size(); i+=2){ ir[i].EventType = KEY_EVENT; ir[i].Event.KeyEvent.bKeyDown = true; ir[i].Event.KeyEvent.dwControlKeyState = 0; ir[i].Event.KeyEvent.uChar.UnicodeChar = s[i]; ir[i].Event.KeyEvent.wRepeatCount = 1; //ir[i].Event.KeyEvent.wVirtualKeyCode //ir[i].Event.KeyEvent.wVirtualScanCode ir[i+1].EventType = KEY_EVENT; ir[i+1].Event.KeyEvent.bKeyDown = false; ir[i+1].Event.KeyEvent.dwControlKeyState = 0; ir[i+1].Event.KeyEvent.uChar.UnicodeChar = s[i]; ir[i+1].Event.KeyEvent.wRepeatCount = 1; //ir[i+1].Event.KeyEvent.wVirtualKeyCode //ir[i+1].Event.KeyEvent.wVirtualScanCode } WriteConsoleInputW(hConIn,&ir[0],s.size(),&n); if(zurueck==true){ for(unsigned long i=0; i<s.size(); i+=2){ ir[i].EventType = KEY_EVENT; ir[i].Event.KeyEvent.bKeyDown = true; ir[i].Event.KeyEvent.dwControlKeyState = 0; //ir[i].Event.KeyEvent.uChar.UnicodeChar ir[i].Event.KeyEvent.wRepeatCount = 1; ir[i].Event.KeyEvent.wVirtualKeyCode=VK_LEFT; //ir[i].Event.KeyEvent.wVirtualScanCode ir[i+1].EventType = KEY_EVENT; ir[i+1].Event.KeyEvent.bKeyDown = false; ir[i+1].Event.KeyEvent.dwControlKeyState = 0; //ir[i+1].Event.KeyEvent.uChar.UnicodeChar ir[i+1].Event.KeyEvent.wRepeatCount = 1; ir[i+1].Event.KeyEvent.wVirtualKeyCode=VK_LEFT; //ir[i+1].Event.KeyEvent.wVirtualScanCode } WriteConsoleInputW(hConIn,&ir[0],s.size(),&n); } delete []ir; }
Wird diese z.B. mit WriteInput(".txt", true); aufgerufen, wandert der Cursor (sofern Console im richtigen Modus) zum Beginn der Zeile zurück, und der Nutzer kann den Dateinamen eingeben.
Könnte man da vielleicht noch was verbessern?