tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
946
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    giggei giggei ist offline Rookie
    Registriert seit
    May 2007
    Beiträge
    8
    Hi Leute,

    hab folgendes Problem und auch nach ewigem Suchen noch keine Lösung gefunden:

    Ich muss ein Programm Coden, das alle Keycodes mitloggt und dann speichert.
    Nun habe ich aber das Problem das die Methode keyPressed des KeyListeners ständig aufgerufen wird wenn ich länger auf einer Taste bleibe (z.B. Shift wenn ein ganzes Wort groß geschrieben wird).

    Ich will aber natürlich jede Taste bei einmaligem drücken (auch wenns länger dauert) nur einmal loggen,
    gibts ne Möglichkeit das zu realisieren?

    Hätt schon versucht einen boolean einzubauen der erst beim keyReleased Event wieder true wird, aber dann loggt er nicht richtig wenn Tasten gleichzeitig gedrückt werden (z.b. wieder beim groß schreiben mit shift)....

    Und eine weitere Frage hätt ich noch:

    Gibts eine Möglichkeit linke und rechte Shift taste zu unterscheiden? Denn beide liefern den Keycode 16.

    gruss gig
     

  2. #2
    yan1 yan1 ist offline Mitglied Gold
    Registriert seit
    Feb 2005
    Ort
    Kirchdorf a. d. Krems, OÖ
    Beiträge
    213
    Hi,

    ich hab versucht dein Problem auszuprogrammieren, ich hoffe du hast es so gemeint.

    Meine Lösung war, dass ich einfach jede Taste speichert bis sie losgelassen wird. Somit ist sichergestellt, dass sie nur einmal geloggt wird, egal wie oft und lange sie gedrückt wird.

    Hier der Code:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Calendar;
     
    /**
     * Loggt die eingaben einer Tastatur mit Hilfe des AWT Listeners java.awt.KeyListener .
     * Der Logger ist im Stande auf jeden beliebigen Stream zu loggen (Standardausgabe, Datei, TCP-Stream etc.)
     * @author Yanick Dickbauer
     */
    public class KeyLogger implements KeyListener {
        
        /** Hier kommen die Keys rein die gedrückt wurden, jedoch noch nicht losgelassen wurden */
        private ArrayList<Key> keys;
        
        /** Die ganzen Streams in die geloggt werden soll */
        private ArrayList<PrintWriter> streams;
        
        public KeyLogger(){
            init();
            streams.add(new PrintWriter(System.out));
        }
        
        public KeyLogger(OutputStream ... streams){
            init();
            for (OutputStream os : streams)
                this.streams.add(new PrintWriter(os));
        }
        
        private void init(){
            keys = new ArrayList<Key>();
            streams = new ArrayList<PrintWriter>();
        }
     
        public void keyPressed(KeyEvent ev) {
            Key pressed = new Key(ev.getKeyChar(), ev.getKeyCode(), ev.getKeyLocation());
            if (!keys.contains(pressed)){
                keys.add(pressed);
                logKey(pressed);
            }
                
        }
     
        public void keyReleased(KeyEvent ev) {
            Key released = new Key(ev.getKeyChar(), ev.getKeyCode(), ev.getKeyLocation());
            keys.remove(released);
        }
     
        public void keyTyped(KeyEvent ev) {
        }
        
        public void logKey(Key key){
            Calendar now = Calendar.getInstance();
            SimpleDateFormat formatter = new SimpleDateFormat("E yy-MM-dd 'on' HH:mm:ss zzz");
            String logText = String.format("%s \t%s", formatter.format(now.getTime()), key);
            for (PrintWriter writer : streams){
                writer.println(logText);
                writer.flush();
            }
        }
        
        class Key{
            char c;
            int code, location;
            
            private String keyString;
            
            Key(char c, int code, int location){
                this.c = c;
                this.code = code;
                this.location = location;
                getKeyString();
            }
            
            private void getKeyString(){
                if (Character.isLetterOrDigit(code)){
                    keyString = String.valueOf(c);
                    return;
                }
                    
                switch (code){
                case 27:
                    keyString = "ESC"; return;
                case 10:
                    keyString = "ENTER"; return;
                case 32:
                    keyString = "SPACE"; return;
                case 16:
                    keyString = "SHIFT"; return;
                }
                keyString = String.valueOf(code);   
            }
            
            public String toString(){
                return String.format("Key: '%s', Code: %d, Location: %d", keyString, code, location);
            }
            
            /**
             * Zwei Keys sind dann gleich, wenn Code und Location übereinstimmen
             */
            public boolean equals(Object two){
                if (! (two instanceof Key)) return false;
                
                Key keyTwo = (Key)two;
                if (keyTwo.code == code && keyTwo.location == location)
                    return true;
                
                return false;
            }
        }
     
    }


    Lg, Yanick
     

  3. #3
    giggei giggei ist offline Rookie
    Registriert seit
    May 2007
    Beiträge
    8
    Vielen Dank für die spitzen Antwort.

    Also die idee mit der liste is genial, hab ich so ähnlich umgesetzt.
    vielen dank jetzt klappt alles!

    gruss gig
     

Ähnliche Themen

  1. KeyPressed() reagiert nicht
    Von Masterpurzel im Forum Java
    Antworten: 2
    Letzter Beitrag: 19.01.11, 09:16
  2. eventhandling: keypressed und keyreleased?
    Von thangs_wify im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 17.01.08, 20:33
  3. Wiederholtes Massen-Drucken
    Von Leugim im Forum Office-Anwendungen
    Antworten: 6
    Letzter Beitrag: 18.01.07, 05:13
  4. WORD: Aufrufen der zweiten Seite verhindern
    Von wugdcg im Forum Visual Basic 6.0
    Antworten: 0
    Letzter Beitrag: 24.06.05, 15:21
  5. Wiederholtes Senden vermeiden
    Von schleckerbeck im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 07.11.04, 15:49