Arduino Micro + clickermann.

Статья 2. Обход любых защит. DLL для общения с контроллером!

Авторdramster

http://crapware.aidf.org/forum/index.php?topic=5529.0

Не прошло и года, как у меня все-же получилось написать длл для общения с ком портом, а именно с ардуиномикро. По сравнению с командной строкой, работает шустро и незаметно.
При написании никаких дополнительных компонентов для работы с ком не использовал. С ними оказалось намного все сложнее.
Вобщем, пару вечеров, куча статей и форумов, вот первый, и вполне рабочий вариант.
Кто в теме, или вдруг загорится этой темой, код длл делфи10:

Код: Delphi

1.  library micro_com;
2.   
3.  uses    Windows, SysUtils;
4.   
5.  //------------------------------------------------------------------------------
6.  // Основное тело функции, идет на экспорт, вызывается из кликера
7. function execute( _mas: pInteger; _size: Integer): Integer; export; stdcall;
8.  
9.  
10.type
11.  pIntArr = array[0..0] of Integer;
12.var
13. DCB   : TDCB;
14. hPort : THandle;
15. port_num : integer;
16. param : integer;
17. byete_res: Cardinal;
18. str : string;
19. len : integer;
20.begin
21.   port_num := pIntArr(_mas^)[0];
22.   param := pIntArr(_mas^)[_size-1];
23. 
24.  // 1. Открываем файл
25.  hPort :=
                    CreateFile(PChar('COM'+IntToStr(port_num)),
                    GENERIC_READ + GENERIC_WRITE, 0, nil,
                    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
26.  // 2. Контроль ошибок
27.  if hPort = INVALID_HANDLE_VALUE then begin
28.   // Обнаружена ошибка, порт открыть не удалось
29.   result := 1;
30.   exit;
31.  end;
32. 
33.  // 3. Чтение текущих настроек порта
34. if GetCommState(hPort, DCB) then ;
35.  // 4. Настройки:
36.  // Скорость обмена
37. DCB.BaudRate := 9600;
38.  // Число бит на символ
39. DCB.ByteSize := 8;
40.  // Стоп-биты
41. DCB.StopBits := 1;
42.  // Четность
43. DCB.Parity   := 0;
44.  // Какая-то херь непонятная
45. DCB.Flags := 20625;
46.  // 5. Передача настроек
47. if not SetCommState(hPort, DCB) then begin{ошибка настройки порта}
48.   result := 2;
49.   exit;
50. end;
51.  // 6. Настройка буферов порта (очередей ввода и вывода)
52. if not SetupComm(hPort, 16, 16) then begin{ошибка настройки буферов}
53.   result := 3;
54.   exit;
55. end;
56.  // 7. Сброс буферов и очередей
57.if PurgeComm(hPort, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR orPURGE_RXCLEAR) then
58. // 8. Запись в порт
59. str := intToStr(param);
60. len := Length(str);
61. WriteFile(hPort, PChar(str)^, len*2, byete_res, nil);
62.  // 9. Закрытие порта
63. CloseHandle(hPort);
64. result := 5;
65.end;
66. 
67.//------------------------------------------------------------------------------
68. 
69.// список экспорта
70.exports execute;
71. 
72.begin
73. 
74.end.

Скомпилированная библиотека уверенно отправляет в нужный порт любой текст. Примерно так:

Код: Clickermann

1. CALL ("micro_com.dll", $com, $val)

Нам же, для управления микрой, нужны только числа. Скетч для контроллера взял старый отсюда https://vintets.ru/cm_arduino_1. Немного доработал его:

Код: sketch Arduino

1. #include <Mouse.h>
2. #include <Keyboard.h>
3.  
4. unsigned long par = 0;
5. String instring = "";
6. int kmfunct = 0;
7. int x_cor = 0;
8. int y_cor = 0;
9. int mult = 0;
10.int inchar = 0;
11. 
12.void setup() {
13.  Serial.begin(9600);
14.  Mouse.begin();
15.  Keyboard.begin();
16. 
17.}
18. 
19.void loop() {
20. 
21. 
22.while(Serial.available() > 0){  
23.inchar = Serial.read();
24.if (isDigit(inchar)) {
25.   instring += (char)inchar;      
26.    }   
27.}    
28.  par = instring.toInt(); 
29.  instring = ""; 
30. 
31. 
32.    if (par > 0) {
33. 
34.     kmfunct =  par/16777216 ; 
35.     switch (kmfunct) {
36. 
37.     case 1:  //Mouse.click
38.      Mouse.click(par - kmfunct*16777216);
39.      break;    
40.     case 2:  //  Mouse.move
41.      x_cor = (par - kmfunct*16777216)/256;
42.      y_cor = par - x_cor*256 - kmfunct*16777216;
43.      if (x_cor > 127) x_cor = 127 - x_cor;
44.      if (y_cor > 127) y_cor = 127 - y_cor;
45.      Mouse.move(x_cor, y_cor, 0);
46.      break; 
47.     case 3: //Mouse.press
48.      Mouse.press(par - kmfunct*16777216);
49.      break;
50.     case 4: //Mouse.release
51.      Mouse.release(par - kmfunct*16777216);
52.      break;
53.     case 5:  //Mouse.dblclick
54.      Mouse.click(par - kmfunct*16777216);
55.      delay(50);
56.      Mouse.click(par - kmfunct*16777216);
57.      break;
58.     case 6: //wheel.down.up
59.      mult = par - kmfunct*16777216;
60.      if (mult > 127) mult = 127 - mult;
61.      Mouse.move(0, 0, mult);
62.     case 7: // Keyboard.keydown
63.      Keyboard.press(par - kmfunct*16777216);
64.      break;
65.     case 8: // Keyboard.keyup
66.      Keyboard.release(par - kmfunct*16777216);
67.      break;
68.     case 9: // Keyboard.keypress
69.      Keyboard.write(par - kmfunct*16777216); 
70.      break;
71.     }
72.    }
73.    par = 0;
74. 
75.}

Библиотека с подпрограммами для кликермана тут:
Arduino_mouse_keyboard_4.13.cms (4.68 КБ)
Arduino_mouse_keyboard_4.14.cms (3.36 КБ)

Код: Clickermann

1. $com = 5   //свой порт
2.  
3. //#name "Arduino_mouse&keyboard"
4.  
5. ////////////////////////////////////////////////
6.  
7. // Все процедуры с мышью и клавиатурой через ардуино
8.  
9. //micro_move ($x_cor, $y_cor)
10.//micro_lclick ($x_cor, $y_cor)
11.//micro_rclick ($x_cor, $y_cor)
12.//micro_mclick ($x_cor, $y_cor)
13.//micro_ldown ($x_cor, $y_cor)
14.//micro_rdown ($x_cor, $y_cor)
15.//micro_mdown ($x_cor, $y_cor)
16.//micro_lup ($x_cor, $y_cor)
17.//micro_rup ($x_cor, $y_cor)
18.//micro_mup ($x_cor, $y_cor)
19.//micro_dblclick ($x_cor, $y_cor)
20.//micro_wheeldown ($mult)
21.//micro_wheelup ($mult)
22. 
23.// вместо $char_ASCII писать не код клавиши, а символ ASCII.
24.// в ардуино как-то тупо сделали клавиатурные нажатия :/
25.//micro_keydown ($char_ASCII)
26.//micro_keyup ($char_ASCII)
27.//micro_keypress ($char_ASCII)
28. 
29. 
30. 
31.//move
32.SUB(micro_move, $x_cor, $y_cor)
33. 
34.   WHILE(DIST($x_cor, $y_cor, $_xmouse, $_ymouse) > 3)
35. 
36.      $x_temp = $_xmouse
37.      $y_temp = $_ymouse
38. 
39.      $x_dist = $x_cor - $_xmouse
40.      $y_dist = $y_cor - $_ymouse
41. 
42.      IF($x_dist < 0)
43.         $x_dist = 127 + int(SQRT(ABS($x_dist*4)))
44.      else
45.         $x_dist =  int(SQRT(ABS($x_dist*4)))
46.      END_IF
47.      IF($y_dist < 0)
48.         $y_dist = 127 + int(SQRT(ABS($y_dist*4)))
49.      else
50.         $y_dist =  int(SQRT(ABS($y_dist*4)))
51.      END_IF 
52.      CALL ("micro_com.dll", $com, 33554432 + $x_dist*256 + $y_dist)  
53. 
54.   END_CYC
55.END_SUB
56. 
57.//lclick
58.SUB(micro_lclick, $x_cor, $y_cor)
59.   micro_move($x_cor, $y_cor)
60.   CALL ("micro_com.dll", $com, 16777217) 
61.END_SUB
62. 
63.//rclick
64.SUB(micro_rclick, $x_cor, $y_cor)
65.   micro_move($x_cor, $y_cor)
66.   CALL ("micro_com.dll", $com, 16777218) 
67.END_SUB
68. 
69.//mclick
70.SUB(micro_mclick, $x_cor, $y_cor)
71.   micro_move($x_cor, $y_cor)
72.   CALL ("micro_com.dll", $com, 16777219) 
73.END_SUB
74. 
75.//ldown
76.SUB(micro_ldown, $x_cor, $y_cor)
77.   micro_move($x_cor, $y_cor)
78.   CALL ("micro_com.dll", $com, 50331649) 
79.END_SUB
80. 
81.//rdown
82.SUB(micro_rdown, $x_cor, $y_cor)
83.   micro_move($x_cor, $y_cor)
84.   CALL ("micro_com.dll", $com, 50331650) 
85.END_SUB
86. 
87.//mdown
88.SUB(micro_mdown, $x_cor, $y_cor)
89.   micro_move($x_cor, $y_cor)
90.   CALL ("micro_com.dll", $com, 50331651) 
91.END_SUB
92. 
93.//lup
94.SUB(micro_lup, $x_cor, $y_cor)
95.   micro_move($x_cor, $y_cor)
96.   CALL ("micro_com.dll", $com, 67108865) 
97.END_SUB
98. 
99.//rup
100. SUB(micro_rup, $x_cor, $y_cor)
101.    micro_move($x_cor, $y_cor)
102.    CALL ("micro_com.dll", $com, 67108866) 
103. END_SUB
104.  
105. //mup
106. SUB(micro_mup, $x_cor, $y_cor)
107.    micro_move($x_cor, $y_cor)
108.    CALL ("micro_com.dll", $com, 67108867) 
109. END_SUB
110.  
111. //dblclick
112. SUB(micro_dblclick, $x_cor, $y_cor)
113.    micro_move($x_cor, $y_cor)
114.    CALL ("micro_com.dll", $com, 83886081) 
115. END_SUB
116.  
117. //wheeldown
118. SUB(micro_wheeldown, $mult)
119.    CALL ("micro_com.dll", $com, 100663423 + $mult) 
120. END_SUB
121.  
122. //wheelup
123. SUB(micro_wheelup, $mult)
124.    CALL ("micro_com.dll", $com, 100663296 + $mult) 
125. END_SUB
126.  
127. //keydown
128. SUB(micro_keydown, $char_ASCII)
129.    CALL ("micro_com.dll", $com, 117440512 + code($char_ASCII)) 
130. END_SUB
131.  
132. //keyup
133. SUB(micro_keyup, $char_ASCII)
134.    CALL ("micro_com.dll", $com, 134217728 + code($char_ASCII)) 
135. END_SUB
136.  
137. //keypress
138. SUB(micro_keypress, $char_ASCII)
139.    CALL ("micro_com.dll", $com, 150994944 + code($char_ASCII)) 
140. END_SUB

Даже и не уверен, придумают ли защиту от такого аппаратного управления машиной  ;).

Подключайтесь, проверяйте. Я проверил и использовал лишь в одной защищенной древнючей игре MTA_SA. Не смотря на ее древнючесть, они уже давно впилили защиту от кликеров. Сам контроллер не сильно и дорогой, глянул - от 350р. Я вроде еще за 280 когда-то купил.

Скачать dll для х32 систем: micro_com.dll (133 КБ)


А теперь поподробнее, с чего начинать, что купить, как прошить, как запустить...

1. Нам нужен сам контроллер ардуино. Подойдут только те, которые определяются на ПК как мышь и клавиатура. Те, о которых я в курсе - Arduino Micro, Arduino Pro Micro, Arduino Leonardo.

http://arduino.ru/sites/default/files/resize/u3731/arduinomicrofront-380x171.jpg

2. Подключаем наш девайс к ПК в любой USB. Смотрим в диспетчер устройств. Должно появиться три новых устройства - клавиатура HID, HID совместимая мышь, устройство с последовательным интерфейсом USB (COM). Номер COM порта запоминаем.

https://i.imgur.com/gd5z0pa.png

3. Далее нужно прошить наш контроллер. Для этого нужен софт. Качаем с оффсайта ардуино последнюю версию Arduino IDE https://www.arduino.cc/en/software . Я использую портативную версию для windows - "Windows ZIP file". Она не требует установки, просто распаковать из архива, и готово, можно пользоваться.

https://i.imgur.com/hu6uEm8.png

4. Настраиваем IDE под наш контроллер. Меню - инструменты - плата: - Arduino Micro, либо Leonardo в зависимости от того что там у вас. Меню - инструменты - порт: - выбираем порт к которому подключен контроллер.

https://i.imgur.com/lVEB3xt.png https://i.imgur.com/cFuMNws.png

5. Все, можно загружать скетч. Берем тот что я написал, либо пишите свой. Мой:

Код скетча:

1. #include <Mouse.h>
2. #include <Keyboard.h>
3.  
4. unsigned long par = 0;
5. String instring = "";
6. int kmfunct = 0;
7. int x_cor = 0;
8. int y_cor = 0;
9. int mult = 0;
10.int inchar = 0;
11. 
12.void setup() {
13.  Serial.begin(9600);
14.  Mouse.begin();
15.  Keyboard.begin();
16. 
17.}
18. 
19.void loop() {
20. 
21. 
22.while(Serial.available() > 0){  
23.inchar = Serial.read();
24.if (isDigit(inchar)) {
25.   instring += (char)inchar;      
26.    }   
27.}    
28.  par = instring.toInt(); 
29.  instring = ""; 
30. 
31. 
32.    if (par > 0) {
33. 
34.     kmfunct =  par/16777216 ; 
35.     switch (kmfunct) {
36. 
37.     case 1:  //Mouse.click
38.      Mouse.click(par - kmfunct*16777216);
39.      break;    
40.     case 2:  //  Mouse.move
41.      x_cor = (par - kmfunct*16777216)/256;
42.      y_cor = par - x_cor*256 - kmfunct*16777216;
43.      if (x_cor > 127) x_cor = 127 - x_cor;
44.      if (y_cor > 127) y_cor = 127 - y_cor;
45.      Mouse.move(x_cor, y_cor, 0);
46.      break; 
47.     case 3: //Mouse.press
48.      Mouse.press(par - kmfunct*16777216);
49.      break;
50.     case 4: //Mouse.release
51.      Mouse.release(par - kmfunct*16777216);
52.      break;
53.     case 5:  //Mouse.dblclick
54.      Mouse.click(par - kmfunct*16777216);
55.      delay(50);
56.      Mouse.click(par - kmfunct*16777216);
57.      break;
58.     case 6: //wheel.down.up
59.      mult = par - kmfunct*16777216;
60.      if (mult > 127) mult = 127 - mult;
61.      Mouse.move(0, 0, mult);
62.     case 7: // Keyboard.keydown
63.      Keyboard.press(par - kmfunct*16777216);
64.      break;
65.     case 8: // Keyboard.keyup
66.      Keyboard.release(par - kmfunct*16777216);
67.      break;
68.     case 9: // Keyboard.keypress
69.      Keyboard.write(par - kmfunct*16777216); 
70.      break;
71.     }
72.    }
73.    par = 0;
74. 
75.}

Копируете и вставляете в редактор arduino. Жмете кнопку "проверить", пойдет компиляция скетча. После завершения в логе будет что-то типа:

Скетч использует 7426 байт (25%) памяти устройства. Всего доступно 28672 байт.
Глобальные переменные используют 265 байт (10%) динамической памяти, оставляя 2295 байт для локальных переменных. Максимум: 2560 байт.

Значит все отлично, жмем кнопку "загрузка" и ждем пока скетч загрузится в контроллер. Если все в норме, то по итогу в логе будет: загрузка завершена, и тоже самое что и после проверки.

https://i.imgur.com/UduTXYU.png

6. Контроллер готов и ждет команды из COM порта. Для отправки сообщения в наш порт я написал DLL библиотеку  "micro_com.dll". Берем во вложении первого поста, либо вот с ядиска https://disk.yandex.ru/d/YuMXDEFLhWiD6A . Качаем (либо копируем) библиотеку с процедурами мыши и клавиатуры для Clickermann "Arduino_mouse_keyboard.cms" , во вложении, либо код из поста выше, либо с ядиска https://disk.yandex.ru/d/kmqlsabjb4RJvg . Кидаем эти два файла в одну папку. Открываем "Arduino_mouse_keyboard.cms" и прописываем в переменную $com номер порта, к которому подключена ардуина.


7. Создаем наш основной скрипт, либо редактируем уже существующий. Подключаем в него "Arduino_mouse_keyboard.cms".

Код: Clickermann

1. #include "Arduino_mouse_keyboard.cms"

Все процедуры, которые я пока написал:

Код: Text

1. //micro_move($x_cor, $y_cor)
2. //micro_lclick($x_cor, $y_cor)
3. //micro_rclick($x_cor, $y_cor)
4. //micro_mclick($x_cor, $y_cor)
5. //micro_ldown($x_cor, $y_cor)
6. //micro_rdown($x_cor, $y_cor)
7. //micro_mdown($x_cor, $y_cor)
8. //micro_lup($x_cor, $y_cor)
9. //micro_rup($x_cor, $y_cor)
10.//micro_mup($x_cor, $y_cor)
11.//micro_dblclick($x_cor, $y_cor)
12.//micro_wheeldown($mult)
13.//micro_wheelup($mult)
14. 
15.// вместо $char_ASCII писать не код клавиши, а символ ASCII.
16.// в ардуино как-то тупо сделали клавиатурные нажатия :/
17.// пока поддерживают только печатные символы, в будущем добавлю подпрограмму для клавиш-модификаторов.
18.//micro_keydown($char_ASCII)
19.//micro_keyup($char_ASCII)
20.//micro_keypress($char_ASCII)

Ну и для проверки можно подергать курсором. Пишем к примеру такой код:

Код: Clickermann

1. #include "Arduino_mouse_keyboard.cms"
2.  
3. WAIT(2)
4. micro_move(100, 100)
5. WAIT(2)
6. micro_move(500, 500)
7. WAIT(2)
8. micro_move(500, 100)
9. WAIT(2)
10.micro_move(100, 100)
11.HALT

Жмем "применить" и сохраняем скрипт в папку с "micro_com.dll" и "Arduino_mouse_keyboard.cms". Запускаем и смотрим как курсор двигается по прописанным координатам.



 8. Радуемся.


Если курсор не двигается, то ищем где мы накосячили. DLL может помочь в этом. Функция из библиотеки возвращает код, сообщая, на каком моменте остановилась работа по общению с COM портом. Если все в норме, функция должна возвратить "5"

Код: Clickermann

1. #include "Arduino_mouse_keyboard.cms"
2.  
3. WAIT(2)
4. micro_move(100, 100)
5. PRINT($_return1)  //должно быть "5", иначе - пишите в этой теме, и подумаем в чем ошибка.
6. HALT

Подробно о библиотеках Mouse и Keyboard для ардуино тут - https://doc.arduino.ua/ru/prog/MouseKeyboard либо на оффсайте на английском.
Коды клавиш-модификаторов тут - https://doc.arduino.ua/ru/prog/KeyboardModifiers. Для них нужно будет писать отдельную подпрограмму, либо вызывать индивидуально.

DLL написана для х32 систем, соответственно версия кликермана должна быть х32!!!


Вот библиотека для всех версий (кроме х64), включая 4.13 и старше. Написал основные клавиши и клавиши модификаторы. Не достающие клавиши можете дописать сами.

Код: Clickermann

1.  $com = 5  //свой порт
2.  
3.  //"Arduino_mouse&keyboard"  для версии 4.13 и старше.
4.  
5.  ////////////////////////////////////////////////
6.  
7.  // Все процедуры с мышью и клавиатурой через ардуино
8.  
9.  //micro_move ($x_cor, $y_cor)
10. //micro_lclick ($x_cor, $y_cor)
11. //micro_rclick ($x_cor, $y_cor)
12. //micro_mclick ($x_cor, $y_cor)
13. //micro_ldown ($x_cor, $y_cor)
14. //micro_rdown ($x_cor, $y_cor)
15. //micro_mdown ($x_cor, $y_cor)
16. //micro_lup ($x_cor, $y_cor)
17. //micro_rup ($x_cor, $y_cor)
18. //micro_mup ($x_cor, $y_cor)
19. //micro_dblclick ($x_cor, $y_cor)
20. //micro_wheeldown ($mult)
21. //micro_wheelup ($mult)
22. 
23. 
24. //micro_keydown (key_)
25. //micro_keyup (key_)
26. //micro_keypress (key_)
27. 
28. //коды клавиш, если чегото не хватает, дописывайте сами.
29. #define key_0:49
30. #define key_1:50
31. #define key_2:51
32. #define key_3:52
33. #define key_4:53
34. #define key_5:54
35. #define key_6:55
36. #define key_7:56
37. #define key_8:57
38. #define key_9:58
39. #define key_a:97
40. #define key_b:98
41. #define key_c:99
42. #define key_d:100
43. #define key_e:101
44. #define key_f:102
45. #define key_g:103
46. #define key_h:104
47. #define key_i:105
48. #define key_j:106
49. #define key_k:107
50. #define key_l:108
51. #define key_m:109
52. #define key_n:110
53. #define key_o:111
54. #define key_p:112
55. #define key_q:113
56. #define key_r:114
57. #define key_s:115
58. #define key_t:116
59. #define key_u:117
60. #define key_v:118
61. #define key_w:119
62. #define key_x:120
63. #define key_y:121
64. #define key_z:122
65. #define KEY_LEFT_CTRL:128
66. #define KEY_LEFT_SHIFT:129
67. #define KEY_LEFT_ALT:130
68. #define KEY_LEFT_GUI:131
69. #define KEY_RIGHT_CTRL:132
70. #define KEY_RIGHT_SHIFT:133
71. #define KEY_RIGHT_ALT:134
72. #define KEY_RIGHT_GUI:135
73. #define KEY_UP_ARROW:218
74. #define KEY_DOWN_ARROW:217
75. #define KEY_LEFT_ARROW:216
76. #define KEY_RIGHT_ARROW:215
77. #define KEY_BACKSPACE:178
78. #define KEY_TAB:179
79. #define KEY_RETURN:176
80. #define KEY_ESC:177
81. #define KEY_INSERT:209
82. #define KEY_DELETE:212
83. #define KEY_PAGE_UP:211
84. #define KEY_PAGE_DOWN:214
85. #define KEY_HOME:210
86. #define KEY_END:213
87. #define KEY_CAPS_LOCK:193
88. #define KEY_F1:194
89. #define KEY_F2:195
90. #define KEY_F3:196
91. #define KEY_F4:197
92. #define KEY_F5:198
93. #define KEY_F6:199
94. #define KEY_F7:200
95. #define KEY_F8:201
96. #define KEY_F9:202
97. #define KEY_F10:203
98. #define KEY_F11:204
99. #define KEY_F12:205 
100.  
101.  
102. //move
103. SUB(micro_move, $x_cor, $y_cor)
104.  
105.    WHILE(DIST($x_cor, $y_cor, $_xmouse, $_ymouse) > 3)
106.  
107.       $x_temp = $_xmouse
108.       $y_temp = $_ymouse
109.  
110.       $x_dist = $x_cor - $_xmouse
111.       $y_dist = $y_cor - $_ymouse
112.  
113.       IF($x_dist < 0)
114.          $x_dist = 127 + int(SQRT(ABS($x_dist*4)))
115.       else
116.          $x_dist =  int(SQRT(ABS($x_dist*4)))
117.       END_IF
118.       IF($y_dist < 0)
119.          $y_dist = 127 + int(SQRT(ABS($y_dist*4)))
120.       else
121.          $y_dist =  int(SQRT(ABS($y_dist*4)))
122.       END_IF 
123.       CALL ("micro_com.dll", $com, 33554432 + $x_dist*256 + $y_dist)  
124.  
125.    END_CYC
126. END_SUB
127.  
128. //lclick
129. SUB(micro_lclick, $x_cor, $y_cor)
130.    micro_move($x_cor, $y_cor)
131.    CALL ("micro_com.dll", $com, 16777217) 
132. END_SUB
133.  
134. //rclick
135. SUB(micro_rclick, $x_cor, $y_cor)
136.    micro_move($x_cor, $y_cor)
137.    CALL ("micro_com.dll", $com, 16777218) 
138. END_SUB
139.  
140. //mclick
141. SUB(micro_mclick, $x_cor, $y_cor)
142.    micro_move($x_cor, $y_cor)
143.    CALL ("micro_com.dll", $com, 16777219) 
144. END_SUB
145.  
146. //ldown
147. SUB(micro_ldown, $x_cor, $y_cor)
148.    micro_move($x_cor, $y_cor)
149.    CALL ("micro_com.dll", $com, 50331649) 
150. END_SUB
151.  
152. //rdown
153. SUB(micro_rdown, $x_cor, $y_cor)
154.    micro_move($x_cor, $y_cor)
155.    CALL ("micro_com.dll", $com, 50331650) 
156. END_SUB
157.  
158. //mdown
159. SUB(micro_mdown, $x_cor, $y_cor)
160.    micro_move($x_cor, $y_cor)
161.    CALL ("micro_com.dll", $com, 50331651) 
162. END_SUB
163.  
164. //lup
165. SUB(micro_lup, $x_cor, $y_cor)
166.    micro_move($x_cor, $y_cor)
167.    CALL ("micro_com.dll", $com, 67108865) 
168. END_SUB
169.  
170. //rup
171. SUB(micro_rup, $x_cor, $y_cor)
172.    micro_move($x_cor, $y_cor)
173.    CALL ("micro_com.dll", $com, 67108866) 
174. END_SUB
175.  
176. //mup
177. SUB(micro_mup, $x_cor, $y_cor)
178.    micro_move($x_cor, $y_cor)
179.    CALL ("micro_com.dll", $com, 67108867) 
180. END_SUB
181.  
182. //dblclick
183. SUB(micro_dblclick, $x_cor, $y_cor)
184.    micro_move($x_cor, $y_cor)
185.    CALL ("micro_com.dll", $com, 83886081) 
186. END_SUB
187.  
188. //wheeldown
189. SUB(micro_wheeldown, $mult)
190.    CALL ("micro_com.dll", $com, 100663423 + $mult) 
191. END_SUB
192.  
193. //wheelup
194. SUB(micro_wheelup, $mult)
195.    CALL ("micro_com.dll", $com, 100663296 + $mult) 
196. END_SUB
197.  
198. //keydown
199. SUB(micro_keydown, $key_)
200.    CALL ("micro_com.dll", $com, 117440512 + int($key_)) 
201. END_SUB
202.  
203. //keyup
204. SUB(micro_keyup, $key_)
205.    CALL ("micro_com.dll", $com, 134217728 + int($key_)) 
206. END_SUB
207.  
208. //keypress
209. SUB(micro_keypress, $key_)
210.    CALL ("micro_com.dll", $com, 150994944 + int($key_)) 
211. END_SUB

Пример по использованию:

Код: Clickermann

1.  #include "Arduino_mouse_keyboard.cms"
2.   
3.  //контроллер выделяет текст активного окна и удаляет его
4.  WAIT(1)
5.  micro_keydown(KEY_RIGHT_CTRL) //зажимает левый контрал
6.  micro_keydown(key_a)    //зажимает клавишу"A"
7.  WAITMS(100)
8.  micro_keyup(key_a)    //отпускает клавишу"A"
9.  micro_keyup(KEY_RIGHT_CTRL) //отпускает левый контрал
10. WAITMS(100)
11. micro_keypr...

Добавленные клавиши:

Код: Text

1.  key_0
2.  key_1
3.  key_2
4.  key_3
5.  key_4
6.  key_5
7.  key_6
8.  key_7
9.  key_8
10. key_9
11. key_a
12. key_b
13. key_c
14. key_d
15. key_e
16. key_f
17. key_g
18. key_h
19. key_i
20. key_j
21. key_k
22. key_l
23. key_m
24. key_n
25. key_o
26. key_p
27. key_q
28. key_r
29. key_s
30. key_t
31. key_u
32. key_v
33. key_w
34. key_x
35. key_y
36. key_z
37. KEY_LEFT_CTRL
38. KEY_LEFT_SHIFT
39. KEY_LEFT_ALT
40. KEY_LEFT_GUI
41. KEY_RIGHT_CTRL
42. KEY_RIGHT_SHIFT
43. KEY_RIGHT_ALT
44. KEY_RIGHT_GUI
45. KEY_UP_ARROW
46. KEY_DOWN_ARROW
47. KEY_LEFT_ARROW
48. KEY_RIGHT_ARROW
49. KEY_BACKSPACE
50. KEY_TAB
51. KEY_RETURN
52. KEY_ESC
53. KEY_INSERT
54. KEY_DELETE
55. KEY_PAGE_UP
56. KEY_PAGE_DOWN
57. KEY_HOME
58. KEY_END
59. KEY_CAPS_LOCK
60. KEY_F1
61. KEY_F2
62. KEY_F3
63. KEY_F4
64. KEY_F5
65. KEY_F6
66. KEY_F7
67. KEY_F8
68. KEY_F9
69. KEY_F10
70. KEY_F11
71. KEY_F12

Вот такой прикольный корпус есть для ардуинки

Кейс для Arduino Mini_1 Кейс для Arduino Mini_2

Спасибо большое за весь предоставленный материал автору - dramster