java.awt.Robot как оказалось достаточно простой и ни фига не документированный класс. В sdn-не только сухое описание, у Шилдта(!) про него вААбще ни слова, а в интернетах рассмотрены только простые примеры. Ну а так как меня интересовало только нажатие клавиш, то мне хватило бы и одного метода Robot.keyPress(). Но (в чем никто не сомневася) сам по себе этот метод нифига не работает и что-бы нажать кнопку на клавиатуре нужно сделать приблизительно так:
Robot.delay(50);
Robot.keyPress(V_KEY);
Robot.keyRelease(V_KEY);
Robot.delay(50);
иначе работать не будет. Если не отпускать и не делать паузы клавиши, то вводиться х/з что. Ну и как оказалось это еще не самый неприятный момент. Самая жесть начинается тогда, когда нужно ввести какое-то осмысленное ! регистрозависимое слово. А весь прикол в том, что робот оперирует не ASCII-кодами а так называемыми виртуальными клавишами, которым абсолютно фиолетово какого регистра или какой раскладки буква. Сначала это повергло в шок, причем не хилый, ну а потом я придумал такой финт. Сначала делаем массив Integer(Виртуальные клавиши именно этого типа) длинной в 3 раза большей чем вводимый текст и заполняем его приблизительно так shift, символ, shift, т.е. к каждому символу с начала и с конца добавляем шифт. Потом, при вводе текста проверяем какая буква по ASCII и если нужно прижимаем щифт. Ну а выглядит это на яве так :
public void input(String text){
int [] Robo = new int[text.length()*3];
int num=0;
for (int i = 0; i < text.length();i++){
int Ch = text.charAt(i);
if((Ch > 96 | Ch == 32) | (Ch >= 48 & Ch <=57)){
Robo[num] = ASCII[text.charAt(i)];
num++;
continue;
}
Robo[num] = 16;
Robo[num+1]=ASCII[text.charAt(i)];
Robo[num+2]=16;
num=num+3;
}
for (int i = 0;i < Robo.length;i++){
if(Robo[i]==0){
continue;
}
if (Robo[i]==16){
if (shift_press){
inputer.keyRelease(Robo[i]);
inputer.delay(50);
shift_press = false;
continue;
}
inputer.keyPress(Robo[i]);
inputer.delay(50);
shift_press = true;
continue;
}
if(!shift_press){
inputer.delay(50);
inputer.keyRelease(16);
}
inputer.delay(50);
inputer.keyPress(Robo[i]);
inputer.delay(50);
inputer.keyRelease(Robo[i]);
inputer.delay(50);
}
int[] ASCII = {
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,32,
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,48,49,50,51,52,53,
54,55,56,57,0,0,0,0,0,0,
0,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,
0,0,0,0,0,0,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,0,0,0,0,0
};
З.Ы. Код рабочий и выдран из вполне рабочего приложения.
Немає коментарів:
Дописати коментар