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^^):

    http://www.abload.de/img/vcssb9kgx.png



  • 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?


Anmelden zum Antworten