Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Umlaute senden

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.10.2004, 12:16 Uhr
~tommazzo
Gast


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:

C++:
#include "stdafx.h"

#include <windows.h>
#include <stdio.h>
#include <winuser.h>
#include <windowsx.h>
#include <locale>

#define DEBUG

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('ß');

/*makes sure the program can be exited easily if in debug mode*/
#ifdef DEBUG
    if((buf2 == 'e') && (buf1 == 'x'))
        enabled = false;
#endif
}

void set_key(char key)
{
    keybd_event(VK_BACK, 0, KEYEVENTF_EXTENDEDKEY, 0);
    if(caps || key == 'ß') {
        keybd_event(VK_BACK, 0, KEYEVENTF_EXTENDEDKEY, 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!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.10.2004, 13:39 Uhr
Airdamn



ein Schelm wer böses denkt...
Dieser Post wurde am 18.10.2004 um 13:42 Uhr von Airdamn editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.10.2004, 14:26 Uhr
(un)wissender
Niveauwart



C++:

void set_key(char key)
{
    keybd_event(VK_BACK, 0, KEYEVENTF_EXTENDEDKEY, 0);
    if(caps || key == 'ß') {
        keybd_event(VK_BACK, 0, KEYEVENTF_EXTENDEDKEY, 0);
    }
    //TODO find a function to simulate umlaute
}




Also ich würde den key auch Windows übergeben, ansonsten kommt halt nichts.
Du machst auf zweimal das gleiche, ob if oder nicht, soll das so?
keybd_event(VK_BACK, key, KEYEVENTF_EXTENDEDKEY, 0); so soll es vermutlich aussehen.
Auch wenn MS sagt, dass der zweite Paramter nicht genutzt wird, so kann das eigentlich nicht sein.
In ihrem Bsp. nutzen die den auch.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.10.2004, 17:23 Uhr
~tommazzo
Gast



Zitat von (un)wissender:
Also ich würde den key auch Windows übergeben, ansonsten kommt halt nichts.

Das Problem ist, dass ich ueber keybd_event() nur VirtualKey Codes, die dem derzeit gewaehlten Tastaturschema entsprechen, uebergeben kann. Da meine Tastatur auf US steht kann ich das vergessen.


Zitat von (un)wissender:
Du machst auf zweimal das gleiche, ob if oder nicht, soll das so?

Ja das ist schon so richtig, weil ich naemlich komischerweise bei der Tastenkombination sz Backspace noch einmal senden muss.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: