Umlaute senden

Dieses Thema im Forum "Programmieren" wurde erstellt von tommazzo, 7. Oktober 2004.

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. tommazzo

    tommazzo Byte

    Registriert seit:
    24. August 2004
    Beiträge:
    27
    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!
     
Status des Themas:
Es sind keine weiteren Antworten möglich.

Diese Seite empfehlen