2009-07-09 8 views
3

Ich schreibe einen Code, um Strings mit der Robot-Klasse zu schreiben. Alles ist größtenteils gut (gut, ich muss eine große switch-Anweisung verwenden, um Zeichenschlüsselcodes zu erhalten), außer einige Schlüssel haben keine Schlüsselcodes, weil sie tatsächlich eine Kombination von Shift + einige andere Schlüssel sind. Für Großbuchstaben ist es einfach zu überprüfen, mit Character.isUpperCase(c), aber für alle Symbole wie [email protected]#$%^&*()_+ und verschiedene Interpunktion sind nicht als "Großbuchstaben", obwohl sie Verschiebung gedrückt werden müssen, um ihre Tastenanschlag zu generieren. Ich habe versucht, dafür zu googeln, aber ich habe gerade einen Forum Post ohne zufriedenstellende Antworten gefunden. Gibt es eine Möglichkeit zu bestimmen, ob ein Zeichen eine Verschiebung benötigt, um gedrückt zu werden, und wenn ja, welches Zeichen ist die "nicht verschobene" Version?Wie bestimmen Sie, ob ein Zeichen erfordert, dass die Umschalttaste gedrückt wird, um eingegeben zu werden?

EDIT: Hier ist der Code, den ich bisher habe.

public void GenerateKeyTyped(char c) { 
    if (Character.isUpperCase(c)) { 
     r.keyPress(KeyEvent.VK_SHIFT); 
    } 
    r.keyPress(GetKeyCode(c)); 
    r.keyRelease(GetKeyCode(c)); 
    if (Character.isUpperCase(c)) { 
     r.keyRelease(KeyEvent.VK_SHIFT); 
    } 
} 
+0

Können Sie etwas Code posten (nachdem Sie die vermutlich ginormous 'switch' Anweisung getrimmt haben)? Es gibt wahrscheinlich einen besseren Weg, um das zu tun, was Sie tun wollen, ohne eine Menge Code zu benötigen. Java weiß, wie man Schlüsselcodes in ASCII-Zeichen umwandelt; Es kann sehr wahrscheinlich schon tun, was Sie wollen. –

+0

Hier ist der Code, den ich bisher habe, offensichtlich tut es gerade jetzt nicht, was ich will. \t public void GenerateKeyTyped (char c) { \t \t if (Character.isUpperCase (c)) { \t \t \t r.keyPress (KeyEvent.VK_SHIFT); \t \t} \t \t r.keyPress (GetKeyCode (c)); \t \t r.keyRelease (GetKeyCode (c)); \t \t if (Character.isUpperCase (c)) { \t \t \t r.keyRelease (KeyEvent.VK_SHIFT); \t} \t} r ist ein Roboter, und GetKeyCode (char c) ist die ginormous Switch-Anweisung. Was ich eigentlich versuche, ist die Implementierung einer API für die Tastatursteuerung, die in Pascal geschrieben wurde. Der GetKeyCode wird direkt durch Kopieren der Werte des GetKeyCodes der API direkt übernommen. –

+0

Ahh, die Formatierung ist schlecht, also habe ich sie zum ursprünglichen Beitrag hinzugefügt. –

Antwort

1

Ich kenne keinen Weg, um Ihr Problem direkt zu lösen (I endete nur eine Karte für diese Zeichen bis verwenden), aber es könnte Ihnen einige Ideen:

import java.io.*; 
import java.util.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Main3 { 

    public static void main(String[] args) { 
     try { 
      Robot robot = new Robot(); 

      HashMap<String, String> map = new HashMap<String, String>(); 
      map.put("!", "1"); 
      map.put("@", "2"); 
      map.put("#", "3"); 

      char[] charz = "abcdefgABCDEFG123!#".toCharArray(); 

      for(int i = 0; i < charz.length; i++) 
      { 
       System.out.print(charz[i] + " : "); 
       boolean shiftRequired = false; 
       String key = String.valueOf(charz[i]); 
       String value = map.get(key); 

       if (value != null) 
       { 
        shiftRequired = true; 
        key = value; 
       } 
       else if (Character.isUpperCase(key.charAt(0))) 
       { 
        shiftRequired = true; 
       } 
       else 
       { 
        key = key.toUpperCase(); 
       } 

       KeyStroke ks = KeyStroke.getKeyStroke("pressed " + key.toUpperCase()); 

       int keyCode = ks.getKeyCode(); 
       System.out.println(keyCode); 

       if (shiftRequired) 
        robot.keyPress(java.awt.event.KeyEvent.VK_SHIFT); 

       robot.keyPress(keyCode); 
       robot.keyRelease(keyCode); 

       if (shiftRequired) 
        robot.keyRelease(java.awt.event.KeyEvent.VK_SHIFT); 
      } 


     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Ich habe eine ähnliche Sache gemacht, mit zwei Arrays anstelle einer HashMap. –

0

Wenn Sie die ASCII table diese Symboltasten zu buchen, sind im Bereich befindet 0x21 - 0x2B
Sie können sich wahrscheinlich in der ASCII-Tabelle sucht alle anderen Symbole zu erkennen.

+0

Ja, ich könnte eine andere große switch-Anweisung machen, aber ich habe mich gefragt, ob es eine API dafür gibt. –

1

Ich bin mir nicht sicher, ob das, was Sie suchen, möglich ist. Sie könnten Ihre eigene Tabelle erstellen, aber denken Sie daran, dass sie dann nur für ein Tastaturlayout funktioniert (viele Sprachen haben ihre eigenen Tastaturlayouts, die für ihre spezifischen Zeichensätze besser geeignet sind, auch das Dvorak-Layout, das es wahrscheinlich hat eigene verschobene vs nicht verschobene Schlüssel), es sei denn, Sie berücksichtigen alle Tastaturlayouts, die Sie unterstützen möchten, und erstellen benutzerdefinierte Tabellen für diese.

+2

Für das, was es wert ist, hat das Standard-Windows-Dvorak-Layout den gleichen Satz von verschobenen/unverschobenen Zeichen wie eine normale QWERTY-Tastatur. Das Erzeugen eines bestimmten Zeichens auf Dvorak erfordert eine Verschiebung, wenn es auch eine Verschiebung auf QWERTY erfordert. –

+0

Ah, gut zu wissen, danke! –

1

Können Sie AWT-Klassen verwenden? So etwas wie dies funktionieren könnte:

AWTKeyStroke ks = AWTKeyStroke.getAWTKeyStroke('!'); 
int modifers = ks.getModifiers(); 

if ((modifiers & KeyEvent.VK_SHIFT) == KeyEvent.VK_SHIFT) { 
    // Shift pressed 
} 
+0

Ich habe das versucht, und leider scheint es nicht zu funktionieren. Mit dem spezifischen Beispiel, das Sie angegeben haben, war Modifiers & KeyEvent.VK_SHIFT für eine Ausrufungsmarke null. –

Verwandte Themen