Umlaute senden



  • Hallo!

    Ich habe gestern begonnen ein kleines Programm zu schreiben um auch auf einer englischen Tastatur (z.B. meiner) Umlaute leicht schreiben au koennen ohne die Tastenbelegung zu aendern. Es faengt alle Tastatureingaben ab und schreibt sie in einen Buffer, wenn z.B. a und e zusammenkommen soll es zwei mal Backspace senden und danach den entsprechenden Umlaut. Hier ist der Code:

    #include "stdafx.h"
    
    #include <windows.h>
    #include <stdio.h>
    #include <winuser.h>
    #include <windowsx.h>
    #include <locale>
    
    using namespace std;
    
    void get_keys();				/*checks for pressed keys*/
    void set_buffer(char input);	/*places the keystrokes in the buffer*/
    void set_key(char key);			/*outputs characters*/
    void evaluate_buffer();			/*evaluates the buffer's contents and calls the output function if necessarry*/
    
    char buf1, buf2; /*the buffer variables*/
    bool enabled = true, shift = false, caps = false;
    locale loc ("German_Austria");
    
    void main(void)
    {
    	HWND stealth; /*creating a stealth window*/
    	AllocConsole();
    	stealth = FindWindowA("ConsoleWindowClass", NULL);
    	ShowWindow(stealth, 0);
    
    	get_keys();
    }
    
    void get_keys()
    {
    	short character;
    	while(enabled)
    	{
    		Sleep(10); /*prevents 100% cpu usage*/
    
    		/*checks for pressed keys*/
            for(character = 8; character <= 222; character++)
    		{
    			if (GetAsyncKeyState(character) == -32767)
    			{
    				if((character>=39)&&(character<=64)) {
    					set_buffer(character);
    				}
    				else if((character>64)&&(character<91)) {
    					character += 32;
    					set_buffer(character);
    				}
    				else if(character == VK_SHIFT)
    					shift = true;
    				else if(character == VK_CAPITAL) {
    					if(caps)
    						caps = false;
    					else caps = true;
    				}
    			}
    		}
    	}
    }
    
    void set_buffer(char input)
    {
    	if(shift || caps) {
    		input = toupper(input, loc); /*converts the letter to uppercase if necessarry*/
    		shift = false;
    	}
    	buf2 = buf1;
    	buf1 = input;
    
    	evaluate_buffer(); /*checks if an output is necessarry*/
    }
    
    /*evaluates the buffer's contents and calls the output function if necessarry*/
    void evaluate_buffer() 
    {
    	switch(buf1)
    	{
    	case 'e':
    		switch(buf2)
    		{
    		case 'a':
    			set_key('ä');
    		break;
    		case 'A':
    			set_key('Ä');
    		break;
    		case 'o':
    			set_key('ö');
    		break;
    		case 'O':
    			set_key('Ö');
    		break;
    		case 'u':
    			set_key('ü');
    		break;
    		case 'U':
    			set_key('Ü');
    		break;
    		}
    	case 'E':
    		switch(buf2)
    		{
    		case 'a':
    			set_key('Ä');
    		break;
    		case 'A':
    			set_key('Ä');
    		break;
    		case 'o':
    			set_key('Ö');
    		break;
    		case 'O':
    			set_key('Ö');
    		break;
    		case 'u':
    			set_key('Ü');
    		break;
    		case 'U':
    			set_key('Ü');
    		break;
    		}
    	}
    	if((buf2 == 's') && (buf1 == 'z'))
    		set_key('ß');
    }
    
    void set_key(char key)
    {
    	keybd_event(VK_BACK, 0, KEYEVENTF_EXTENDEDKEY, 0);
    	keybd_event(VK_BACK, 0, KEYEVENTF_KEYUP, 0);
    	if(caps) {
    		keybd_event(VK_BACK, 0, KEYEVENTF_EXTENDEDKEY, 0);
    		keybd_event(VK_BACK, 0, KEYEVENTF_KEYUP, 0);
    	}
    	//TODO find a function to simulate umlaute
    }
    

    Es funktioniert alles, bis auf das Senden der Umlaute. In der MSDN Library habe ich nur Funktionen zum simulieren von Tastaturschlaegen (z.B. keybd_event()) gefunden, die aber in meinem Fall nicht funktionieren, da es ja bei einer englischen Tastatur keine Umlaute gibt. Irgendwie stecke ich fest - hat vielleicht jemand eine Idee wie ich diese Umlaute senden koennte?

    Danke schon mal im Voraus!



  • Sleep(10); /*prevents 100% cpu usage*/

    Willst du nicht lieber einen Hook verwenden?



  • Hook ist die Lösung, schau mal HIER
    Mußt du dir dann entsprechend umschreiben.

    Nochwas, du wandelst zu einem "ß" wenn sz vorhanden, mein Nachname beginnt mit sz (und nicht mit ß 😉 und der des alten Kommissar aus Tatort auch. So wie einige viele und weit verbreitete Namen beginnen mit Sz...



  • Danke fuer die Antworten, aber die Sache mit dem Hook ist nicht ganz die Loesung. Sie kann mein Programm zwar etwas optimieren, aber sie hilft mir immer noch nicht beim Senden der Umlaute. Ich brauche eine Funktion, mit der ich direkt in den Keyboard buffer schreiben kann.

    Uebrigens:

    MiC++ha schrieb:

    Nochwas, du wandelst zu einem "ß" wenn sz vorhanden, mein Nachname beginnt mit sz (und nicht mit ß 😉 und der des alten Kommissar aus Tatort auch. So wie einige viele und weit verbreitete Namen beginnen mit Sz...

    Stimmt die Sache muss ich noch beruecksichtigen, in meinem Nachnahmen findet sich auch ein sz. 🙂


Anmelden zum Antworten