Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ Плагины и доп. ПО _ Arduino

Автор: cirus 14.12.2020, 0:24

Скетч и модуль lua:    Прикрепленный файл  Arduino.zip ( 7,33 килобайт ) Кол-во скачиваний: 207
Драйвер для ардуино: Прикрепленный файл  CH341SER.zip ( 185,9 килобайт ) Кол-во скачиваний: 703

Arduino позволяет эмулировать нажатия клавиш клавиатуры и мыши, в том числе в приложениях, которые блокируют нажатия кликеров.
Может поворачивать камеру в шутерах и играх, в которых камера поворачивается с зажатой правой кнопкой мыши.
Дополнительная https://forum.uokit.com/index.php?showtopic=21749 по обходу защиты в MMORPG.
Работает только с активным окном.


Необходимое устройство и установка ПО

1. Требуется плата Arduino micro или Arduino Leonardo. https://aliexpress.ru/wholesale?SearchText=Atmega32u4+arduino можно на Aliexpress.
2. Скачать и установить Arduino IDE. https://www.arduino.cc/en/software (Windows Win7 and newer)
3. Скачать и установить драйвер CH341SER (ссылка вначале темы).
4. Открыть Arduino IDE, пункт меню 'Инструменты', выбрать тип платы и порт.
5. Скачать архив arduino.zip (ссылка вначале темы) и извлечь его.
Файл arduino.lua закинуть в папку, в которой находится exe пилота.
Скетч загрузить в ардуино. Для этого скопировать содержимое файла Скетч.txt, вставить в Arduino IDE, нажать кнопку 'Загрузка'.

Требования

Пилот версии 2.41 или выше. Запускать от администратора.
Для работы функций мыши нужно в настройках мыши снять галочку 'Включить повышенную точность установки указателя'.
В функцию get_port (2341, 8036) нужно передавать vid и pid ардуино. Узнать их можно в Arduino IDE, пункт меню 'Инструменты', 'Получить информацию о плате'.
При переполнении буфера, хотя такого не должно быть, 3 секунды будет гореть встроенный светодиод L. В этом случае нужно увеличить паузы между нажатиями клавиш мыши/клавиатуры.
Все координаты в командах мыши указывать абсолютные, т. е. относительно левого верхнего угла экрана.

Список функций

get_port (vid, pid) -- узнать в каком com порте находится ардуино

set_delay_key (ms) -- установить задержку нажатий клавиатуры
set_delay_mouse (ms) -- установить задержку нажатий мыши
set_delay_mousemove(ms) -- установить паузу в мсек между каждым шагом перемещения курсора, чем меньше, тем быстрее перемещается курсор
set_offset_mousemove(step) -- шаг перемещения курсора от 1 до 127, чем больше, тем быстрее перемещается курсор.
set_random_delay_key(random) -- рандом в мсек между нажатием и отпусканием клавиш клавиатуры
set_random_delay_mouse(random) -- рандом в мсек между нажатием и отпусканием клавиш

key (code) -- нажать клавишу клавиатуры
text (text) -- отослать текст, в том числе русские символы
key_down (code) -- зажать (не отжимая) клавишу клавиатуры
key_up (code) -- отжать клавишу клавиатуры

mouse.move (x, y) -- переместить мышь
mouse.click (x, y, button) -- кликнуть мышью, button должен содержать код клавиши мыши (смотреть список клавиш)
mouse.left (x, y) -- клик левой кнопкой
mouse.right (x, y) -- клик правой кнопкой
mouse.middle (x, y) -- клик средней кнопкой
mouse.dbl (x, y, button) -- двойной клик, button должен содержать код клавиши мыши
mouse.left_dbl (x, y) -- двойной клик левой кнопкой мыши
mouse.right_dbl (x, y) -- двойной клик правой кнопкой мыши
mouse.middle_dbl (x, y) -- двойной клик средней кнопкой мыши
mouse.down (x, y, button) -- зажать (не отжимая) кнопку мыши, button должен содержать код клавиши мыши
mouse.left_down (x, y) -- зажать (не отжимая) левую кнопку мыши
mouse.right_down (x, y) -- зажать (не отжимая) правую кнопку мыши
mouse.middle_down (x, y) -- зажать (не отжимая) среднюю кнопку мыши
mouse.up (x, y, button) -- отжать кнопку мыши, button должен содержать код клавиши мыши
mouse.left_up (x, y) -- отжать левую кнопку мыши
mouse.right_up (x, y) -- отжать правую кнопку мыши
mouse.middle_up (x, y) -- отжать среднюю кнопку мыши
mouse.drag (x, y, x2, y2) -- зажать левую кнопку мыши в точке x y, переместить в точку x2 y2
mouse.wheel_up (x, y, count) -- прокручивание колёсика мыши вверх, count - насколько щелчков прокрутить
mouse.wheel_down (x, y, count) -- прокручивание колёсика мыши вниз, count - насколько щелчков прокрутить

Список многосимвольных клавиш

mouse_left_button = 1
mouse_right_button = 2
mouse_middle_button = 4

left_ctrl = 0x80
left_shift = 0x81
left_alt = 0x82
left_gui = 0x83
right_ctrl = 0x84
right_shift = 0x85
right_alt = 0x86
right_gui = 0x87
up_arrow = 0xDA
down_arrow = 0xD9
left_arrow = 0xD8
right_arrow = 0xD7
backspace = 0xB2
tab = 0xB3
enter = 0xB0
esc = 0xB1
insert = 0xD1
delete = 0xD4
page_up = 0xD3
page_down = 0xD6
home = 0xD2
["end"] = 0xD5
caps_lock = 0xC1
f1 = 0xC2
f2 = 0xC3
f3 = 0xC4
f4 = 0xC5
f5 = 0xC6
f6 = 0xC7
f7 = 0xC8
f8 = 0xC9
f9 = 0xCA
f10 = 0xCB
f11 = 0xCC
f12 = 0xCD
F1 = 0xC2
F2 = 0xC3
F3 = 0xC4
F4 = 0xC5
F5 = 0xC6
F6 = 0xC7
F7 = 0xC8
F8 = 0xC9
F9 = 0xCA
F10 = 0xCB
F11 = 0xCC
F12 = 0xCD

Пример использования клавиатуры

Код
--lua
local hw = require'arduino'
hw.com = hw.get_port (2341, 8036)    -- указать vid и pid ардуино
if hw.com < 1 then   -- если номер порта меньше 1
     log ('error = ' .. tostring(hw.com))    -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
     end_script ()
end
hw.set_delay_key (20)     -- установить паузу между нажатиями клавиш клавиатуры
hw.set_random_delay_key(10)  -- установить рандом между нажатием и отпускание клавиш от 0 до 9 мсек
-- т. е. между нажатием и отпусканием клавиши будет пауза от 20 до 29 мсек

wait (3000)    -- пауза 3 секунды чтобы переключиться на нужное окно
hw.key ('k')    -- нажать клавишу 'k'
hw.key (hw.enter)  -- нажать 'Enter'

wait (1000)   -- пауза 1 сек.

hw.key_down ('s')   -- зажать клавишу 's'
wait (3000)         -- пауза 3 сек., при этом клавиша будет зажата
hw.key_up ('s')     -- отпустить клавишу 's'
hw.key (hw.enter)   -- нажать 'Enter'

hw.text ('Hello Привет')  -- напечатать текст
hw.key ('V')    -- нажать Shift+'v'


Пример использования мыши
Код
--lua
local hw = require'arduino'
hw.com = hw.get_port (2341, 8036)    -- указать vid и pid ардуино
if hw.com < 1 then   -- если номер порта меньше 1
     log ('error = ' .. tostring(hw.com))    -- код ошибки
     end_script ()
end
hw.set_delay_mouse (20)   -- установить паузу между нажатиями клавиш мыши
hw.set_random_delay_mouse(10)  -- установить рандом между нажатиями клавиш мыши от 0 до 9 мсек
-- т. е. между нажатием и отпусканием кнопки мыши будет пауза от 20 до 29 мсек.
hw.set_offset_mousemove(4)  -- шаг перемещения курсора, чем больше тем быстрее перемещается
hw.set_delay_mousemove(2)  -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается

hw.mouse.left (200, 100)      -- клик левой кнопкой мыши в координатах 200, 100
hw.mouse.right (200, 100)     -- клик правой кнопкой мыши
wait (3000)                   -- пауза 3 секунды
hw.mouse.left_dbl (35, 35)    -- двойной клик левой кнопкой мыши
wait (2000)
hw.mouse.left_down (200, 200) -- зажать левую кнопку мыши
wait(500)
hw.mouse.left_up (900, 300)   -- отпустить левую кнопку мыши


Автор: DarkMaster 14.12.2020, 1:22

Описание требований к арудино/закидывание скетчей и т.д. рекомендую взять из старой темы. Без этого боюсь людям будет сложно, а по разным темам растаскивать тяжело ориентироваться, да и пост может человек почистить и получится нехорошо.

Автор: Fors1k 17.12.2020, 18:38

На случай если будет лень вбивать vid и pid:

--lua
require"luaposh";hw=require"arduino";log"clear"

hw.com = PScode('R',{[[$Return=Get-ArduinoPort]]})
if type(hw.com) ~= "number" then
log("ERROR\n"..hw.com)
end_script()
end

hw.mouse.move(400200)

Автор: KotMC 10.1.2021, 0:42

Скачал UO Pilot v2.41 (31.12.2018),Скетч и модуль lua.
Записал скетч в ардуино, положил модуль в папку с пилотом. Произвел рекомендуемые настройки.
Запускаю скрипт:

скрипт

--lua
local hw = require'arduino'
hw.com = hw.get_port (2341, 8036) -- указать vid и pid ардуино
if hw.com < 1 then -- если номер порта меньше 1
log ('error = ' .. tostring(hw.com)) -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
end_script ()
end
hw.set_delay_key (20) -- установить паузу между нажатиями клавиш клавиатуры
hw.set_random_delay_key(10) -- установить рандом между нажатием и отпускание клавиш от 0 до 9 мсек
-- т. е. между нажатием и отпусканием клавиши будет пауза от 20 до 29 мсек


::me::
wait (3000) -- пауза 3 секунды чтобы переключиться на нужное окно
hw.key ('k') -- нажать клавишу 'k'
hw.key (hw.enter) -- нажать 'Enter'

goto me


Перехожу в блокнот и ничего не происходит в окне лога пилота только постоянно выводится
"0:13:59 0 (test.txt, 0): wait 1"

помогите найти ошибку.

Автор: cirus 10.1.2021, 0:57

Ардуино micro или leonardo?
Номер порта ардуино правильно определяется?

Код
hw.com = hw.get_port (2341, 8036) -- указать vid и pid ардуино
log(hw.com)  -- в логе номер порта, в котором ардуино

Перезагрузите пк или перезапустите пилот.
Для теста уберите лишние строки начиная с конца и посмотрите какая именно строка не выполняется.

Автор: KotMC 10.1.2021, 1:19

pro micro.
Если использовать этот скрипт

скрипт
--lua
local ffi = require('ffi')
local setupapi = ffi.load('SetupAPI.dll')
local advapi32 = ffi.load('Advapi32.dll')

local DIGCF_ALLCLASSES = 4
local DIGCF_PRESENT = 2
local SPDRP_HARDWAREID = 1
local DICS_FLAG_GLOBAL = 1
local DIREG_DEV = 1
local KEY_READ = 131097
local BUFF_LEN = 20
local ERROR_SUCCESS = 0
local REG_SZ = 1

ffi.cdef[[
struct HWND__ { int unused; }; typedef struct HWND__ *HWND;
struct HKEY__ { int unused; }; typedef struct HKEY__ *HKEY;
typedef HKEY *PHKEY;
typedef unsigned long ULONG;
typedef unsigned long DWORD;
typedef DWORD *LPDWORD;
typedef long LONG;
typedef DWORD *PDWORD;
typedef unsigned char BYTE;
typedef BYTE *PBYTE, *LPBYTE;
typedef wchar_t WCHAR;
typedef const char *LPCSTR, *PCSTR;
typedef unsigned long ULONG_PTR, *PULONG_PTR;
typedef void *PVOID;
typedef PVOID HDEVINFO;
typedef ULONG DEVPROPTYPE;
typedef LONG LSTATUS;
typedef DWORD ACCESS_MASK;
typedef ACCESS_MASK REGSAM;

typedef struct _GUID {unsigned long Data1; unsigned short Data2; unsigned short Data3; unsigned char Data4[8];} GUID;
typedef struct _SP_DEVINFO_DATA {DWORD cbSize; GUID ClassGuid; DWORD DevInst; ULONG_PTR Reserved;} SP_DEVINFO_DATA, *PSP_DEVINFO_DATA;

HDEVINFO SetupDiGetClassDevsA(const GUID *ClassGuid, PCSTR Enumerator, HWND hwndParent, DWORD Flags);
bool SetupDiDestroyDeviceInfoList(HDEVINFO DeviceInfoSet);
bool SetupDiEnumDeviceInfo(HDEVINFO DeviceInfoSet, DWORD MemberIndex, PSP_DEVINFO_DATA DeviceInfoData);
bool SetupDiGetDeviceRegistryPropertyA(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property,
PDWORD PropertyRegDataType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize);
HKEY SetupDiOpenDevRegKey(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData,
DWORD Scope, DWORD HwProfile, DWORD KeyType, REGSAM samDesired);
LSTATUS RegCloseKey(HKEY hKey);
LSTATUS RegQueryValueExA(HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType,LPBYTE lpData, LPDWORD lpcbData);
]]
function get_port(vid, pid)
if vid == nil then return -1 end
if pid == nil then return -2 end

local com
local DeviceInfoSet = ffi.new('HDEVINFO')
local DeviceIndex = 0
local DeviceInfoData = ffi.new('SP_DEVINFO_DATA', 0)
local DevEnum = ffi.new('PCSTR', "USB")
local ExpectedDeviceId = 'VID_' .. tostring(vid) .. '&PID_' .. tostring(pid)
local szBuffer = ffi.new('unsigned char[1024]', 0)
local ulPropertyType = ffi.new('DEVPROPTYPE[1]')
local dwSize = ffi.new('PDWORD')
DeviceInfoSet = setupapi.SetupDiGetClassDevsA(nil, DevEnum, nil, bit.bor(DIGCF_ALLCLASSES, DIGCF_PRESENT))
DeviceInfoData.cbSize = ffi.sizeof(DeviceInfoData)

while setupapi.SetupDiEnumDeviceInfo(DeviceInfoSet, DeviceIndex, DeviceInfoData) do
DeviceIndex = DeviceIndex + 1
if (setupapi.SetupDiGetDeviceRegistryPropertyA(DeviceInfoSet, DeviceInfoData, SPDRP_HARDWAREID, ulPropertyType, szBuffer, ffi.sizeof(szBuffer), dwSize)) then
if ffi.string(szBuffer):match(ExpectedDeviceId) then
local hDeviceRegistryKey = ffi.new('HKEY')
hDeviceRegistryKey = setupapi.SetupDiOpenDevRegKey(DeviceInfoSet, DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
local pszPortName = ffi.new('char[?]', BUFF_LEN)
local dwSize = ffi.new('DWORD[1]', ffi.sizeof(pszPortName))
local dwType = ffi.new('DWORD[1]')
if advapi32.RegQueryValueExA(hDeviceRegistryKey, "PortName", nil, dwType, pszPortName, dwSize) == ERROR_SUCCESS and dwType[0] == REG_SZ then
com = tonumber(ffi.string(pszPortName):match('%d+'))
end
end
advapi32.RegCloseKey(hDeviceRegistryKey)
end
end
setupapi.SetupDiDestroyDeviceInfoList(DeviceInfoSet)
if com then return com end
return 0
end

-- узнать номер порта, передавать vid, pid
local COM = get_port(2341, 8036) -- указать нужные vid и pid
log(COM)


Порт определятся верно.

Убрал строки до такого состояния отрабатывает только задержка.
скрипт
--lua
local hw = require'arduino'
hw.com = hw.get_port (2341, 8036) -- указать vid и pid ардуино
if hw.com < 1 then -- если номер порта меньше 1
log ('error = ' .. tostring(hw.com)) -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
end_script ()
end

::me::
wait (3000) -- пауза 3 секунды чтобы переключиться на нужное окно
hw.key ('k') -- нажать клавишу 'k'
goto me

В логе после его запуска это:
1:10:56 0 (test 210110 010231.txt, 0): wait 3000
1:10:59 0 (test 210110 010231.txt, 0): wait 1
1:10:59 0 (test 210110 010231.txt, 0): wait 1
1:10:59 0 (test 210110 010231.txt, 0): wait 1
1:10:59 0 (test 210110 010231.txt, 0): wait 1

Автор: cirus 10.1.2021, 2:00

Цитата
wait 1

Значит порт недоступен для открытия. Попробуйте скетч загрузить ещё раз, перезагрузить пк.

Автор: KotMC 10.1.2021, 2:11

Совершенно верно, все работает. Только не на этом компе, а на другом.
1пк Win 7 - не работает.
2пк Win 10 - работает.

Пока для меня это явные отличия между двумя компами. Буду разбираться почему не хочет работать на 1.
Спасибо за помощь!!!

Ещё такой момент, в место символа 'k' пишет символ 'л', а если сменить раскладку клавиатуры подключенной к компьютеру клавиатуры набирает правильный символ как это побороть?

Автор: cirus 10.1.2021, 2:13

Цитата
Ещё такой момент, в место символа 'k' пишет символ 'л', а если сменить раскладку клавиатуры подключенной к компьютеру клавиатуры набирает правильный символ как это побороть?

text вместо key.

Автор: kyja 14.1.2021, 15:59

Подскажите как Arduino работает для виртуалок то есть например включены 3 виртуалки vmware workstation и со всеми тремя Arduino сможет одновременно работать?

И например такая плата подойдет?
https://aliexpress.ru/item/1005001742819480.html

Автор: cirus 14.1.2021, 17:17

Цитата
Подскажите как Arduino работает для виртуалок

Без понятия. Команды Arduino получает через com порт так что его точно придётся включать.
Цитата
И например такая плата подойдет?
https://aliexpress.ru/item/1005001742819480.html

Подойдёт.

Автор: KotMC 18.1.2021, 1:28

Отрабатывает один раз, при повторном запуске UO Pilot зависает намертво при использовании этого скрипта:

скрипт

--lua

local hw = require'arduino'
hw.com = hw.get_port (2341, 8036) -- указать vid и pid ардуино
if hw.com < 1 then -- если номер порта меньше 1
log ('error = ' .. tostring(hw.com)) -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
end_script ()
end

hw.set_delay_mouse (20) -- установить паузу между нажатиями клавиш мыши
hw.set_random_delay_mouse(10) -- установить рандом между нажатиями клавиш мыши от 0 до 9 мсек
-- т. е. между нажатием и отпусканием кнопки мыши будет пауза от 20 до 29 мсек.
hw.set_offset_mousemove(4) -- шаг перемещения курсора, чем больше тем быстрее перемещается
hw.set_delay_mousemove(2) -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается

local startX, startY, endX, endY = 530, 180, 757, 254 -- координаты поиска
local path = [["C:\img\img1.bmp"]] -- путь к картинке, bmp 24 бита
local arr, a = findimage (startX, startY, endX, endY, {path}, 2) -- поиск картинки
hint (a) -- результат поиска, подсказка в правом нижнем углу
if arr then -- если найдена
log ("Изображение найдено в координатах X= " .. arr[1][1] .. " Y= " .. arr[1][2])
hw.mouse.move (651, 225) -- переместить мышь
end


А если использовать этот то все работает многократно

скрипт

--lua

local hw = require'arduino'
hw.com = hw.get_port (2341, 8036) -- указать vid и pid ардуино
if hw.com < 1 then -- если номер порта меньше 1
log ('error = ' .. tostring(hw.com)) -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
end_script ()
end

--hw.set_delay_mouse (20) -- установить паузу между нажатиями клавиш мыши
--hw.set_random_delay_mouse(10) -- установить рандом между нажатиями клавиш мыши от 0 до 9 мсек
-- т. е. между нажатием и отпусканием кнопки мыши будет пауза от 20 до 29 мсек.
--hw.set_offset_mousemove(4) -- шаг перемещения курсора, чем больше тем быстрее перемещается
--hw.set_delay_mousemove(2) -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается

local startX, startY, endX, endY = 530, 180, 757, 254 -- координаты поиска
local path = [["C:\img\img1.bmp"]] -- путь к картинке, bmp 24 бита
local arr, a = findimage (startX, startY, endX, endY, {path}, 2) -- поиск картинки
hint (a) -- результат поиска, подсказка в правом нижнем углу
if arr then -- если найдена
log ("Изображение найдено в координатах X= " .. arr[1][1] .. " Y= " .. arr[1][2])
--hw.mouse.move (651, 225) -- переместить мышь
end


Из за чего такое может происходить?

Автор: DarkMaster 18.1.2021, 1:41

Если во втором скрипте раскомментировать:

Цитата
--hw.mouse.move (651, 225) -- переместить мышь

Проблема появится?

Если нет, то подозреваю проблема вот в этих переменных:
--hw.set_random_delay_mouse(10) -- установить рандом между нажатиями клавиш мыши от 0 до 9 мсек
-- т. е. между нажатием и отпусканием кнопки мыши будет пауза от 20 до 29 мсек.
--hw.set_offset_mousemove(4) -- шаг перемещения курсора, чем больше тем быстрее перемещается
--hw.set_delay_mousemove(2) -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается

Раскомментируйте строки по одной и смотрите результат. Проверять все варианты бессмыленно.

Автор: cirus 18.1.2021, 1:45

Цитата
Отрабатывает один раз
Из за чего такое может происходить?

По какой-то причине порт не закрывается. В результате при повтором запуске скрипта он просто ждёт когда порт будет доступен для открытия.
Такое может быть только если остановить скрипт во время выполнения команды ардуино. Других причин не знаю.
У меня работает этот скрипт.

Автор: DarkMaster 18.1.2021, 4:21

Цитата
В результате при повтором запуске скрипта он просто ждёт когда порт будет доступен для открытия.

Хм... А можно как-то закрыть порт без ребута железки? Так каждый раз при некорректном завершении скрипта дергать задолбаешься)

Автор: KotMC 18.1.2021, 8:34

Если во втором скрипте раскомментировать:

--hw.mouse.move (651, 225) -- переместить мышь

то все работает без зависаний.

Раскомментирование любой из этих строк:

--hw.set_random_delay_mouse(10) -- установить рандом между нажатиями клавиш мыши от 0 до 9 мсек
-- т. е. между нажатием и отпусканием кнопки мыши будет пауза от 20 до 29 мсек.
--hw.set_offset_mousemove(4) -- шаг перемещения курсора, чем больше тем быстрее перемещается
--hw.set_delay_mousemove(2) -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается

приводит к полному зависанию пилота, которое лечится только через диспетчер задач.

Автор: cirus 18.1.2021, 13:16

Цитата
А можно как-то закрыть порт без ребута железки?

Пилот надо перезапускать в таких случаях. Порт открывается с помощью CreateFile, закрывать через CloseHandle. Тоже самое что с файлами, пока программа использует файл другая не может использовать его.

KotMC, этот файл в папку с пилотом закиньте Прикрепленный файл  arduino.lua ( 21,69 килобайт ) Кол-во скачиваний: 473

В лог будет выводить сообщение что порт открыт и закрыт.
код
Код
--lua
local hw = require'arduino'
hw.com = hw.get_port (2341, 8036) -- указать vid и pid ардуино
if hw.com < 1 then -- если номер порта меньше 1
log ('error = ' .. tostring(hw.com)) -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
end_script ()
end

log 'clear' log 'mode compact'
log('установить паузу между нажатиями клавиш мыши')
hw.set_delay_mouse (20) -- установить паузу между нажатиями клавиш мыши

log('\r\nустановить рандом между нажатиями клавиш мыши')
hw.set_random_delay_mouse(10) -- установить рандом между нажатиями клавиш мыши от 0 до 9 мсек

log('\r\nустановить шаг перемещения курсора')
hw.set_offset_mousemove(4) -- шаг перемещения курсора, чем больше тем быстрее перемещается

log('\r\nустановить паузу между каждый шагом перемещения мыши')
hw.set_delay_mousemove(2) -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается

log(hw.offset_mousemove)
log(hw.delay_mousemove)
log(hw.delay_mouse )
log(hw.random_delay_mouse)

log('\r\nперемещение курсора')
hw.mouse.move (651, 225) -- переместить мышь

После выполнения скрипта в логе должно быть это:
log
установить паузу между нажатиями клавиш мыши
Открытие порта
Порт открыт
Закрытие порта: true

установить рандом между нажатиями клавиш мыши
Открытие порта
Порт открыт
Закрытие порта: true

установить шаг перемещения курсора
Открытие порта
Порт открыт
Закрытие порта: true

установить паузу между каждый шагом перемещения мыши
Открытие порта
Порт открыт
Закрытие порта: true
4
2
20
10

перемещение курсора
Открытие порта
Порт открыт
Закрытие порта: true

Автор: KotMC 18.1.2021, 21:48

Цитата(cirus @ 18.1.2021, 13:16) *

Пилот надо перезапускать в таких случаях. Порт открывается с помощью CreateFile, закрывать через CloseHandle. Тоже самое что с файлами, пока программа использует файл другая не может использовать его.

KotMC, этот файл в папку с пилотом закиньте Прикрепленный файл  arduino.lua ( 21,69 килобайт ) Кол-во скачиваний: 473

В лог будет выводить сообщение что порт открыт и закрыт.
код
Код
--lua
local hw = require'arduino'
hw.com = hw.get_port (2341, 8036) -- указать vid и pid ардуино
if hw.com < 1 then -- если номер порта меньше 1
log ('error = ' .. tostring(hw.com)) -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
end_script ()
end

log 'clear' log 'mode compact'
log('установить паузу между нажатиями клавиш мыши')
hw.set_delay_mouse (20) -- установить паузу между нажатиями клавиш мыши

log('\r\nустановить рандом между нажатиями клавиш мыши')
hw.set_random_delay_mouse(10) -- установить рандом между нажатиями клавиш мыши от 0 до 9 мсек

log('\r\nустановить шаг перемещения курсора')
hw.set_offset_mousemove(4) -- шаг перемещения курсора, чем больше тем быстрее перемещается

log('\r\nустановить паузу между каждый шагом перемещения мыши')
hw.set_delay_mousemove(2) -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается

log(hw.offset_mousemove)
log(hw.delay_mousemove)
log(hw.delay_mouse )
log(hw.random_delay_mouse)

log('\r\nперемещение курсора')
hw.mouse.move (651, 225) -- переместить мышь

После выполнения скрипта в логе должно быть это:
log
установить паузу между нажатиями клавиш мыши
Открытие порта
Порт открыт
Закрытие порта: true

установить рандом между нажатиями клавиш мыши
Открытие порта
Порт открыт
Закрытие порта: true

установить шаг перемещения курсора
Открытие порта
Порт открыт
Закрытие порта: true

установить паузу между каждый шагом перемещения мыши
Открытие порта
Порт открыт
Закрытие порта: true
4
2
20
10

перемещение курсора
Открытие порта
Порт открыт
Закрытие порта: true



Всё сделал в точности, работает раз через раз. То выводит полный лог, то зависает. Если в момент зависания вытащить arduino и заново вставить, лог начнет двигаться и так за несколько раз вытаскивания вставления лог доходит до конца , после этого может несколько раз работать без зависаний.

Изначально стоял драйвер, который идёт при установки ArduinoIDE, пробовал менять его на драйвер из шапки, с ним не работает вовсе. Все делаю на заново установленной win10.

Вешает пилот однозначно arduino.

Автор: cirus 18.1.2021, 22:06

Попробуйте другие драйвера, они могут отличаться.

Автор: KotMC 19.1.2021, 3:17

Перепробовал много разных драйверов результат один, либо сразу зависает либо на втором, третьем пуске.
Поставил win 7 с "родными" драйверами из ArduinoIDE работает более менее стабильно, если зациклить скрипт будет работать пока не отключишь. Драйвер из шапки не смог поставить.

А вот в ручную все же можно повесить порт или пилота - частым запуском, если не делать паузу в секунд 5, после посл вывода:

перемещение курсора
Открытие порта
Порт открыт
Закрытие порта: true




Автор: cirus 19.1.2021, 3:39

Цитата
А вот в ручную все же можно повесить порт или пилота - частым запуском

Тут и стараться не надо. Остановка скрипта при открытом порте и после этого потребуется перезапуск пилота.

Можно ещё длл попробовать, но в скорее всего ничего не изменится, т. к. в ней тот же самый код.
Прикрепленный файл  Arduino.zip ( 101,33 килобайт ) Кол-во скачиваний: 282

Архив распаковать и закинуть в папку с пилотом. Тестил только на win10.
Пример использования:
код
Код
--lua
local ffi = require("ffi")
log 'clear' log 'mode compact'
local hw = ffi.load('Arduino.dll')

ffi.cdef[[
    int get_port(int VID, int PID);
    int set_port(int com);
    int set_delay_mouse(int ms);
    int set_delay_mousemove(int ms);
    int set_offset_mousemove(int step);
    int set_random_delay_mouse(int rand);
    int mouse_move(int x, int y);
]]

local com = hw.get_port(2341, 8036)
hint('Номер порта: ' .. tostring(com))
if com < 1 then -- если номер порта меньше 1
log ('error = ' .. tostring(com)) -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
end_script ()
end

hw.set_port(com)
hw.set_delay_mouse (20) -- установить паузу между нажатиями клавиш мыши
hw.set_random_delay_mouse(10) -- установить рандом между нажатиями клавиш мыши от 0 до 9 мсек
hw.set_offset_mousemove(4) -- шаг перемещения курсора, чем больше тем быстрее перемещается
hw.set_delay_mousemove(2) -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается

hw.mouse_move (651, 225) -- переместить мышь

Автор: KotMC 19.1.2021, 23:06

Цитата(cirus @ 18.1.2021, 13:16) *

KotMC, этот файл в папку с пилотом закиньте Прикрепленный файл  arduino.lua ( 21,69 килобайт ) Кол-во скачиваний: 473



Этот модуль можно использовать вместо , модуля из шапки?
Список функций для него не меняется?

Зависания пилота происходили скорее всего из-за ноутбука. На двух из трех usb портов работает с рандомными завываниями, на одном более менее стабильно. Проверил на других компьютерах - пилот, модуль, ардуино, скрипт работаю нормально.


Автор: cirus 19.1.2021, 23:46

Цитата
Этот модуль можно использовать вместо , модуля из шапки?

Можно. И не только в пилоте, а любой другой программе, которая может подключать библиотеки.
Цитата
Список функций для него не меняется?

Вызов некоторых функций отличается.
Список функций Arduino.dll
Код
--lua
local ffi = require("ffi")
local hw = ffi.load('Arduino.dll')

ffi.cdef[[
    int get_port (int vid, int pid);
    int set_port (int COMport);
    int set_delay_key (int ms);
    int set_delay_mouse (int ms);
    int set_delay_mousemove(int ms);
    int set_offset_mousemove(int step);
    int set_random_delay_key(int rand);
    int set_random_delay_mouse(int rand);

    int key (int code);
    int key_down (int code);
    int key_up (int code);
    int text (const char* text);

    int mouse_move (int x, int y);
    int mouse_click (int button);
    int mouse_click_dbl (int button);
    int mouse_left (int x, int y);
    int mouse_right (int x, int y);
    int mouse_middle (int x, int y);

    int mouse_left_dbl (int x, int y);
    int mouse_right_dbl (int x, int y);
    int mouse_middle_dbl (int x, int y);

    int mouse_left_down (int x, int y);
    int mouse_right_down (int x, int y);
    int mouse_middle_down (int x, int y);

    int mouse_left_up (int x, int y);
    int mouse_right_up (int x, int y);
    int mouse_middle_up (int x, int y);

    int mouse_drag_left (int x, int y, int x2, int y2);
    int mouse_drag_right (int x, int y, int x2, int y2);

    int mouse_wheel_up (int x, int y, int count);
    int mouse_wheel_down (int x, int y, int count);
]]

Т. е. вместо hw.mouse.move (651, 225) надо hw.mouse_move (651, 225).

Автор: KotMC 20.1.2021, 0:17

Про Arduino.dll понятно, а модуль Arduino.lua из "сообщения 17", чем отличается от модуля из шапки?
Только выводом информации в лог об открытии закрытии порта или еще чем-то?
Его тоже можно использовать?

Автор: cirus 20.1.2021, 0:36

Цитата
а модуль Arduino.lua из "сообщения 17", чем отличается от модуля из шапки?

Только вывод в лог добавлен.

Автор: kyja 28.1.2021, 1:32

Подскажите пожалуйста как можно решить проблему крайне медленной работы на vmware workstation 16?
Фактически все работает но время выполнения просто огромное, на virtualbox такой проблемы нету вообще там все как на обычном пк все отрабатывает согласно задержкам

Автор: kyja 1.2.2021, 1:28

Цитата(kyja @ 28.1.2021, 1:32) *

Подскажите пожалуйста как можно решить проблему крайне медленной работы на vmware workstation 16?
Фактически все работает но время выполнения просто огромное, на virtualbox такой проблемы нету вообще там все как на обычном пк все отрабатывает согласно задержкам

Если кому то интересно то для vmware это решилось с помощью USB over Network https://www.fabulatech.com/usb-over-network.html но так же она есть на торентах (странно конечно что родное подключение от vmware работает хуже чем стороний софт при по сути одинаковой логике проброса юсб у обоих через tcp/ip если не ошибаюсь) возможно это глюк именно для arduino потому что если замерить скорость флешки через CrystalDiskMark то разница у хоста и виртаулки будет всего 5-15% но проброшенный arduino работает в ~500 раз медленней чем на хосте

И еще вопрос вомзожно ли подключатся не через
Код
hw.com = hw.get_port (2341, 8036)    -- указать vid и pid ардуино

vid и pid а через например номер com порта?
у них ведь у всех он одинаков и если запустить несколько пилотов он ведь не поймет к какому именно устройству надо подсоединятся


Код
--lua
require"luaposh";hw=require"arduino";log"clear"

hw.com = PScode('R',{[[$Return=Get-ArduinoPort]]})
if type(hw.com) ~= "number" then
    log("ERROR\n"..hw.com)
    end_script()
end

hw.mouse.move(400, 200)

Или это и есть способ подключатся именно к определенному com порту? (у меня не получилось)

Автор: cirus 1.2.2021, 1:42

Цитата
вомзожно ли подключатся не через
hw.com = hw.get_port (2341, 8036) -- указать vid и pid ардуино
vid и pid а через например номер com порта?

Код
hw.com = 3  -- 3й порт

Автор: kyja 1.2.2021, 1:49

Цитата(cirus @ 1.2.2021, 1:42) *

Код
hw.com = 3  -- 3й порт


Большое спасибо

Автор: kyja 9.2.2021, 22:21

Подскажите а как используя Arduino.dll
отправить нажатие кнопок

Код
hw.key (hw.enter)   -- нажать 'Enter'
hw.text ('Hello Привет')  -- напечатать текст
hw.key ('V')    -- нажать Shift+'v'

Enter получилось так
Код
hw.key (0xB0) 

а вот обычные буквы вообще не понял

Автор: Fors1k 10.2.2021, 0:05

Цитата(kyja @ 9.2.2021, 22:21) *

обычные буквы вообще не понял

Код
hw.key ('k')    -- нажать клавишу 'k'

Так не отправляется?
Выложите код, который запускаете, но не происходят нажатия клавиш.

Автор: kyja 10.2.2021, 0:20

скрипт
Код
 --lua
local ffi = require("ffi")
local hw = ffi.load('Arduino.dll')

ffi.cdef[[
int get_port (int vid, int pid);
    int get_port (int vid, int pid);
    int set_port (int COMport);
    int set_delay_key (int ms);
    int set_delay_mouse (int ms);
    int set_delay_mousemove(int ms);
    int set_offset_mousemove(int step);
    int set_random_delay_key(int rand);
    int set_random_delay_mouse(int rand);

    int key (int code);
    int key_down (int code);
    int key_up (int code);
    int text (int text);

    int mouse_move (int x, int y);
    int mouse_click (int button);
    int mouse_click_dbl (int button);
    int mouse_left (int x, int y);
    int mouse_right (int x, int y);
    int mouse_middle (int x, int y);

    int mouse_left_dbl (int x, int y);
    int mouse_right_dbl (int x, int y);
    int mouse_middle_dbl (int x, int y);

    int mouse_left_down (int x, int y);
    int mouse_right_down (int x, int y);
    int mouse_middle_down (int x, int y);

    int mouse_left_up (int x, int y);
    int mouse_right_up (int x, int y);
    int mouse_middle_up (int x, int y);

    int mouse_drag_left (int x, int y, int x2, int y2);
    int mouse_drag_right (int x, int y, int x2, int y2);

    int mouse_wheel_up (int x, int y, int count);
    int mouse_wheel_down (int x, int y, int count);
]]

local com = hw.get_port(2341, 8036)
--hint('Номер порта: ' .. tostring(com))
if com < 1 then -- если номер порта меньше 1
log ('error = ' .. tostring(com)) -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
end_script ()
end

hw.set_port(com)
hw.set_delay_mouse (95)   -- установить паузу между нажатиями клавиш мыши
hw.set_random_delay_mouse(15)  -- установить рандом между нажатиями клавиш мыши от 0 до 15 мсек
hw.set_offset_mousemove(6)  -- шаг перемещения курсора, чем больше тем быстрее перемещается
hw.set_delay_mousemove(6)  -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается
hw.set_delay_key (325) -- установить задержку нажатий клавиатуры
hw.set_random_delay_key(95) -- рандом в мсек между нажатием и отпусканием клавиш клавиатуры

wait (3000 + math.random (20))


hw.key ('k')   -- нажать
wait (75 + math.random (30))
hw.key (0xB0)   -- нажать
wait (375 + math.random (30))


В таком виде тоже не работает
hw.key (k) -- нажать
но все что Hexadecimal значение отлично проходят


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: KotMC 10.2.2021, 0:44

Цитата

Вызов некоторых функций отличается.
Список функций Arduino.dll


Список функций Arduino.dll
Код
--lua
local ffi = require("ffi")
local hw = ffi.load('Arduino.dll')

ffi.cdef[[
int get_port (int vid, int pid);
int set_port (int COMport);
int set_delay_key (int ms);
int set_delay_mouse (int ms);
int set_delay_mousemove(int ms);
int set_offset_mousemove(int step);
int set_random_delay_key(int rand);
int set_random_delay_mouse(int rand);

int key (int code);
int key_down (int code);
int key_up (int code);
int text (int text);

int mouse_move (int x, int y);
int mouse_click (int button);
int mouse_click_dbl (int button);
int mouse_left (int x, int y);
int mouse_right (int x, int y);
int mouse_middle (int x, int y);

int mouse_left_dbl (int x, int y);
int mouse_right_dbl (int x, int y);
int mouse_middle_dbl (int x, int y);

int mouse_left_down (int x, int y);
int mouse_right_down (int x, int y);
int mouse_middle_down (int x, int y);

int mouse_left_up (int x, int y);
int mouse_right_up (int x, int y);
int mouse_middle_up (int x, int y);

int mouse_drag_left (int x, int y, int x2, int y2);
int mouse_drag_right (int x, int y, int x2, int y2);

int mouse_wheel_up (int x, int y, int count);
int mouse_wheel_down (int x, int y, int count);
]]

Т. е. вместо hw.mouse.move (651, 225) надо hw.mouse_move (651, 225).


Если не ошибаюсь здесь ответ.

Автор: kyja 10.2.2021, 0:52

Цитата(KotMC @ 10.2.2021, 0:44) *

Если не ошибаюсь здесь ответ.

Это мышка с ней проблем нет, и Hexadecimal значениями тоже все ок но вот именно просто кнопка k
(я бы и Hexadecimal заменил все клавиши но не смог найти на сайте ардуино список по всем символам)

Автор: KotMC 10.2.2021, 1:11

Сайт ардуино отправляет к этой табличке http://www.asciitable.com/ за доп кодами и их описанием.

Автор: Fors1k 10.2.2021, 1:16

Сейчас установлю arduino, попробую dll.

Автор: Fors1k 10.2.2021, 1:41

Пробуйте. cirus придёт, может что подправит.

--lua
log 'clear';log 'mode compact'
ffi = require("ffi")
hw  = ffi.load('Arduino.dll')

ffi.cdef[[
int get_port(int VIDint PID);
int set_port(int com);
int key(int code);
int text(const chartext);
]]

com = hw.get_port(23418036)
if com < 1 then
log ('error = ' .. tostring(com))
end_script ()
end
hw.set_port(com)
--//
exec ("notepad.exe")
wait(1000)
showwindow(findwindow ("Блокнот")[1][1])
wait(100)
hw.key(0x4B-- Нажать K
wait(500)
hw.text(' Hello Привет'-- напечатать текст

Автор: cirus 10.2.2021, 2:00

Цитата
hw.key(0x4B) -- Нажать K

Можно так сделать:
Код
local enter = 0xB0
function _key(symbol)
    hw.key(symbol:byte())
end

_key('k')   -- нажать k
_key('Z')   -- нажать Shift+z
hw.key(enter)    -- нажать enter

Автор: kyja 10.2.2021, 23:13

Спасибо да табличка с кодами решила проблемы а function _key(symbol) так вообще идеально.

Автор: kyja 19.2.2021, 0:50

Подскажите почему может не срабатывать рандом смешение у hw.mouse.move, пробовал такие варианты не срабатывает не один

Код
local x, y = 37, 533, 50, 50, -50, -52 
hw.mouse.move (x, y)


Код
hw.mouse.move (37, 533, 50, 50, -50, -52) 


Код
hw.mouse.move (39, 537, 5, 10, -7, -12) 
local x, y = mouse_pos ()
hw.mouse.left (x, y, 50, 50, -50, -50)

Автор: cirus 19.2.2021, 1:46

Цитата
пробовал такие варианты не срабатывает не один

Потому что они все неправильные.
Код
--lua
math.randomseed(os.clock())
function rand(x, y, x_plus, y_plus, x_minus, y_minus)
    return x+math.random(x_minus, x_plus), y+math.random(y_minus, y_plus)
end

local x, y = rand(37, 533, 50, 50, -50, -52)
log (x, y)


Автор: KotMC 20.2.2021, 19:48

Скажите, а такое написание:

hw.mouse.move (arr[1][1] + (1 + math.random (50), arr[1][2] + (1 + math.random (50))

допустимо, для "случайного" перемещения курсора?

Автор: Madeus 20.2.2021, 20:30

Код
hw.mouse.move (arr[1][1] + math.random (50), arr[1][2] + math.random (50))


В начале скрипта обязательно добавить один раз строку
Код
math.randomseed(os.clock())

Иначе рандом будет рандомным ровно 1 раз)

Автор: DarkMaster 21.2.2021, 3:14

Цитата
Иначе рандом будет рандомным ровно 1 раз)

И да и нет. Распределение будет близко к нормальному, но порядок выпадения чисел после каждого пререзапуска будет стабильным.

Автор: KotMC 22.2.2021, 23:50

"Вернулась" проблема с не закрытием порта, которая вешает пилот.

Один и тот же скрипт может работать часами, а может подвесить пилота уже через 10-15 минут работы, пробовал на разных компьютерах, плюс минус поведение одинаковое.

Ребят подскажите как поставить драйвер из шапки в замен, стандартного драйвера от Arduino IDE.

Ручную остановку скрипта при "открытом порте" - усвоил и избегаю, а какие факторы (команды) в скрипте могут влиять на, не возможность закрытия порта?

Другими словами может ли сам скрипт не давать закрыть порт, соответственно подвешивать пилота?

Автор: cirus 23.2.2021, 0:15

Нужен минимальный код, который приводит к зависанию.

Цитата
как поставить драйвер из шапки в замен

Запустить exe и нажать install.




Автор: KotMC 23.2.2021, 0:19

А зачем нам вообще этот драйвер из шапки, если у нас на плате нет преобразователей usb-uart, ведь он встроен в саму Atmega32u4?

Автор: kyja 23.2.2021, 12:03

Тоже периодически сталкивался с зависаниями но у меня не чистое подключение а проброс в виртуалки.
Из команд как по крайне мере мне показалось это все что связано с зажатиями hw.key_down ('h') отказался от них и вроде лучше
Так же не провереный на длинной дистанции но тоже непонятно почему дольще работает это покдлючение к порту а не hw.com = hw.get_port (2341, 8036) а hw.com = 6
И не dll а .lua через dll очень не долго работает
Пробовал и нам ram диск класть пилота но это вообще ничего не дало вроде
И конечно 10 винда сборок пробовал много разных остановился на 21h1 на 7 вообще печально все работает

Подскажите пожалуйста как сместить курсор в лево/право на 3 пикселя относительно позиции курсора, на просто lua работал такой вариант c ардуино не работает такое смешение влево/вправо всегда тянет вверх

скрипт

Код
wait (70 + math.random (100))
hw.mouse.move (1071, 472) -- было  move_smooth (1071, 472)
wait (125 + math.random (20))
local x, y = mouse_pos ()
hw.mouse.right_down (x, y)   -- было right_down (x, y)
wait (125 + math.random (20))

if color(1791, 610 ) == 3951049  then  
local x, y = mouse_pos ()
clickoffsetx (3 + math.random (2))
hw.mouse.move (x, y)           --было move_smooth (x, y)          
local x, y = mouse_pos ()
end

local x, y = mouse_pos ()
hw.mouse.right_up (x, y)   -- было right_up (x, y)

Автор: cirus 23.2.2021, 12:24

Цитата
как сместить курсор в лево/право на 3 пикселя относительно позиции курсора

Код
--lua
local hw = require'arduino'
hw.com = hw.get_port (2341, 8036)    -- указать vid и pid ардуино
if hw.com < 1 then   -- если номер порта меньше 1
     log ('error = ' .. tostring(hw.com))    -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
     end_script ()
end

local x, y = mouse_pos ()
hw.mouse.move (x+3, y)     -- вправо на 3 пикселя


Автор: KotMC 23.2.2021, 12:36

При работе через модуль луа такая конструкция работала
...
hw.mouse.move (arrP[1][1], arrP[1][2])
wait (300 + math.random (100))
hw.mouse.left_down () -- зажать левую кнопку мыши
wait (300 + math.random (100))
hw.mouse.move (arrP[1][1], arrP[1][2] + (2 + math.random (3)))
wait (300 + math.random (100))
hw.mouse.left_up () -- отжать левую кнопку мыши
...

клик (зажатие) проходил

При работе через dll уже, не работает
...
hw.mouse_move (arrP[1][1], arrP[1][2])
wait (300 + math.random (100))
hw.mouse_left_down () -- зажать левую кнопку мыши
wait (300 + math.random (100))
hw.mouse_move (arrP[1][1], arrP[1][2] + (2 + math.random (3)))
wait (300 + math.random (100))
hw.mouse_left_up () -- отжать левую кнопку мыши
...

Пилот ругается на не правильный аргумент в строке "hw.mouse_left_down () и hw.mouse_left_up ()", возможно ли сделать клик (зажатие, отпускание), в том месте где уже находится курсор?

Автор: KotMC 23.2.2021, 13:02

Сам спросил, сам отвечу для моего применения можно просто удалить лишние строки в скрипте. Работать будет точно также как в первом варианте.

было

Код

hw.mouse_move (arrP[1][1], arrP[1][2])
wait (300 + math.random (100))
hw.mouse_left_down () -- зажать левую кнопку мыши
wait (300 + math.random (100))
hw.mouse_move (arrP[1][1], arrP[1][2] + (2 + math.random (3)))
wait (300 + math.random (100))
hw.mouse_left_up () -- отжать левую кнопку мыши


стало
Код

hw.mouse_move (arrP[1][1], arrP[1][2])
wait (300 + math.random (100))
hw.mouse_left_down (arrP[1][1], arrP[1][2]) -- зажать левую кнопку мыши
                               --wait (300 + math.random (100))
                               --hw.mouse_move (arrP[1][1], arrP[1][2] + (2 + math.random (3)))
wait (300 + math.random (100))
hw.mouse_left_up (arrP[1][1], arrP[1][2] + (2 + math.random (3))) -- отжать левую кнопку мыши


Перемещение "зажатого" курсора происходит, и отпускание так же работает.

И все же первоначальный вопрос не потерял актуальности
Цитата

Пилот ругается на не правильный аргумент в строке "hw.mouse_left_down () и hw.mouse_left_up ()", возможно ли сделать клик (зажатие, отпускание), в том месте где уже находится курсор?

Автор: cirus 23.2.2021, 13:02

Цитата
Пилот ругается на не правильный аргумент в строке "hw.mouse_left_down () и hw.mouse_left_up ()

Потому что надо передавать координаты, в которых зажимать. Смотрите тип и количество передаваемых параметров:
Код
int mouse_left_down (int x, int y);

Цитата
возможно ли сделать клик (зажатие, отпускание), в том месте где уже находится курсор?

код
Код
--lua
local ffi = require("ffi")
local hw = ffi.load('Arduino.dll')

local MOUSE_LEFT = 1
local MOUSE_RIGHT = 2
local MOUSE_MIDDLE = 4

ffi.cdef[[
    int get_port (int vid, int pid);
    int set_port (int COMport);
    int mouse_left (int x, int y);
    int mouse_click (int button);
    int mouse_left_down (int x, int y);
    int mouse_left_up (int x, int y);
]]


local com = hw.get_port(2341, 8036)
--hint('Номер порта: ' .. tostring(com))
if com < 1 then -- если номер порта меньше 1
log ('error = ' .. tostring(com)) -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
end_script ()
end
hw.set_port(com)

wait(3000)

hw.mouse_click(MOUSE_LEFT)    -- клик левой кнопкой мыши в текущих координатах
wait(2000)

local x, y = mouse_pos ()   -- получить текущие координаты курсора
hw.mouse_left_down (x, y)   -- зажать левую кнопку мыши
wait(2000)
hw.mouse_left_up (x+300, y-100)    -- отпустить левую кнопку мыши




Автор: KotMC 23.2.2021, 17:11

"Обрамил" всё что возможно выводом в лог, получается следующие.

Пилот зависает (открывает порт без закрытия) всегда в одном и том же месте:

Код

hw.set_port(com)
hw.set_delay_mouse (100)            -- установить паузу между нажатиями клавиш мыши
hw.set_random_delay_mouse(50)    -- установить рандом между нажатиями клавиш мыши
hw.set_offset_mousemove(5)        -- шаг перемещения курсора, чем больше тем быстрее перемещается
hw.set_delay_mousemove(5)        -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается
hw.set_delay_key (300)            -- установить задержку нажатий клавиатуры
hw.set_random_delay_key(10)        -- рандом в мсек между нажатием и отпусканием клавиш клавиатуры


Проявляется как при использовании луа модуля, так и dll.

Автор: kyja 25.2.2021, 11:50

Цитата(cirus @ 23.2.2021, 12:24) *

Код
--lua
local hw = require'arduino'
hw.com = hw.get_port (2341, 8036)    -- указать vid и pid ардуино
if hw.com < 1 then   -- если номер порта меньше 1
     log ('error = ' .. tostring(hw.com))    -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
     end_script ()
end

local x, y = mouse_pos ()
hw.mouse.move (x+3, y)     -- вправо на 3 пикселя


Если не использовать привязку к окну то все работает ок, но при привязке к окну смешение происходит вверх, подскажите как с привязаным окном смешять?

Автор: cirus 25.2.2021, 12:05

Цитата
Если не использовать привязку к окну то все работает ок, но при привязке к окну смешение происходит вверх, подскажите как с привязаным окном смешять?

В файле arduino.lua в строке mouse_pos('abs') убрать 'abs'.

Автор: Madeus 8.4.2021, 20:50

Замечена такая проблема, если подключать arduino после подключения нового findcolor вылетает ошибка
arduino.lua:208: bad argument #4 to 'CreateFileA' (cannot convert 'number' to 'struct 181 *')
если порядок изменить все ок.

Автор: cirus 9.4.2021, 1:34

Выкладывайте код, который вызывает ошибку.

Автор: Madeus 9.4.2021, 1:54

Цитата(cirus @ 9.4.2021, 1:34) *

Выкладывайте код, который вызывает ошибку.

Код
--lua
log ('clear') log ('mode compact')

local ext = require('color')
local hw = require('arduino')

hw.com = hw.get_port (2341, 8036)
if hw.com < 1 then
  log ('error = ' .. tostring(hw.com))
  end_script ()
end
hw.set_delay_key (30)
hw.set_random_delay_key(10)
hw.set_delay_mouse (30)
hw.set_random_delay_mouse(10)
hw.set_offset_mousemove(10)
hw.set_delay_mousemove(2)

Автор: cirus 9.4.2021, 2:39

Обновил архив в первом посте, теперь не должно быть ошибки.

Автор: Madeus 9.4.2021, 12:28

Цитата(cirus @ 9.4.2021, 2:39) *

Обновил архив в первом посте, теперь не должно быть ошибки.

Все ок, спасибо!

Автор: kyja 6.5.2021, 0:55

Цитата(KotMC @ 23.2.2021, 17:11) *

"Обрамил" всё что возможно выводом в лог, получается следующие.

Пилот зависает (открывает порт без закрытия) всегда в одном и том же месте:

Код

hw.set_port(com)
hw.set_delay_mouse (100)            -- установить паузу между нажатиями клавиш мыши
hw.set_random_delay_mouse(50)    -- установить рандом между нажатиями клавиш мыши
hw.set_offset_mousemove(5)        -- шаг перемещения курсора, чем больше тем быстрее перемещается
hw.set_delay_mousemove(5)        -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается
hw.set_delay_key (300)            -- установить задержку нажатий клавиатуры
hw.set_random_delay_key(10)        -- рандом в мсек между нажатием и отпусканием клавиш клавиатуры


Проявляется как при использовании луа модуля, так и dll.


Пробовали убрать из кода пилота эти строки и убрать из arduino.lua
Код
export_array.delay_key = 120   -- пауза между нажатиями клавиш. Только чтение, изменение через set_delay_key.
export_array.delay_mouse = 90 -- пауза между нажатием и отпусканием кнопок мыши. Только чтение, изменение через set_delay_mouse.
export_array.delay_mousemove = 35  -- пауза при перемещении курсора
export_array.offset_mousemove = 30 -- смещение курсора по x и y при перемещении мыши
export_array.random_delay_key = 0  -- рандом между нажатием и отпусканием клавиши клавиатуры
export_array.random_delay_mouse = 0  -- рандом между нажатием и отпусканием клавиши мыши


оставить только
export_array.com = 3 -- номер порта

А сами значения прописывать именно в скетче?
Код
int KEYBOARD_DELAY = 120;
int MOUSE_DELAY = 90;
int MOUSE_MOVE_DELAY = 35;
int MOUSE_MOVE_OFFSET = 30;
int RANDOM_KEY = 30;
int RANDOM_MOUSE = 20;


Вообще там есть закономерность при которой пилот виснет на этих строках
Она в типе подключения самого ардуино но я пока не уловил точный принцип как пойму отпишусь
В моем случаи это подключение к vmware
Но скорее всего к обычному пк тот же принцип будет
Код
hw.set_delay_mouse (100)            -- установить паузу между нажатиями клавиш мыши
hw.set_random_delay_mouse(50)    -- установить рандом между нажатиями клавиш мыши
hw.set_offset_mousemove(5)        -- шаг перемещения курсора, чем больше тем быстрее перемещается
hw.set_delay_mousemove(5)        -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается
hw.set_delay_key (300)            -- установить задержку нажатий клавиатуры
hw.set_random_delay_key(10)        -- рандом в мсек между нажатием и отпусканием клавиш клавиатуры

Автор: KotMC 6.5.2021, 20:56

цитата

Цитата(kyja @ 6.5.2021, 0:55) *

Пробовали убрать из кода пилота эти строки и убрать из arduino.lua
Код
export_array.delay_key = 120   -- пауза между нажатиями клавиш. Только чтение, изменение через set_delay_key.
export_array.delay_mouse = 90 -- пауза между нажатием и отпусканием кнопок мыши. Только чтение, изменение через set_delay_mouse.
export_array.delay_mousemove = 35  -- пауза при перемещении курсора
export_array.offset_mousemove = 30 -- смещение курсора по x и y при перемещении мыши
export_array.random_delay_key = 0  -- рандом между нажатием и отпусканием клавиши клавиатуры
export_array.random_delay_mouse = 0  -- рандом между нажатием и отпусканием клавиши мыши


оставить только
export_array.com = 3 -- номер порта

А сами значения прописывать именно в скетче?
Код
int KEYBOARD_DELAY = 120;
int MOUSE_DELAY = 90;
int MOUSE_MOVE_DELAY = 35;
int MOUSE_MOVE_OFFSET = 30;
int RANDOM_KEY = 30;
int RANDOM_MOUSE = 20;


Вообще там есть закономерность при которой пилот виснет на этих строках
Она в типе подключения самого ардуино но я пока не уловил точный принцип как пойму отпишусь
В моем случаи это подключение к vmware
Но скорее всего к обычному пк тот же принцип будет
Код
hw.set_delay_mouse (100)            -- установить паузу между нажатиями клавиш мыши
hw.set_random_delay_mouse(50)    -- установить рандом между нажатиями клавиш мыши
hw.set_offset_mousemove(5)        -- шаг перемещения курсора, чем больше тем быстрее перемещается
hw.set_delay_mousemove(5)        -- установить паузу между каждый шагом перемещения мыши, чем меньше, тем быстрее перемещается
hw.set_delay_key (300)            -- установить задержку нажатий клавиатуры
hw.set_random_delay_key(10)        -- рандом в мсек между нажатием и отпусканием клавиш клавиатуры



У меня зависания в процессе работы скрипта ушли.
По не знанию или не опытности, в первых моих скриптах "конфигурационные" параметры относящиеся к ардуино, я прописал в основном цикле который примерно раз в минуту начинался с начала. И как я понимаю из за частого установки этих параметров у меня были проблемы. Сейчас я эти параметры объявляю один раз в начале скрипта все циклы получаются за ними и вроде проблем нет.
Остался всего один момент, но он не критичен для меня, при запуске скрипта 1 раз из 100, пилот "вешается"(наверняка где-то, я опять напортачил в написание скрипта), но повторюсь если скрипт запустился он работает очень долго без зависаний и т.д.. Доходило до 2х недель без прерывной работы, наверняка могло быть и дольше, скрипт выключил сам.

kyja Спасибо, за участие!

Автор: kyja 6.5.2021, 21:23

Цитата(KotMC @ 6.5.2021, 20:56) *

1 раз из 100, пилот "вешается"

У вас скрипт работает в одной вкладке или например используется
start_script (2, "wait")
По окончанию 2 возврат в 1 скрипт (2 скрипт тоже ардуиновский)
Или просто скрипт из одной вкладки?

Автор: KotMC 7.5.2021, 19:44

Цитата(kyja @ 6.5.2021, 21:23) *

У вас скрипт работает в одной вкладке или например используется
start_script (2, "wait")
По окончанию 2 возврат в 1 скрипт (2 скрипт тоже ардуиновский)
Или просто скрипт из одной вкладки?


Одна вкладка, один скрипт.

Автор: kyja 31.7.2021, 1:24

Подскажите пожалуйста можно ли каким то образом не прибегая к
hw.key_down hw.key_up
зажатию кнопок отправить содержимое буфера?
что то вроде
hw.key (hw.clipboard)
по сути просто контрл+v но без hw.key_down hw.key_up

local text = clipboard ()
hw.text (text)
так будет именно печатается все что в буфере

Проблема в том что у меня при использование
hw.key_down hw.key_up mouse.left_down mouse.right_down все что связано с зажатиями периодически виснит скрипт

Автор: cirus 31.7.2021, 1:36

Цитата
можно ли каким то образом не прибегая к
hw.key_down hw.key_up
зажатию кнопок отправить содержимое буфера?

Нельзя.

Автор: kyja 31.7.2021, 1:36

Цитата(cirus @ 31.7.2021, 1:36) *

Нельзя.

Понял, спасибо

Автор: Crocotea 19.8.2021, 20:47

В свзяи с чем может быть проблема?
в диспетчере устройств отображается корректно микро ком 8
в самом адруино выставил свою плату и порт
Гет порт вписал свой из "получить инф о плате"

Код
20:41:23 6 (test.txt, 0): a runtime error.
59: attempt to call field 'Key' (a nil value)
--lua
local hw = require 'arduino'
hw.com = hw.get_port (2341, 8037)    -- указать vid и pid ардуино
if hw.com < 1 then   -- если номер порта меньше 1
     log ('err


Код
--lua
local hw = require 'arduino'
hw.com = hw.get_port (2341, 8037)    -- указать vid и pid ардуино
if hw.com < 1 then   -- если номер порта меньше 1
     log ('error = ' .. tostring(hw.com))    -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
     end_script ()
end
hw.set_delay_key (20)     -- установить паузу между нажатиями клавиш клавиатуры
hw.set_random_delay_key(10)  -- установить рандом между нажатием и отпускание клавиш от 0 до 9 мсек
-- т. е. между нажатием и отпусканием клавиши будет пауза от 20 до 29 мсек

wait(3000)

Автор: cirus 20.8.2021, 1:38

Приведённый код работает.

Автор: kyja 24.8.2021, 12:35

Подскажите как определить зажатие клавиш при использование ардуино
беру код с
https://forum.uokit.com/index.php?showtopic=68111&hl=%F1%EE%F1%F2%EE%FF%ED%E8%E5+%EA%EB%E0%E2%E8%F8%E8

Код

--lua
log 'clear' log 'mode compact'
wait (627 + math.random (30))
--local hw = require'arduino'
math.randomseed(os.clock())            --функция рандома
function rand(x, y, x_plus, y_plus, x_minus, y_minus)
return x+math.random(x_minus, x_plus), y+math.random(y_minus, y_plus)
end                                     --функция рандома
--проверка клавиш
do
    local back = package.path
    package.path = "luaPlugins\\winapi\\?.lua;"..package.path
    setfenv(1, require'winapi')
    require[[winapi.keyboard]]
    package.path = back
end
--проверка клавиш

-- проверка нажата ли клавиша Z
while 1 do
    local state = GetKeyState(90)  -- или  GetKeyState(0x5A)
    if  state then
        log ("Z нажата")
    else
        log ("Z не нажата")
    end
    wait (100)
end


При закоментированом --local hw = require'arduino'
все отлично работает

Если раскоментировать то выдает ошибку



Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: cirus 24.8.2021, 13:11

Цитата
Подскажите как определить зажатие клавиш при использование ардуино

Код
--lua
local ffi = require("ffi")
ffi.cdef[[ short GetAsyncKeyState(int vKey); ]]
log 'clear' log 'mode compact'
local hw = require'arduino'

-- проверка нажата ли клавиша Z
while 1 do
    local state = ffi.C.GetAsyncKeyState(90)
    if  state ~= 0 then
        log ("Z нажата")
    else
        log ("Z не нажата")
    end
    wait (100)
end


Автор: kyja 24.8.2021, 15:25

Большое спасибо

Автор: kyja 29.8.2021, 23:55

Цитата(cirus @ 24.8.2021, 13:11) *

Код
--lua
local ffi = require("ffi")
ffi.cdef[[ short GetAsyncKeyState(int vKey); ]]
log 'clear' log 'mode compact'
local hw = require'arduino'

-- проверка нажата ли клавиша Z
while 1 do
    local state = ffi.C.GetAsyncKeyState(90)
    if  state ~= 0 then
        log ("Z нажата")
    else
        log ("Z не нажата")
    end
    wait (100)
end



Почему то периодически но крайне редко, не определяет что правая кнопка не зажалась
Код

------------------------зажимаю правую
local x, y = mouse_pos ()
wait (325 + math.random (30))
hw.mouse.right_down (x, y) -- зажать правую в позиции
wait (325 + math.random (30))
------------------------зажимаю правую


    -------------проверка что правая зажалась---------
local state = ffi.C.GetAsyncKeyState(2)
    if  state ~= 0 then
        --log ("нажата")
    else
       ------------------------зажимаю правую
local x, y = mouse_pos ()
wait (325 + math.random (30))
hw.mouse.right_down (x, y) -- зажать правую в позиции
wait (325 + math.random (30))
------------------------зажимаю правую
    end
-------------проверка что правая зажалась---------

В тестах всегда все ок а вот когда скрипт работает иногда не проходит проверка
Не хватает задержек или какой то еще вариант может быть?

Автор: 1dark1 5.10.2021, 12:38

Привет.
Можете сказать как правильно составить команды для отправки через cmd

Код
echo 2 text > COM7

работает
Код
echo 1 t > COM7

не работает (пример на любой букве если можно)
Код
echo 5 (100,100) > COM7

мышь двигается только вниз(если поставить минус(-100,100) то верх но не влево вправо),как двигать в любом направлении
Код
echo 6  > COM7

тут я даже не знаю что вставлять после '6' пробывал цифры и (Mouse.click) никакой реакции

Вообщем если не затруднит напишите , может еще кому понадобиться тоже.

Автор: cirus 5.10.2021, 13:01

В файле arduino.lua можно посмотреть что отправляет нужная функция.

Цитата
пример на любой букве если можно

Код
echo 1116>COM7

Напишет букву t. 1 - означает нажать клавишу, 116 - это код клавиши.
Цитата
мышь

Код
echo 5++19660700>COM7

Переместит курсор на 300 пикселей вправо и на 200 вниз. Первый + означает что курсор смещается вправо, - будет означать влево, второй + означает смещать вниз, - это вверх. Число 19660700 считается так: 300*0xFFFF+200 или так если понятнее 300*65535+200.
Цитата
Mouse.click

Код
echo 61>COM7

Клик левой кнопкой мыши. 62 правой, 64 средней.

Автор: 1dark1 5.10.2021, 21:27

Цитата(cirus @ 5.10.2021, 13:01) *


Код
echo 5++19660700>COM7

Переместит курсор на 300 пикселей вправо и на 200 вниз. Первый + означает что курсор смещается вправо, - будет означать влево, второй + означает смещать вниз, - это вверх. Число 19660700 считается так: 300*0xFFFF+200 или так если понятнее 300*65535+200.




Спасибо за примеры (буквы сам я пробывал с "0x116")появился только вопрос по скорости перемещения мыши его каким образом регулировать?

Автор: cirus 6.10.2021, 1:40

Цитата
вопрос по скорости перемещения мыши его каким образом регулировать?

Код
echo 025>COM7

02 - установить паузу между каждым шагом перемещения курсора, 5 - пауза в мсек. Чем больше пауза тем медленнее перемещается курсор.
Код
echo 031>COM7

03 - установить шаг перемещения курсора. 1 - шаг. Чем больше, тем быстрее перемещается курсор. Шаг может быть от 1 до 127.

Автор: 1dark1 6.10.2021, 16:47

Спасибо за пояснения

Автор: Kangoshi 10.11.2021, 0:43

А как нажимать кнопки с numpad'а? Есть что-то похожее на это: hw.key (hw.F1)? Или только кодами?

Автор: cirus 10.11.2021, 1:57

Цитата
Есть что-то похожее на это: hw.key (hw.F1)?

Можно добавить в файл arduino.lua:
Код
export_array.KEYPAD_4 = 228

Либо в скрипте:
Код
local KEYPAD_4 = 228

тогда вызов будет таким:
Код
hw.key (KEYPAD_4) 


Коды клавиш:
Код
local KEYPAD_0 = 234
local KEYPAD_1 = 225
local KEYPAD_2 = 226
local KEYPAD_3 = 227
local KEYPAD_4 = 228
local KEYPAD_5 = 229
local KEYPAD_6 = 230
local KEYPAD_7 = 231
local KEYPAD_8 = 232
local KEYPAD_9 = 233


Автор: Joaquin 4.12.2021, 14:02

Добрый день. В первом посте написано, что работает только в активном окне. Kyja дальше в теме пишет про привязку к окну. Так можно все таки этот кликер к окну привязать?


Автор: Madeus 4.12.2021, 17:46

Ctrl + A или findwindow, workwindow. Примеры https://uopilot.tati.pro/index.php?title=Workwindow_(Lua)

Автор: kyja 18.2.2022, 0:37

Подскажите пожалуйста почему происходит клик в 2 точки
то есть сначала идет клик в найденный пиксель все ок
а потом моментальный второй клик в другую точку

в настройках скетча ардуино стоит
int MOUSE_DELAY = 5;
int MOUSE_MOVE_DELAY = 35;
int MOUSE_MOVE_OFFSET = 30;
int RANDOM_KEY = 20;
int RANDOM_MOUSE = 0;

то есть второй клик именно моментален хотя в первый клик мышь едет плавно как по настройкам а вот второй резкий сразу как будто игнорируются настройки
int MOUSE_MOVE_DELAY = 35;
int MOUSE_MOVE_OFFSET = 30;
но и в целом второго клика по идее быть не должно

Код
local Time = 32.235  --время работы таймера
                 local endTimer = os.clock() + Time while os.clock() <= endTimer do
                    local a = findcolor([[611, 462 1291, 677  1 1 ( 0xeeeeee-0xffffff ) %arr 2 -1 0]])  -- Цвет

                    if a > 0 then     -- если найден цвет
                    wait (1095 + math.random (30))
                    log (arr [1][1])
                    log (arr [1][2])
                    hw.mouse.left (arr [1][1], arr [1][2])
                    log (arr [1][1])
                    log (arr [1][2])
                    wait (1095 + math.random (30))
                    goto end_this_find
                    end

                    if color(1722, 638  ) ~= 16777215  then --нет каста
                    wait (585 + math.random (30))
                    break
                    end
            end
            ::end_this_find::


При использование
hw.mouse.move (arr [1][1], arr [1][2])
такой проблемы нет

arduino.lua во вложение


Прикрепленные файлы
Прикрепленный файл  arduino.lua ( 22,36 килобайт ) Кол-во скачиваний: 66

Автор: kdv 11.3.2022, 17:36

Вроде все делал как надо, но :Прикрепленное изображение

Автор: cirus 12.3.2022, 1:43

Нужна плата с контролером ATmega32u4.

Автор: kdv 12.3.2022, 9:34

А работа с другими платами возможна с uopilot?
У меня плата микро-контроллера Atmega328

Автор: cirus 12.3.2022, 10:03

Цитата
А работа с другими платами возможна с uopilot?
У меня плата микро-контроллера Atmega328

Дело не в пилоте, а в том что только платы с ATmega32u4 могут эмулировать работу мыши и клавиатуры.

Автор: kdv 12.3.2022, 10:50

Печально sad.gif

Автор: DarkMaster 17.3.2022, 22:32

Цитата
Дело не в пилоте, а в том что только платы с ATmega32u4 могут эмулировать работу мыши и клавиатуры.

Cockney мне вроде объяснял, что можно и на другой плате, просто придется перепрошивать микропрограмму самого контроллера.

Автор: cirus 18.3.2022, 1:42

Цитата
перепрошивать микропрограмму самого контроллера.

Проще купить нужную железку.

Автор: kdv 13.5.2022, 20:24

Добрый вечер, продолжил эпопею с Arduino. Она заработала, но вот выполняется скрипт 1 раз. А как его можно N ое раз повторить ?

Автор: Madeus 13.5.2022, 22:17

В цикле while, for.

Автор: kdv 14.5.2022, 10:04

Цитата(Madeus @ 13.5.2022, 22:17) *

В цикле while, for.

Попробовал FOR
Код

for #i 1 10
wait (3000)
hw.key (0xC2)
end_for

ругается, не нравится "#"
Прикрепленное изображение

Автор: DarkMaster 14.5.2022, 12:44

Потому что синтаксис должен быть Lua.

Код
--lua
for i =1, 10 do
    -- ваш код
end

Автор: kdv 14.5.2022, 15:19

Цитата(DarkMaster @ 14.5.2022, 12:44) *

Потому что синтаксис должен быть Lua.
Код
--lua
for i =1, 10 do
    -- ваш код
end



А если через Arduino, то только через Lua ?

Автор: DarkMaster 14.5.2022, 17:20

Цитата
А если через Arduino, то только через Lua ?

Да.

Автор: Gals 24.8.2022, 10:39

Я пока не понимаю ничего в arduino.
И совсем не понимаю в модуле lua.
Но нашел в интернете такую штуку, которая вроде дешевле чем ардуино в 2 раза. Програмируется так же через ide arduino.

https://aliexpress.ru/popular/digispark.html

С этим будет работать?
В Интернете пишут, что мыш и клаву оно умеет эмулировать

Автор: DarkMaster 25.8.2022, 13:37

Это бы лучше у ардуинщиков спросить. Цена вопроса 100р - можно затестить.

Автор: Madeus 9.2.2023, 22:25

На 11 винде кто-то пользуется? Перебрал кучу дров разных эффекта ноль. На 10ке эта плата работает.

Автор: Gwyn 10.4.2023, 17:37

Я так понял ардуино не умеет в мультиоконку и может кликать только в открытое окно?
Чет не понятно, кому вообще нужен кликер под одно окно? Проще тогда использовать обычные макросные мыши ( x7, razer и тд) Они то же самое могут. Зачем с этим ардуино заморачиваться...

Автор: cirus 10.4.2023, 20:53

Цитата
Зачем с этим ардуино заморачиваться

Железка стоит 5$. А мышь с макросами?
Как из кликера запускать макросы мыши?

Автор: Cockney 10.4.2023, 21:52

Цитата(Gwyn @ 10.4.2023, 17:37) *

Я так понял ардуино не умеет в мультиоконку и может кликать только в открытое окно?
Чет не понятно, кому вообще нужен кликер под одно окно? Проще тогда использовать обычные макросные мыши ( x7, razer и тд) Они то же самое могут. Зачем с этим ардуино заморачиваться...



А кому вообще нужен кликер под не одно окно ? Тут вроде никто не навязывает ничего. Каждый волен выбирать в силу своих средств/возможностей.

Цитата(cirus @ 10.4.2023, 20:53) *

Железка стоит 5$. А мышь с макросами?
Как из кликера запускать макросы мыши?



Это цена в идеальном мире, где человек собрал уже не один десяток подобных девайсов, и с легкостью за полчаса паяет уже на заказ. В реальности сначала нужно заплатить за неудачные попытки + время на сборку. Итого выйдет не менее чем мышь, которую, к слову, можно костылями заставить выполнять макросы из пилота.

Автор: cirus 10.4.2023, 22:06

Цитата
паяет

Никогда ничего не паял и не собираюсь. Подключил к usb, установил драйвер, устройство работает.

Автор: Cockney 10.4.2023, 22:25

Цитата(cirus @ 10.4.2023, 22:06) *

Никогда ничего не паял и не собираюсь. Подключил к usb, установил драйвер, устройство работает.



Речь о готовом портативном девайсе в корпусе ? Так он не 5 баксов стоит. Все остальное от ардуины это конструктор же. Это примерно голый контроллер с припаяным усб для взаимодействия.

Автор: cirus 10.4.2023, 22:56

Цитата
Это примерно голый контроллер с припаяным усб для взаимодействия

Для эмуляции мыши и клавы этого достаточно.

Автор: Cockney 14.4.2023, 21:19

Да, но сам комфорт использования...так и ssd диск можно использовать, напрямую плату подключить и все. а если часто нужно вне дома использовать ? без корпуса никак, имхо.

Автор: DarkMaster 15.4.2023, 7:54

Тяжело представляю зачем этот девайс нужно таскать куда-то регулярно с собой. Ну если прям кому-то нужно, то подойдет любая коробка и усб удлинитель. Либо залить эпоксидкой и жить счастливо. Хочется красиво - купить в корпусе. ИМХО очень частные случаи. Гораздо важднее то, что у людей на 11 винде вопросы возникли.

Автор: Madeus 15.4.2023, 8:52

Цитата(DarkMaster @ 15.4.2023, 7:54) *

Тяжело представляю зачем этот девайс нужно таскать куда-то регулярно с собой. Ну если прям кому-то нужно, то подойдет любая коробка и усб удлинитель. Либо залить эпоксидкой и жить счастливо. Хочется красиво - купить в корпусе. ИМХО очень частные случаи. Гораздо важднее то, что у людей на 11 винде вопросы возникли.

Кстати 11 винду так и не победил, пока идеи кончились...

Автор: SkyRA 7.5.2023, 15:57

Привет, далек от всего этого, у меня лишь вопрос, при выполнении инструкции в первом сообщении любой код, запущенный в УО пилоте должен отрабатывать через имитацию нажатий клавиатуры? или нужны какие-то дополнительные манипуляции

Автор: DarkMaster 10.5.2023, 16:01

У вас появляется новый метод эмуляции. Подробнее можете посмотреть в первом сообщении в спойлере "список функций".

Автор: kyja 4.7.2023, 23:29

Цитата(Madeus @ 15.4.2023, 8:52) *

Кстати 11 винду так и не победил, пока идеи кончились...

А не работает просто не выполняется код в пилоте и он висит или не определяется драйвер?
У меня определяется в ком портах как все ок
Но пилот просто висит не ошибки ничего просто как будто идет выполнение но ничего не происходит

Автор: Madeus 5.7.2023, 9:27

Цитата(kyja @ 4.7.2023, 23:29) *

А не работает просто не выполняется код в пилоте и он висит или не определяется драйвер?
У меня определяется в ком портах как все ок
Но пилот просто висит не ошибки ничего просто как будто идет выполнение но ничего не происходит

Именно так, пока не придумал как решить. Учетка "Администратора", как кто-то советовал, не помогает, что в целом и понятно, явно не туда копать надо.
По факту скрипт виснет на любом обращении к ардуинке будь то настройки или действие.

Автор: DarkMaster 5.7.2023, 19:56

Цитата
Именно так, пока не придумал как решить. Учетка "Администратора", как кто-то советовал, не помогает, что в целом и понятно, явно не туда копать надо.
По факту скрипт виснет на любом обращении к ардуинке будь то настройки или действие.

А в чистом луа пробовал запускать? Без пилота. Тупо взять luajit лучше 64 бита и подрубить? Можно дернуть сборку с luapower.com там куча модулей и luajit в нагрузку.

Автор: Madeus 5.7.2023, 21:33

Цитата(DarkMaster @ 5.7.2023, 19:56) *

А в чистом луа пробовал запускать? Без пилота. Тупо взять luajit лучше 64 бита и подрубить? Можно дернуть сборку с luapower.com там куча модулей и luajit в нагрузку.

Да пробовал, эффект тот же.

Автор: DarkMaster 6.7.2023, 17:15

А если поставить эмулятор ком портов и попробовать отправить и принять с них что-нибудь? Понять проблема в самих ком портах при работе с луа или железке.

Автор: DarkMaster 6.7.2023, 19:36

librs232lua
вот такая либа еще есть для ком портов

COMport = ffi.cast('int', ffi.C.CreateFileA('\\.\\COM' .. tostring(export_array.com), GENERIC_READ + GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nil))

попробуй заменить на
COMport = ffi.cast('int', ffi.C.CreateFileA('\\.\\COM' .. tostring(export_array.com)..":", GENERIC_READ + GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nil))

двоеточие после порта добавлено


так же в тестовом режиме попробуй отослать ручками на железку через
io.open("COM123:", "wb")

Автор: Madeus 6.7.2023, 20:59

Цитата(DarkMaster @ 6.7.2023, 19:36) *

librs232lua
вот такая либа еще есть для ком портов

COMport = ffi.cast('int', ffi.C.CreateFileA('\\.\\COM' .. tostring(export_array.com), GENERIC_READ + GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nil))

попробуй заменить на
COMport = ffi.cast('int', ffi.C.CreateFileA('\\.\\COM' .. tostring(export_array.com)..":", GENERIC_READ + GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nil))

двоеточие после порта добавлено
так же в тестовом режиме попробуй отослать ручками на железку через
io.open("COM123:", "wb")

io.open отсылает, ну лампочка моргает по крайней мере, добавить ':' не помогло

Автор: DarkMaster 8.7.2023, 3:16

а нормальным методом не моргала? эмуляцию при этом железка выполнила?

Автор: Madeus 8.7.2023, 11:19

Цитата(DarkMaster @ 8.7.2023, 3:16) *

а нормальным методом не моргала? эмуляцию при этом железка выполнила?

Обычным методом не моргала, вообще ничего не происходит.
Код
--lua

local hw = require'arduino'
hw.com = hw.get_port (2341, 8036)    -- указать vid и pid ардуино
if hw.com < 1 then   -- если номер порта меньше 1
  log('error = ' .. tostring(hw.com))    -- код ошибки
  end_script ()
else
  log(hw.com)
end
log(1)
hw.mouse.move(100,100)
log(2)

До лога "2" не дойдет.
Не совсем понимаю что должна выполнить io.open("COM3:", "wb")

Автор: DarkMaster 8.7.2023, 16:28

Цитата
Не совсем понимаю что должна выполнить io.open("COM3:", "wb")

Открывает отправку данных в порт в бинарном режиме. w - флаг записи (отправка), b - бинарный режим, чтобы переносы строк не лепил.
Вообще судя по всему проблема в createfile который используется для открытия порта. Либо править createfile, что в рамках данной железки разумнее, либо переходить на io.open.
В винде нет разницы между портом и файлом. Работаполностью аналогичная.

Автор: DarkMaster 8.7.2023, 17:23

А через мой дебаг запускал? На какой строке в arduino.lua зависает? Ну либо сам найди номер строки. Там проще будет. Я то думал, что скрипт работает, а железка просто игнорит команды - это сложно без железки диагностировать, а тут уже есть с чем работать.

Мне чет кажется оно будет бесконечно крутить:

Код

    repeat
        COMport = ffi.cast('int', ffi.C.CreateFileA('\\.\\COM' .. tostring(export_array.com), GENERIC_READ + GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nil))
        if COMport == INVALID_HANDLE_VALUE then wait (1) end
    until COMport ~= INVALID_HANDLE_VALUE

Автор: Madeus 8.7.2023, 23:30

Цитата(DarkMaster @ 8.7.2023, 17:23) *

А через мой дебаг запускал? На какой строке в arduino.lua зависает? Ну либо сам найди номер строки. Там проще будет. Я то думал, что скрипт работает, а железка просто игнорит команды - это сложно без железки диагностировать, а тут уже есть с чем работать.

Мне чет кажется оно будет бесконечно крутить:
Код

    repeat
        COMport = ffi.cast('int', ffi.C.CreateFileA('\\.\\COM' .. tostring(export_array.com), GENERIC_READ + GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nil))
        if COMport == INVALID_HANDLE_VALUE then wait (1) end
    until COMport ~= INVALID_HANDLE_VALUE


Запустил, именно этот кусок он и крутит.

Автор: DarkMaster 9.7.2023, 16:49

порт открыть он не может. Попробуй ручками дописать номер порта вместо tostring(export_array.com) либо вообще задать порт строкой, можно попробовать задать его аналогично io.open
открыть он не может порт этот.
так же было бы совсем не лишним посмотреть правильно ли он находит номер порта и вывести в лог export_array.com

https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea
тут можно почитать про параметры с которыми можно поиграть.

Автор: Madeus 9.7.2023, 18:27

Цитата(DarkMaster @ 9.7.2023, 16:49) *

порт открыть он не может. Попробуй ручками дописать номер порта вместо tostring(export_array.com) либо вообще задать порт строкой, можно попробовать задать его аналогично io.open
открыть он не может порт этот.
так же было бы совсем не лишним посмотреть правильно ли он находит номер порта и вывести в лог export_array.com

https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea
тут можно почитать про параметры с которыми можно поиграть.

Ком порт он определяет правильно. В общем проблема была в пути к ком порту, не нужны там \\.\\
Строка должна выглядеть так для windows 11

COMport = ffi.cast('int', ffi.C.CreateFileA('COM' .. tostring(export_array.com), GENERIC_READ + GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nil))

Спасибо, что напомнил про dbg и ткнул куда копать)

Автор: DarkMaster 10.7.2023, 16:16

хочу предостеречь про \\.\ - без этого НЕ должно работать для портов выше COM9. По сути для 1-9 происходит преобразование в полный путь. Для портов с бОльшими номерами его нет.

Автор: DarkMaster 10.7.2023, 17:17

попробуй такой префикс:
\\\\.\\

Автор: Madeus 10.7.2023, 18:23

\\\\.\\ Так же работает.

Автор: DarkMaster 10.7.2023, 18:41

Это была ошибка изначально.
Там должно быть вообще:
\\.\COM*
но все \ нужно удваивать для экранирования. Соответственно в одном месте был экран, во втором нет.

Cirus, поправь, пожалуйста исходник. Я могу перезалить, но только в свой отдельный пост.

Автор: Kangoshi 23.7.2023, 0:23

Цитата(DarkMaster @ 10.7.2023, 18:41) *

Это была ошибка изначально.
Там должно быть вообще:
\\.\COM*
но все \ нужно удваивать для экранирования. Соответственно в одном месте был экран, во втором нет.

А что насчёт звёздочки после COM? huh.gif
'\\\\.\\COM*' должно быть или '\\\\.\\COM' ?

И раз уж привлёк внимание, как нажимать end? Строка в arduino.lua: export_array["end"] = 0xD5. Могу, конечно, переименовать во что-то отличное от end, но просто интересно как это сделать с таким "синтаксисом".
А так же клавиши / и * с нумпада, точнее не могу найти их кодов для этого драйвера.

Автор: DarkMaster 23.7.2023, 22:49

извездочка подразумевалась под замену номером порта.

Код

--lua
local key = {
    mouse_1 = 0x01, -- VK_LBUTTON Left mouse button
    mouse_2 = 0x02, -- VK_RBUTTON Right mouse button
    --0x03 -- VK_CANCEL Control-break processing
    mouse_middle = 0x04, -- VK_MBUTTON Middle mouse button (three-button mouse)
    mouse_4 = 0x05, -- VK_XBUTTON1 X1 mouse button
    mouse_5 = 0x06, -- VK_XBUTTON2 X2 mouse button
    --0x07 -- Undefined
    backspace = 0x08, -- VK_BACK BACKSPACE key
    tab = 0x09, -- VK_TAB TAB key
    --0x0A-0B -- Reserved
    --0x0C -- VK_CLEAR CLEAR key
    enter = 0x0D, -- VK_RETURN ENTER key
    --0x0E-0F -- Undefined
    shift = 0x10, -- VK_SHIFT SHIFT key
    ctrl = 0x11, -- VK_CONTROL CTRL key
    alt = 0x12, -- VK_MENU ALT key
    pause = 0x13, -- VK_PAUSE PAUSE key
    caps_lock = 0x14, -- VK_CAPITAL CAPS LOCK key
    --0x15 -- VK_KANA IME Kana mode
    --0x15 -- VK_HANGUEL IME Hanguel mode (maintained for compatibility; use VK_HANGUL)
    --0x15 -- VK_HANGUL IME Hangul mode
    --0x16 -- Undefined
    --0x17 -- VK_JUNJA IME Junja mode
    --0x18 -- VK_FINAL IME final mode
    --0x19 -- VK_HANJA IME Hanja mode
    --0x19 -- VK_KANJI IME Kanji mode
    --0x1A -- Undefined
    esc = 0x1B, -- VK_ESCAPE ESC key
    escape = 0x1B, -- VK_ESCAPE ESC key
    --0x1C -- VK_CONVERT IME convert
    --0x1D -- VK_NONCONVERT IME nonconvert
    --0x1E -- VK_ACCEPT IME accept
    --0x1F -- VK_MODECHANGE IME mode change request
    spacebar = 0x20, -- VK_SPACE SPACEBAR
    page_up = 0x21, -- VK_PRIOR PAGE UP key
    page_down = 0x22, -- VK_NEXT PAGE DOWN key
    ["end"] = 0x23, -- VK_END END key
    _end = 0x23, -- VK_END END key
    home = 0x24, -- VK_HOME HOME key
    left = 0x25, -- VK_LEFT LEFT ARROW key
    up = 0x26, -- VK_UP UP ARROW key
    right = 0x27, -- VK_RIGHT RIGHT ARROW key
    down = 0x28, -- VK_DOWN DOWN ARROW key
    --0x29 -- VK_SELECT SELECT key
    --0x2A -- VK_PRINT PRINT key
    --0x2B -- VK_EXECUTE EXECUTE key
    print_screen = 0x2C, -- VK_SNAPSHOT PRINT SCREEN key
    insert = 0x2D, -- VK_INSERT INS key
    delete = 0x2E, -- VK_DELETE DEL key
    --0x2F -- VK_HELP HELP key
    ["0"] = 0x30, -- 0 key
    ["1"] = 0x31, -- 1 key
    ["2"] = 0x32, -- 2 key
    ["3"] = 0x33, -- 3 key
    ["4"] = 0x34, -- 4 key
    ["5"] = 0x35, -- 5 key
    ["6"] = 0x36, -- 6 key
    ["7"] = 0x37, -- 7 key
    ["8"] = 0x38, -- 8 key
    ["9"] = 0x39, -- 9 key
    --0x3A-40 -- Undefined
    a = 0x41, -- A key
    b = 0x42, -- B key
    c = 0x43, -- C key
    d = 0x44, -- D key
    e = 0x45, -- E key
    f = 0x46, -- F key
    g = 0x47, -- G key
    h = 0x48, -- H key
    i = 0x49, -- I key
    j = 0x4A, -- J key
    k = 0x4B, -- K key
    l = 0x4C, -- L key
    m = 0x4D, -- M key
    n = 0x4E, -- N key
    o = 0x4F, -- O key
    p = 0x50, -- P key
    q = 0x51, -- Q key
    r = 0x52, -- R key
    s = 0x53, -- S key
    t = 0x54, -- T key
    u = 0x55, -- U key
    v = 0x56, -- V key
    w = 0x57, -- W key
    x = 0x58, -- X key
    y = 0x59, -- Y key
    z = 0x5A, -- Z key
    A = 0x41, -- A key
    B = 0x42, -- B key
    C = 0x43, -- C key
    D = 0x44, -- D key
    E = 0x45, -- E key
    F = 0x46, -- F key
    G = 0x47, -- G key
    H = 0x48, -- H key
    I = 0x49, -- I key
    J = 0x4A, -- J key
    K = 0x4B, -- K key
    L = 0x4C, -- L key
    M = 0x4D, -- M key
    N = 0x4E, -- N key
    O = 0x4F, -- O key
    P = 0x50, -- P key
    Q = 0x51, -- Q key
    R = 0x52, -- R key
    S = 0x53, -- S key
    T = 0x54, -- T key
    U = 0x55, -- U key
    V = 0x56, -- V key
    W = 0x57, -- W key
    X = 0x58, -- X key
    Y = 0x59, -- Y key
    Z = 0x5A, -- Z key
    win = 0x5B, -- VK_LWIN Left Windows key (Natural keyboard)
    --0x5C -- VK_RWIN Right Windows key (Natural keyboard)
    --0x5D -- VK_APPS Applications key (Natural keyboard)
    --0x5E -- Reserved
    sleep = 0x5F, -- VK_SLEEP Computer Sleep key
    num_0 = 0x60, -- VK_NUMPAD0 Numeric keypad 0 key
    num_1 = 0x61, -- VK_NUMPAD1 Numeric keypad 1 key
    num_2 = 0x62, -- VK_NUMPAD2 Numeric keypad 2 key
    num_3 = 0x63, -- VK_NUMPAD3 Numeric keypad 3 key
    num_4 = 0x64, -- VK_NUMPAD4 Numeric keypad 4 key
    num_5 = 0x65, -- VK_NUMPAD5 Numeric keypad 5 key
    num_6 = 0x66, -- VK_NUMPAD6 Numeric keypad 6 key
    num_7 = 0x67, -- VK_NUMPAD7 Numeric keypad 7 key
    num_8 = 0x68, -- VK_NUMPAD8 Numeric keypad 8 key
    num_9 = 0x69, -- VK_NUMPAD9 Numeric keypad 9 key
    ["num_*"] = 0x6A,
    num_multiply = 0x6A, -- VK_MULTIPLY Multiply key
    ["num_+"] = 0x6B,
    num_plus = 0x6B, -- VK_ADD Add key
    --0x6C -- VK_SEPARATOR Separator key
    ["num_-"] = 0x6D,
    num_minus = 0x6D, -- VK_SUBTRACT Subtract key
    ["num_."] = 0x6E,
    num_del = 0x6E, -- VK_DECIMAL Decimal key
    ["num_/"] = 0x6F,
    num_devide = 0x6F,
    num_slash = 0x6F, -- VK_DIVIDE Divide key
    F1 = 0x70, -- VK_F1 F1 key
    F2 = 0x71, -- VK_F2 F2 key
    F3 = 0x72, -- VK_F3 F3 key
    F4 = 0x73, -- VK_F4 F4 key
    F5 = 0x74, -- VK_F5 F5 key
    F6 = 0x75, -- VK_F6 F6 key
    F7 = 0x76, -- VK_F7 F7 key
    F8 = 0x77, -- VK_F8 F8 key
    F9 = 0x78, -- VK_F9 F9 key
    F10 = 0x79, -- VK_F10 F10 key
    F11 = 0x7A, -- VK_F11 F11 key
    F12 = 0x7B, -- VK_F12 F12 key
    F13 = 0x7C, -- VK_F13 F13 key
    F14 = 0x7D, -- VK_F14 F14 key
    F15 = 0x7E, -- VK_F15 F15 key
    F16 = 0x7F, -- VK_F16 F16 key
    F17 = 0x80, -- VK_F17 F17 key
    F18 = 0x81, -- VK_F18 F18 key
    F19 = 0x82, -- VK_F19 F19 key
    F20 = 0x83, -- VK_F20 F20 key
    F21 = 0x84, -- VK_F21 F21 key
    F22 = 0x85, -- VK_F22 F22 key
    F23 = 0x86, -- VK_F23 F23 key
    F24 = 0x87, -- VK_F24 F24 key
    f1 = 0x70, -- VK_F1 F1 key
    f2 = 0x71, -- VK_F2 F2 key
    f3 = 0x72, -- VK_F3 F3 key
    f4 = 0x73, -- VK_F4 F4 key
    f5 = 0x74, -- VK_F5 F5 key
    f6 = 0x75, -- VK_F6 F6 key
    f7 = 0x76, -- VK_F7 F7 key
    f8 = 0x77, -- VK_F8 F8 key
    f9 = 0x78, -- VK_F9 F9 key
    f10 = 0x79, -- VK_F10 F10 key
    f11 = 0x7A, -- VK_F11 F11 key
    f12 = 0x7B, -- VK_F12 F12 key
    f13 = 0x7C, -- VK_F13 F13 key
    f14 = 0x7D, -- VK_F14 F14 key
    f15 = 0x7E, -- VK_F15 F15 key
    f16 = 0x7F, -- VK_F16 F16 key
    f17 = 0x80, -- VK_F17 F17 key
    f18 = 0x81, -- VK_F18 F18 key
    f19 = 0x82, -- VK_F19 F19 key
    f20 = 0x83, -- VK_F20 F20 key
    f21 = 0x84, -- VK_F21 F21 key
    f22 = 0x85, -- VK_F22 F22 key
    f23 = 0x86, -- VK_F23 F23 key
    f24 = 0x87, -- VK_F24 F24 key
    --0x88-8F -- Unassigned
    num_lock = 0x90, -- VK_NUMLOCK NUM LOCK key
    scroll_lock = 0x91, -- VK_SCROLL SCROLL LOCK key
    --0x92-96 -- OEM specific
    --0x97-9F -- Unassigned
    shift_left = 0xA0, -- VK_LSHIFT Left SHIFT key
    shift_right = 0xA1, -- VK_RSHIFT Right SHIFT key
    ctrl_left = 0xA2, -- VK_LCONTROL Left CONTROL key
    ctrl_right = 0xA3, -- VK_RCONTROL Right CONTROL key
    menu_left = 0xA4, -- VK_LMENU Left MENU key
    menu_right = 0xA5, -- VK_RMENU Right MENU key
    browser_back = 0xA6, -- VK_BROWSER_BACK Browser Back key
    browser_forward = 0xA7, -- VK_BROWSER_FORWARD Browser Forward key
    browser_refresh = 0xA8, -- VK_BROWSER_REFRESH Browser Refresh key
    browser_stop = 0xA9, -- VK_BROWSER_STOP Browser Stop key
    browser_search = 0xAA, -- VK_BROWSER_SEARCH Browser Search key
    browser_favorites = 0xAB, -- VK_BROWSER_FAVORITES Browser Favorites key
    browser_home = 0xAC, -- VK_BROWSER_HOME Browser Start and Home key
    mute = 0xAD, -- VK_VOLUME_MUTE Volume Mute key
    volume_down = 0xAE, -- VK_VOLUME_DOWN Volume Down key
    volume_up = 0xAF, -- VK_VOLUME_UP Volume Up key
    media_next = 0xB0, -- VK_MEDIA_NEXT_TRACK Next Track key
    media_prev = 0xB1, -- VK_MEDIA_PREV_TRACK Previous Track key
    media_stop = 0xB2, -- VK_MEDIA_STOP Stop Media key
    media_play = 0xB3, -- VK_MEDIA_PLAY_PAUSE Play/Pause Media key
    media_pasue = 0xB3, -- VK_MEDIA_PLAY_PAUSE Play/Pause Media key
    launch_mail = 0xB4, -- VK_LAUNCH_MAIL Start Mail key
    launch_media = 0xB5, -- VK_LAUNCH_MEDIA_SELECT Select Media key
    launch_app_1 = 0xB6, -- VK_LAUNCH_APP1 Start Application 1 key
    launch_app_2 = 0xB6, -- VK_LAUNCH_APP1 Start Application 2 key
    --0xB8-B9 -- Reserved
    [";"] = 0xBA, -- VK_OEM_1 Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ';:' key
    [":"] = 0xBA, -- VK_OEM_1 Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ';:' key
    ["+"] = 0xBB, -- VK_OEM_PLUS For any country/region, the '+' key
    [","] = 0xBC, -- VK_OEM_COMMA For any country/region, the ',' key
    ["-"] = 0xBD, -- VK_OEM_MINUS For any country/region, the '-' key
    ["."] = 0xBE, -- VK_OEM_PERIOD For any country/region, the '.' key
    ["/"] = 0xBF, -- VK_OEM_2 Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '/?' key
    ["?"] = 0xBF, -- VK_OEM_2 Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '/?' key
    ["`"] = 0xC0, -- VK_OEM_3 Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '`~' key
    ["~"] = 0xC0, -- VK_OEM_3 Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '`~' key
    --0xC1-D7 -- Reserved
    --0xD8-DA -- Unassigned
    ["["] = 0xDB, -- VK_OEM_4 Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '[{' key
    ["{"] = 0xDB, -- VK_OEM_4 Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '[{' key
    ["\\"] = 0xDC, -- VK_OEM_5 Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '\|' key
    ["|"] = 0xDC, -- VK_OEM_5 Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '\|' key
    ["]"] = 0xDD, -- VK_OEM_6 Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ']}' key
    ["}"] = 0xDD, -- VK_OEM_6 Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ']}' key
    ["'"] = 0xDE, -- VK_OEM_7 Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the 'single-quote/double-quote' key
    ['"'] = 0xDE, -- VK_OEM_7 Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the 'single-quote/double-quote' key
    --0xDF -- VK_OEM_8 Used for miscellaneous characters; it can vary by keyboard.
    --0xDF -- VK_OEM_8 Used for miscellaneous characters; it can vary by keyboard.
    --0xE0 -- Reserved
    --0xE1 -- OEM specific
    --0xE2 -- VK_OEM_102 Either the angle bracket key or the backslash key on the RT 102-key keyboard
    --0xE3-E4 -- OEM specific
    --0xE5 -- VK_PROCESSKEY IME PROCESS key
    --0xE6 -- OEM specific
    --0xE7 -- VK_PACKET Used to pass Unicode characters as if they were keystrokes.
    -- The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods.
    -- For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP
    --0xE8 -- Unassigned
    --0xE9-F5 -- OEM specific
    --0xF6 -- VK_ATTN Attn key
    --0xF7 -- VK_CRSEL CrSel key
    --0xF8 -- VK_EXSEL ExSel key
    --0xF9 -- VK_EREOF Erase EOF key
    play = 0xFA, -- VK_PLAY Play key
    zoom = 0xFB, -- VK_ZOOM Zoom key
    --0xFC -- VK_NONAME Reserved
    --0xFD -- VK_PA1 PA1 key
    --0xFE -- VK_OEM_CLEAR Clear key
}

return key


когда-то писал себе хоткеи.

для тяжелых случаев можете детектор использовать:
Код


--lua
local dbg           = require[[lua_plugins\mydbg]]
local ffi           = require[[ffi]]
local rmem          = ffi.cast
print = log
print "clear"
print "mode compact"
local cfg, fi, open, click = {},{},{},{}



local winapi
do
    -- У меня пути не стандартные, чтобы избежать свинарника.
    -- Поэтому тут есть пара "лишних" строк.
    -- Сохраняем _текущие_ пути по которым ищутся модули.
    local back = package.path
    -- Дописываю путь по которому у меня лежат модули.
    package.path = "lua_plugins\\winapi\\?.lua;"..package.path
    -- Подгружаем собственно модуль.
    -- Хз почему, но грузить нужно именно так.
    -- Просто require 'winapi' не пашет.
    winapi = require 'winapi'
    --ext.lg(winapi)
    -- Подгружаем кусок отвечающий за клавиатуру
    require[[winapi.keyboard]]
    -- Возвращаем пути поиска модулей на исходные.
    package.path = back

end

-- Поолучаем состояние клавиши:
-- state - нажата/отжата
-- toggle - для лампочек горит/не горит.
--local state, toggle = GetKeyState(0x14)
--log(tostring(state),tostring(toggle))

local state_arr = {}


while 1 do
    for i = 0, 255 do
        local state, toggle = winapi.GetKeyState(i)
        if state and not state_arr[i] then
            state_arr[i] = true
            log(string.format("%.3f", os.clock())..": "..i.." down")
        elseif not state and state_arr[i] then
            state_arr[i] = false
            log(string.format("%.3f", os.clock())..": "..i.." up")
        end
    end
    wait(1)
end



Автор: Kangoshi 24.7.2023, 19:34

Коды не те, но я нашёл https://forum.arduino.cc/t/transmitting-non-standard-keys/672233/2
Для / и * с нумпада это 0xDC и 0xDD.
Но я так и не понял зачем это в файле arduino.lua: export_array["end"] = 0xD5 и как это написать в скрипте. hw.key (hw. а дальше что? Я просто не в курсе синтаксиса, но пробовал разные варианты - ничего не работает.

Автор: Madeus 24.7.2023, 20:20

Цитата(Kangoshi @ 24.7.2023, 19:34) *

Коды не те, но я нашёл https://forum.arduino.cc/t/transmitting-non-standard-keys/672233/2
Для / и * с нумпада это 0xDC и 0xDD.
Но я так и не понял зачем это в файле arduino.lua: export_array["end"] = 0xD5 и как это написать в скрипте. hw.key (hw. а дальше что? Я просто не в курсе синтаксиса, но пробовал разные варианты - ничего не работает.

hw.key(hw.end) или hw.key(hw['end'])

Автор: Kangoshi 25.7.2023, 13:36

Цитата(Madeus @ 24.7.2023, 20:20) *

hw.key(hw.end) или hw.key(hw['end'])

1 вариант выдаёт ошибку синтаксиса '<name>' expected near 'end', 2 вариант работает, благодарю. Не догадался кавычки сменить.

Автор: zOrky 19.11.2023, 18:34

Здравствуйте. Все сделал как в инструкции на 1 странице. Но непонятно что писать в скрипте самого UO Pilot? -lua он не читает если тупо скопировать туда текст из вкладки "Пример использования клавиатуры"

Задача: Нужно настроить срабатывания макроса на кнопке F3, чтобы персонаж в окне брало ассист и атаковал цель.
Спасибо.

Автор: DarkMaster 20.11.2023, 6:54

Цитата
-lua он не читает

там два дефиса должно быть.
--lua

пилот должен быть последней версии.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)