Как вы определяете, требуется ли для ввода текста клавиша Shift? - PullRequest
3 голосов
/ 09 июля 2009

Я пишу некоторый код для ввода строк с использованием класса Robot. Все в основном хорошо (ну, я должен использовать большой оператор switch для получения символьных кодов клавиш), за исключением того, что некоторые клавиши не имеют кодов клавиш, потому что они на самом деле являются комбинацией Shift + некоторой другой клавиши. Для букв в верхнем регистре это легко проверить, используя Character.isUpperCase(c), но для всех символов, таких как !@#$%^&*()_+ и различные знаки препинания, не считаются "прописными буквами", хотя они требуют нажатия клавиши shift для генерации нажатия клавиш. , Я попытался поискать в Google, но только нашел сообщение на форуме без удовлетворительных ответов. Есть ли способ определить, нужно ли нажимать на сдвиг персонажа, и если да, то какой символ является «несмещенной» версией?

РЕДАКТИРОВАТЬ: Вот код, который я до сих пор.

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 ]

1 голос
/ 09 июля 2009

Я не знаю, как решить вашу проблему напрямую (я только что использовал Карту для этих персонажей), но она может дать вам несколько идей:

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();
        }
    }
}
1 голос
/ 09 июля 2009

Я не уверен, возможно ли то, что вы ищете. Вы можете создать свою собственную таблицу, но имейте в виду, что тогда она будет работать только для одной раскладки клавиатуры (многие языки имеют свои раскладки клавиатуры, которые больше подходят для их конкретных наборов символов, также есть раскладка Dvorak, которая, вероятно, имеет собственные сдвинутые против несмещенных клавиш), если вы не учитываете все раскладки клавиатуры, которые хотите поддерживать, и создаете для них пользовательские таблицы.

1 голос
/ 09 июля 2009

Можете ли вы использовать классы AWT? Примерно так может работать:

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

if ((modifiers & KeyEvent.VK_SHIFT) == KeyEvent.VK_SHIFT) {
    // Shift pressed
}
0 голосов
/ 09 июля 2009

Если вы посмотрите на таблицу ASCII , эти символьные клавиши находятся в диапазоне 0x21 - 0x2B
Вы можете, вероятно, взглянуть на таблицу ASCII для распознавания всех других символов.

...