如何确定角色是否需要键入shift键才能输入?

时间:2009-07-09 02:57:47

标签: java keycode shift awtrobot

我正在编写一些代码来使用Robot类输入字符串。一切都很好(好吧,我必须使用一个大的switch语句来获取字符键码),除了一些键没有键码,因为它们实际上是 Shift +其他键的组合。对于大写字母,使用Character.isUpperCase(c)很容易检查,但是对于!@#$%^&*()_+等所有符号和各种标点符号都不被视为“大写”,尽管它们需要按顺序按下shift生成他们的击键。我试着谷歌搜索它,但只是发现一个没有令人满意的答案的论坛帖子。有没有办法确定一个角色是否需要转换为按下,如果是,那么“未转移”的版本是什么字符?

编辑:这是我到目前为止的代码。

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);
    }
}

4 个答案:

答案 0 :(得分:1)

我不确定你所寻找的是否可行。您可以创建自己的表,但请记住,它只能用于一个键盘布局(许多语言都有自己的键盘布局,更适合他们的特定字符集,还有,Dvorak布局可能有它的除非你考虑到你想要支持的所有键盘布局,并为这些键盘布局创建自定义表格。

答案 1 :(得分:1)

您可以使用AWT课程吗?这样的事情可能有用:

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

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

答案 2 :(得分:1)

我不知道直接解决问题的方法(我最后只是为这些字符使用了Map),但它可能会给你一些想法:

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();
        }
    }
}

答案 3 :(得分:0)

如果查看ASCII table,这些符号键位于0x21 - 0x2B范围内 您可以查看ASCII表以识别所有其他符号。