Внимание, требуется доп. оборудование!!! До недавнего времени ни разу не сталкивался с защитами от кликеров. И вот этот день наступил. Мне даже интересно стало - как вся эта защита выглядит, и неужели ее никак не обойти. Первое что испробовал, это режим пс2, благо на пк такой порт еще есть, хоть и комбинированный. Мышки на пс2 не нашел, а клавиатура как раз туда и втыкнута. Клавиатурные нажатия + #ps2_keyboard работают отлично. Даже и не подозревал какая это полезная штука оказывается "режим PS/2" .
Но идем дальше. На ноуте, которым пользуюсь чаще, пс2 уже нет
. И как тут быть? И пришла мне тут идея, а неужели нельзя аппаратно жать на нужные кнопки? К счастью для экспериментов под рукой завалялась плата "ардуино". Описание девайса
тут.
Идея заключается в том, чтобы данный контроллер жал на те кнопки, которые я ему скажу жать. Гдето в интернети встречал какието доп. модули для ардуино, но в данный момент мне это было не интересно (заказывать, ждать, ... интереснее сделать самому).
Для начала нашел ненужную усб мышку. Как мне кажется с мышкой соединить ардуино куда проще чем с клавиатурой. С клавитурой пока не пробовал, нет у меня лишней усб клавы, да и еще не уверен что чтото с ней получится. Немного почитал, вспомнил как там программируется ардуино, этот закрученный язык си
. Сразу понял, что на две кнопки мышки он нажмет. Благо там контак просто на массу замыкает, а digitalWrite какраз так и делает - либо 5в, либо "масса".
Идем дальше, нужно как то сообщить контроллеру что я хочу нажать, и в кокой момент. Ардуина подключена к пк через усб к виртуальному ком порту, и без проблем передает сообщени и принимает их. Тут пришлось немного поламать голову. Ни как не мог разобраться как послать ту инфу, что я хочу. Идея была посылать байт информации, 256 значений хватило бы для любых прихотей. Принцип передачи так и работает, но передача идет символов ASCI. И получается, что я могу отправить только те символы, которые могу напечатать, а всякие там шифты, контралы, управляющий символ и прочее отправить уже не получится. Речь идет о передаче через командную строку, мы же не привыкли носить кучу доп. утилит и приложений (кстати они вроде как могут передавать все что захочешь). Ну да ладно, немного усложним работу, и будем отправлять число строкой, тем более что полюбому консоль в добавок после символа отправляет "переход на след. строку" и "возврат коретки" 13 и 10 если не ошибаюсь, которые в любом случае придется отсортировывать.
Ну чтож, с передачей информации разобрался. Переходим к нашему любимому "кликерману". Жаль что он не может послать в ком на прямую
. требуется создание батника каждый раз
. Создаю строку - десятичный код клавиши + символ обозначающий зажатие и отпускание кнопки (U или D). Вышло как то так:
SUB(key, $char)
STRWRITELN ("file.bat", STRCONCAT("Mode com",$comport," baud=9600 parity=n data=8 stop=1"), 1)
STRWRITELN ("file.bat", STRCONCAT("echo ",$char,"> com",$comport), 0)
EXECUTE("file.bat")
END_SUB
key(STRCONCAT($key,"D")) // $key - десятичный код клавиши
waitms(100)
key(STRCONCAT($key,"U"))
Ардуино в свою очередь мониторит нужный порт на наличие сообщения. Как только появляются байты для считывания Serial.available(), пишет цифры в массив, а мой управляющий символ в переменную.
while (Serial.available() > 0) {
int inchar = Serial.read();
if (inchar == 'U') {
presskey = false;
}
if (inchar == 'D') {
presskey = true;
}
if (isDigit(inchar)) {
instring += (char)inchar;
}
if (inchar == '\n') {
val = instring.toInt();
instring = "";
}
}
А потом, имея код кнопки, выбираем на какой контакт подать "минус" digitalWrite(pin, LOW). К этому контакту заранее был подведен и припаян провод от нужной кнопки мышки.
Для отладки и настройки использовал LCD дисплей, хотя можно было обойтись и без него.
В этоге - код для "ардуино" для левой и правой кнопки мыши:
String instring = "";
int val = 0;
boolean presskey = false;
int lmouse = 52;
int rmouse = 53;
int getPress(int key) {
if (presskey == true) {
digitalWrite(key, LOW);
}
else {
digitalWrite(key, HIGH );
}
}
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
pinMode(lmouse, OUTPUT);
digitalWrite(lmouse, HIGH);
pinMode(rmouse, OUTPUT);
digitalWrite(rmouse, HIGH);
}
void loop() {
while (Serial.available() > 0) {
lcd.clear();
int inchar = Serial.read();
if (inchar == 'U') {
presskey = false;
}
if (inchar == 'D') {
presskey = true;
}
if (isDigit(inchar)) {
instring += (char)inchar;
}
if (inchar == '\n') {
val = instring.toInt();
lcd.print("key: ");
lcd.print(val);
lcd.setCursor(0, 1);
lcd.print("press: ");
lcd.print(presskey);
instring = "";
switch (val) {
case 1:
getPress(lmouse);
break;
case 2:
getPress(rmouse);
break;
}
}
}
}
Код для "кликермана" - press, dbpress, down и up :
#name "arduino mouse"
$comport = 6
SUB(key, $char)
STRWRITELN ("file.bat", STRCONCAT("Mode com",$comport," baud=9600 parity=n data=8 stop=1"), 1)
STRWRITELN ("file.bat", STRCONCAT("echo ",$char,"> com",$comport), 0)
EXECUTE("file.bat")
END_SUB
SUB(press, $keypress)
key(STRCONCAT($keypress,"D"))
waitms(100)
key(STRCONCAT($keypress,"U"))
END_SUB
SUB(dbpress, $dbpresskey)
press($dbpresskey)
waitms(100)
press($dbpresskey)
END_SUB
SUB(down, $keydown)
key(STRCONCAT($keydown,"D"))
END_SUB
SUB(up, $keyup)
key(STRCONCAT($keyup,"U"))
END_SUB
///////////////////////////////////////////////////////////////////////////////
wait(1)
move(2040,940)
waitms(100)
dbpress(1)
wait(1)
press(2)
wait(1)
move(2010,930)
waitms(100)
down(1)
waitms(500)
move(2010,880)
wait(1)
up(1)
halt
И небольшое видео демонстрирующее работу:
https://www.youtube.com/watch?v=NO2GOfSAqJE
Идея , я думаю, очень даже интересная. Если у кого то есть мысли по поводу работы с клавиатурой, прошу в тему. Если есть какието замечания в проделанной мной работе, не стесняйтесь, комментируйте
.