Textzeile als Tastendrücke simulieren



  • Ich habe sowas wie "Good Luck and Have Fun", dass ich als Tastendrücke simulieren will.
    Ich möchte NICHT den Zwischenspeicher nutzen á la Strg+C.
    Aber anders bekomme ich Probleme bei bestimmten Zeichen.

    Ich dachte erst an sowas:

    int GetKey(char Key, bool Shift)
    {
    	if ((int(Key) =< 0x5A && int(Key) >= 0x41) && shift)
    	{
    		return int(Key);
    	}
    	else if ((int(Key) <= 0x5A && int(Key) >= 0x41) && !shift)
    	{
    		return (int(Key) + 32));
    	}
    	else if ((int(Key) <= 0x39 && int(Key) >= 0x30) && !shift)
    	{
    		return (int(Key));
    	}
    	else if (Key == '!' && shift)
    		return 33;
            //...
    }
    

    Aber es gibt 2 Probleme:

    1. Ich muss ja noch klären ob shift gebraucht wird. Also zum Beispiel bei Großbuchstaben.

    2. Es kommt extremer Nonesense raus:
    (in notepad)

    5
    815 6, 7//4 3+

    815 6, 7//4 3+
    6****7
    -9 2/17:21 30.09.201017:21 30.09.2010/-
    8
    -9 -94 1,5
    9
    -9 17:21 30.09.2010/ 1,5

    Reale Tastendrücke sind Fett makiert.
    Auffällig: das Datum und das Hilfe Fenster, dass bei 9 auftaucht 😃
    oder die Uhrzeit.
    Eigentlich soll das etwa so aussehen:

    zahl 7

    MISS BOTTOM LANE

    if (String(Key) == "8 (ZEHNERTASTATUR)")
        {
            if (CheckBox8->Checked)
            {
                keybd_event(VK_RETURN, 0, 0, 0);
                keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
            }
            int i = 0;
            for (i = 0; i < Edit8->Text.Length(); i++)
            {
                keybd_event((double)GetKey(Edit8->Text[i+1],false), 0, 0, 0);
                keybd_event((double)GetKey(Edit8->Text[i+1],false), 0, KEYEVENTF_KEYUP, 0);
            }
            if (CheckBox8->Checked)
            {
                keybd_event(VK_RETURN, 0, 0, 0);
                keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
            }
        }
    

    Ich benutze den Systemweiten Keyhook.

    Ich brauche nun Denkanstöße und Vorschläge wie ichs besser machen kann,
    und / oder korrigiert mein code, denn was ich rausbekomme ist mehr als nur strange.



  • ich weiß nicht ob ich dich richtig verstanden habe, aber das funktioniert bei mir:

    String text = "Das ist ein Test mit 1er Zahl";
    for(int i = 1; i <= text.Length(); i++)
    {
        char c = text[i];
    
        bool shift = true;
        if(c > 0x60) //Kleinbuchstaben
        {
            shift = false;
            c -= 0x20;
        }
        else if(c < 0x40) //Zahlen
            shift = false;
    
        if(shift)
            keybd_event(VK_SHIFT, 0, 0, 0);
        keybd_event(c, 0, 0, 0);
        keybd_event(c, 0, KEYEVENTF_KEYUP, 0);
        if(shift)
            keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
    }
    

    greetz KN4CK3R



  • Ich hab das ganze etwas abgeändert, aber funktioniert Prima, ich brauche eben noch ein minimum an sonderzeichen dazu:

    for (i = 0; i < Edits[EdiNum]->Text.Length(); i++)
            {
                bool shift = true;
                char c = (Edits[EdiNum]->Text[i+1]);
                if(c > 0x60 && c < 0x7B) //Kleinbuchstaben
                {
                    shift = false;
                    c -= 0x20;
                }
                else if(c < 0x40 && c > 0x30) //Zahlen
                    shift = false;
    
                int ResolutionKey = c;
                switch ((int)Edits[EdiNum]->Text[i+1])
                {
                    case(33):
                    {
                        ResolutionKey = 49;
                        shift = true;
                        break;
                    } //...
                 }
                 if(shift)
    			keybd_event(VK_SHIFT, 0, 0, 0);
                 keybd_event(ResolutionKey, 0, 0, 0);
    		keybd_event(ResolutionKey, 0, KEYEVENTF_KEYUP, 0);
    		if(shift)
    			keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
    

    EDIT: Die Formatierung ist flöten gegangen, ich hoffe das stört nicht



  • rein theoretisch kannste dir auch ein chararray (string) anlegen, in dem zu allen ASCII zeichen von 0 - 255 die entsprechenden Keycodes stehen. Dann kannst du das ganze noch ein wenig einfacher machen. Dazu noch ein bool array ob shift oder kein shift eventuell.

    int c = (int)text[i];
    
    if(shiftarray[c])
       keybd_event(VK_SHIFT, 0, 0, 0);
    keybd_event(keycodearray[c], 0, 0, 0);
    keybd_event(keycodearray[c], 0, KEYEVENTF_KEYUP, 0);
    if(shiftarray[c])
       keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
    

    Wenn man ein wenig rumtrickst, kann man sich die beiden Arrays vom Programm anlegen lassen, ansonsten einfach von Hand erstellen.

    greetz KN4CK3R



  • Noch was: Wie kann ich denn die abgefangene Taste "rausnehmen"
    Praktisch die Taste abfangen und aussortieren, sonst wird das sowas:
    5TEXT oder 6ANDERERTEXT
    ...Überhaupt möglich ?



  • Mir kam so Backspace grad in den Sinn


Anmelden zum Antworten