Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Texteingabe simulieren

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
12.04.2007, 20:37 Uhr
Suba Esel



Naja, der Titel sagt schon alles.
Mein Ansatz bisher:

C++:
#include <iostream>
#include <windows.h>

int main ()
{
    std::string text;
    std::getline(std::cin, text);
    while(1)
    {
        Sleep(5);
        if(GetAsyncKeyState(VK_ESCAPE)) // damit man vorher in ein anderes Fenster wechseln kann
        {
            for (int i=0; i < text.size(); ++i)
            {
                Sleep(100);
                keybd_event (VkKeyScan (text [i]), 0, 0, 0);
                keybd_event (VkKeyScan (text [i]), 0, KEYEVENTF_KEYUP, 0);
            }
            break;
        }
    }
    std::cin.get();
}


Probleme:
-> es werden nur die "Grund"tasten genommen, d.h. bei eingabe von " wird 2 ausgegeben, bei \ ß, usw.
-> wenn ich in der Konsole ESC drücke, wird nach kurzer Zeit der gesamte Text ausgeben - liegt das daran, dass das irgendwie gebuffert wird?
-> VkKeyScan ist lahm - mit dem Sleep(100) ist die Ausgabe des Textes bereits deutlich langsamer als ich tippe

Außerdem hab ich irgendwo gelesen, dass keybd_event veraltet ist. Stimmt das, und was sollte man dann stattdessen nehmen?
--
Simon

Dieser Post wurde am 12.04.2007 um 20:38 Uhr von Suba Esel editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.04.2007, 23:05 Uhr
CppProgrammer



Ich hab vor Ewigkeiten mal diese Funktion hier zusammengeschrieben, vielleicht hilfts dir.


C++:
void TypeString(string str)
{
    unsigned int length = (int)str.length(), i=0;
    for(i=0; i != length; ++i){
        Sleep(1);
        int key, shift, altgr;
        switch(str[i]){
            case'0': { key='0'; shift=0; altgr=0; break; }
            case'1': { key='1'; shift=0; altgr=0; break; }
            case'2': { key='2'; shift=0; altgr=0; break; }
            case'3': { key='3'; shift=0; altgr=0; break; }
            case'4': { key='4'; shift=0; altgr=0; break; }
            case'5': { key='5'; shift=0; altgr=0; break; }
            case'6': { key='6'; shift=0; altgr=0; break; }
            case'7': { key='7'; shift=0; altgr=0; break; }
            case'8': { key='8'; shift=0; altgr=0; break; }
            case'9': { key='9'; shift=0; altgr=0; break; }

            case'a': { key='A'; shift=0; altgr=0; break; }
            case'b': { key='B'; shift=0; altgr=0; break; }
            case'c': { key='C'; shift=0; altgr=0; break; }
            case'd': { key='D'; shift=0; altgr=0; break; }
            case'e': { key='E'; shift=0; altgr=0; break; }
            case'f': { key='F'; shift=0; altgr=0; break; }
            case'g': { key='G'; shift=0; altgr=0; break; }
            case'h': { key='H'; shift=0; altgr=0; break; }
            case'i': { key='I'; shift=0; altgr=0; break; }
            case'j': { key='J'; shift=0; altgr=0; break; }
            case'k': { key='K'; shift=0; altgr=0; break; }
            case'l': { key='L'; shift=0; altgr=0; break; }
            case'm': { key='M'; shift=0; altgr=0; break; }
            case'n': { key='N'; shift=0; altgr=0; break; }
            case'o': { key='O'; shift=0; altgr=0; break; }
            case'p': { key='P'; shift=0; altgr=0; break; }
            case'q': { key='Q'; shift=0; altgr=0; break; }
            case'r': { key='R'; shift=0; altgr=0; break; }
            case's': { key='S'; shift=0; altgr=0; break; }
            case't': { key='T'; shift=0; altgr=0; break; }
            case'u': { key='U'; shift=0; altgr=0; break; }
            case'v': { key='V'; shift=0; altgr=0; break; }
            case'w': { key='W'; shift=0; altgr=0; break; }
            case'x': { key='X'; shift=0; altgr=0; break; }
            case'y': { key='Y'; shift=0; altgr=0; break; }
            case'z': { key='Z'; shift=0; altgr=0; break; }
            case'ß': { key=219; shift=0; altgr=0; break; }
            case'ä': { key=222; shift=0; altgr=0; break; }
            case'ü': { key=186; shift=0; altgr=0; break; }
            case'ö': { key=192; shift=0; altgr=0; break; }
            case'é': { key=221; shift=0; altgr=0; break; }

            case'A': { key='A'; shift=1; altgr=0; break; }
            case'B': { key='B'; shift=1; altgr=0; break; }
            case'C': { key='C'; shift=1; altgr=0; break; }
            case'D': { key='D'; shift=1; altgr=0; break; }
            case'E': { key='E'; shift=1; altgr=0; break; }
            case'F': { key='F'; shift=1; altgr=0; break; }
            case'G': { key='G'; shift=1; altgr=0; break; }
            case'H': { key='H'; shift=1; altgr=0; break; }
            case'I': { key='I'; shift=1; altgr=0; break; }
            case'J': { key='J'; shift=1; altgr=0; break; }
            case'K': { key='K'; shift=1; altgr=0; break; }
            case'L': { key='L'; shift=1; altgr=0; break; }
            case'M': { key='M'; shift=1; altgr=0; break; }
            case'N': { key='N'; shift=1; altgr=0; break; }
            case'O': { key='O'; shift=1; altgr=0; break; }
            case'P': { key='P'; shift=1; altgr=0; break; }
            case'Q': { key='Q'; shift=1; altgr=0; break; }
            case'R': { key='R'; shift=1; altgr=0; break; }
            case'S': { key='S'; shift=1; altgr=0; break; }
            case'T': { key='T'; shift=1; altgr=0; break; }
            case'U': { key='U'; shift=1; altgr=0; break; }
            case'V': { key='V'; shift=1; altgr=0; break; }
            case'W': { key='W'; shift=1; altgr=0; break; }
            case'X': { key='X'; shift=1; altgr=0; break; }
            case'Y': { key='Y'; shift=1; altgr=0; break; }
            case'Z': { key='Z'; shift=1; altgr=0; break; }
            case'?': { key=219; shift=1; altgr=0; break; }
            case'Ä': { key=222; shift=1; altgr=0; break; }
            case'Ü': { key=186; shift=1; altgr=0; break; }
            case'Ö': { key=192; shift=1; altgr=0; break; }
            case'µ': { key='M'; shift=0; altgr=1;break; }

            case'=': { key='0'; shift=1; altgr=0; break; }
            case'!': { key='1'; shift=1; altgr=0; break; }
            case'"': { key='2'; shift=1; altgr=0; break; }
            case'§': { key='3'; shift=1; altgr=0; break; }
            case'$': { key='4'; shift=1; altgr=0; break; }
            case'%': { key='5'; shift=1; altgr=0; break; }
            case'&': { key='6'; shift=1; altgr=0; break; }
            case'/': { key='7'; shift=1; altgr=0; break; }
            case'(': { key='8'; shift=1; altgr=0; break; }
            case')': { key='9'; shift=1; altgr=0; break; }

            case'+': { key=187; shift=0; altgr=0; break; }
            case'-': { key=189; shift=0; altgr=0; break; }
            case'.': { key=190; shift=0; altgr=0; break; }
            case',': { key=188; shift=0; altgr=0; break; }
            case'#': { key=191; shift=0; altgr=0; break; }

            case'*': { key=187; shift=1; altgr=0; break; }
            case'_': { key=189; shift=1; altgr=0; break; }
            case':': { key=190; shift=1; altgr=0; break; }
            case';': { key=188; shift=1; altgr=0; break; }
            case'\'': { key=191; shift=1; altgr=0; break; }
            case'´': { key=221; shift=1; altgr=0; break; }
            case'~': { key=191; shift=1; altgr=1; break; }

            case'}': { key='0'; shift=0; altgr=1; break; }
            case'²': { key='2'; shift=0; altgr=1; break; }
            case'³': { key='3'; shift=0; altgr=1; break; }
            case'{': { key='7'; shift=0; altgr=1; break; }
            case'[': { key='8'; shift=0; altgr=1; break; }
            case']': { key='9'; shift=0; altgr=1; break; }
            case'\\': { key=219; shift=0; altgr=1; break; }
            case' ': { key=' '; shift=0; altgr=0; break; }

            case'^': { key=220; shift=0; altgr=0; break; }
            case'°': { key=220; shift=1; altgr=0; break; }
            case'<': { key=226; shift=0; altgr=0; break; }
            case'>': { key=226; shift=1; altgr=0; break; }
            case'|': { key=226; shift=0; altgr=1; break; }
            case'\n': { key=VK_RETURN; shift=0; altgr=0; break; }

            case '@': { key='Q'; shift=0; altgr=1; break; }
        }

        if(altgr == 1) keybd_event(VK_RMENU, 0, 0, NULL);
        if(shift == 1) keybd_event(VK_SHIFT, 0, 0, NULL);
        keybd_event(key, 0, 0, NULL);
        keybd_event(key, 0, KEYEVENTF_KEYUP, 0);
        if(shift == 1) keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
        if(altgr == 1) keybd_event(VK_RMENU, 0, KEYEVENTF_KEYUP, 0);
    }
}


Dieser Post wurde am 12.04.2007 um 23:17 Uhr von CppProgrammer editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.04.2007, 14:05 Uhr
Suba Esel



Hey, herzlichen Dank, das ist total praktisch! Allerdings kann man z.b. bei den Buchstaben noch abkürzen:

C++:
default:
if(str[i] >= 65 && str[i] <=90)
{
key = str[i];
shift = 1;
altgr = 0;
}

if(str[i] >= 97 && str[i] <= 122)
{
key = str[i];
shift = 0;
altgr = 0;
}



Das kann man natürlich auch noch mit Zahlen usw. machen.

Aber auch dieses Programm ist irgendwie langsam: ich glaube nicht, dass ich mehr als 4 Zeichen pro Sekunde tippe, aber wenn ich ein Sleep(250) reinbaue, ist das viel langsamer.
--
Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.04.2007, 15:21 Uhr
CppProgrammer



Ja ich weiß, ist sicherlich noch um einiges optimierbar. Ich hab mich damals aber nicht weiter damit beschäftig, also ist das ganze mehr oder weniger unter gegangen bis ichs jetzt wieder hervorgekramt hab. Was dein Problem mit der Geschwindigkeit angeht, fällt mir momentan auch nichts ein wie mans schneller machen könnte.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.04.2007, 14:33 Uhr
öni



Zitat:

C++:
case'\'': { key=191; shift=1; altgr=0; break; }


sollte das nicht


C++:
case'\': { key=191; shift=1; altgr=0; break; }

heisen also wegen dem Strichlein beim case?

Dieser Post wurde am 14.04.2007 um 14:35 Uhr von öni editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.04.2007, 15:52 Uhr
CppProgrammer



"\'" steht für genau dieses kleine Strichlein (den Apostroph).
Solche besondere Zeichen müssen innerhalb von Zeichenketten immer als Escape-Sequenzen angegeben werden. Daher stimmt das schon so, wie's ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.04.2007, 17:08 Uhr
Suba Esel



Offenbar sind da noch einige Fehler:

Code:
Eingabe: !"§$%&/()=?´`^°+*~#'-_.:,;<>|@äöüßÄÖÜ
Ausgabe: !""$%&/()=???^^+*#'-_.:,;<>|@@@@@@@@


Wie kommst du eigentlich zum Beispiel bei den Umlauten auf die Werte? Sie funktionieren nämlich nicht, allerdings bringt es auch nichts, ASCII - Werte einzusetzen, das klappt auch nicht.

EDIT:
Interessanterweise funktioniert das noch nicht mal, wenn ich statt dem Programm oben VkKeyScan nehme. Dann ist die Ausgabe so:

Code:
124567890ß´^+++##--..,,<<<q


--
Simon

Dieser Post wurde am 14.04.2007 um 17:14 Uhr von Suba Esel editiert.
 
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: