1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Umlaute senden

Discussion in 'Programmieren' started by tommazzo, Oct 7, 2004.

Thread Status:
Not open for further replies.
  1. tommazzo

    tommazzo Byte

    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:
    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!
     
Thread Status:
Not open for further replies.

Share This Page