3

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

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

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

4 回答 4

2

我不知道直接解决您的问题的方法(我刚刚为这些角色使用了 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();
        }
    }
}
于 2009-07-09T04:36:17.177 回答
1

我不确定你正在寻找的东西是否可能。您可以创建自己的表格,但请记住,它仅适用于一种键盘布局(许多语言都有自己的键盘布局,更适合其特定字符集,此外,可能有 Dvorak 布局)自己的移位键和非移位键),除非您考虑要支持的所有键盘布局,并为它们创建自定义表。

于 2009-07-09T03:16:26.627 回答
1

你可以使用 AWT 类吗?像这样的东西可能会起作用:

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

if ((modifiers & KeyEvent.VK_SHIFT) == KeyEvent.VK_SHIFT) {
    // Shift pressed
}
于 2009-07-09T03:19:53.360 回答
0

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

于 2009-07-09T03:11:04.543 回答