|
Распознавание нажатий клавиш клавиатуры |
|
|
qimer |
24.8.2020, 15:21
|
Registred
Сообщений: 5
Регистрация: 24.8.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.729
|
Цитата(cirus @ 24.8.2020, 15:13) код
Код --lua local ffi = require("ffi") ffi.cdef[[short GetAsyncKeyState(int vKey);]]
function getkeystate(key) ffi.C.GetAsyncKeyState(key) while ffi.C.GetAsyncKeyState(key) == 0 do wait(10) end -- ждать пока не нажата клавиша while ffi.C.GetAsyncKeyState(key) ~= 0 do wait(10) end -- ждать пока клавиша нажата workwindow(windowfromcursor()) -- сделать рабочим окно под курсором return mouse_pos () -- получить координаты мыши end
log 'clear' log 'mode compact' -- очистить лог log('Ждём нажатия пробела') local sx, sy = getkeystate(32) -- 32 - код клавиши пробел
log('Ждём нажатия пробела') local ex, ey = getkeystate(32)
log(sx, sy, ex, ey) cirus, спасибо больше, а как реализовать ожидание клавиш "Alt+1" "Alt+2" "Alt+3"? Чисто код функции
|
|
|
|
qimer |
24.8.2020, 18:51
|
Registred
Сообщений: 5
Регистрация: 24.8.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.729
|
cirus, где-нибудь есть полный список команд для uopilot? У меня очередная проблема. Заключается в следующем: я запускаю скрипт, привязываю кликер к окну игры и делаю например getimage, saveimage, а через некоторое время, когда картинка в игре поменялась делаю снова getimage, saveimage но уже в другой файл, то изображения идентичные. Т. е. будто он в начале запомнил изображение и новый вызов getimage его не меняет в памяти. Игра Wurm Online. Там есть прогрессбары стамина, крафтинг, еда, вода. Мне нужно отслеживать изменения в них, а именно, если цвет точки поменялся, то выполнять некие действия, например попить воды. Проблема только в том, чтобы считывать не статичную картинку, а меняющуюся. Помоги плиз. На примере Clickermann там есть функция обновления экрана в памяти и там эти изменения считываются, но функционал убогий очень и медленный
|
|
|
|
cirus |
25.8.2020, 1:48
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26702
Пользователь №: 16.971
Возраст: 29
|
Цитата где-нибудь есть полный список команд для uopilot? https://uopilot.uokit.com/wiki/index.php?ti...к_функций_(Lua)Если каких-то функций нет, то можно через ffi вызвать любую функцию winapi. Цитата нужно отслеживать изменения Код --lua log 'clear' log 'mode compact'
local window = workwindow() local startX, startY, endX, endY = 90, 108 , 144, 158 -- координаты local address = getimage (startX, startY, endX, endY, window) -- запомнили изображение
log('Ждём когда изображение изменится') while true do local arr, a = findimage (startX, startY, endX, endY, {address}, window) -- поиск if arr == nil then -- если не найдено значит изображение изменилось break -- выход из цикла end wait(100) end log('Изображение изменилось') deleteimage (address) -- удалить картинку
|
|
|
|
nykep |
25.8.2020, 15:45
|
Apprentice
Сообщений: 233
Регистрация: 1.9.2012 Группа: Пользователи Наличность: 1195
Пользователь №: 15.246
Возраст: 25
|
Цитата(qimer @ 24.8.2020, 18:51) cirus, где-нибудь есть полный список команд для uopilot? У меня очередная проблема. Заключается в следующем: я запускаю скрипт, привязываю кликер к окну игры и делаю например getimage, saveimage, а через некоторое время, когда картинка в игре поменялась делаю снова getimage, saveimage но уже в другой файл, то изображения идентичные. Т. е. будто он в начале запомнил изображение и новый вызов getimage его не меняет в памяти. Игра Wurm Online. Там есть прогрессбары стамина, крафтинг, еда, вода. Мне нужно отслеживать изменения в них, а именно, если цвет точки поменялся, то выполнять некие действия, например попить воды. Проблема только в том, чтобы считывать не статичную картинку, а меняющуюся. Помоги плиз. На примере Clickermann там есть функция обновления экрана в памяти и там эти изменения считываются, но функционал убогий очень и медленный
если тебе надо отслеживать цвет точки так и напиши просто if или while с цветом точки зачем тебе findimage
|
|
|
|
фонарик |
4.10.2021, 16:23
|
Apprentice
Сообщений: 145
Регистрация: 23.11.2011 Группа: Пользователи Наличность: 0
Пользователь №: 14.305
|
Цитата(cirus @ 24.8.2020, 15:13) код
Код --lua local ffi = require("ffi") ffi.cdef[[short GetAsyncKeyState(int vKey);]]
function getkeystate(key) ffi.C.GetAsyncKeyState(key) while ffi.C.GetAsyncKeyState(key) == 0 do wait(10) end -- ждать пока не нажата клавиша while ffi.C.GetAsyncKeyState(key) ~= 0 do wait(10) end -- ждать пока клавиша нажата workwindow(windowfromcursor()) -- сделать рабочим окно под курсором return mouse_pos () -- получить координаты мыши end
log 'clear' log 'mode compact' -- очистить лог log('Ждём нажатия пробела') local sx, sy = getkeystate(32) -- 32 - код клавиши пробел
log('Ждём нажатия пробела') local ex, ey = getkeystate(32)
log(sx, sy, ex, ey) Подскажите пожалуйста, как правильно сделать так, чтобы ваш скрипт не останавливался? Мне нужно чтобы он срабатывал каждый раз, когда я нажимаю пробел и работал пока я его сам не остановлю (IMG: style_emoticons/default/unsure.gif)
|
|
|
|
apaul |
4.10.2021, 20:14
|
Neophyte
Сообщений: 36
Регистрация: 19.8.2021 Группа: Пользователи Наличность: 0
Пользователь №: 20.051
|
Цитата(cirus @ 25.8.2020, 1:48) local arr, a = findimage (startX, startY, endX, endY, {address}, window) -- поиск
Какая полезная штука (IMG: style_emoticons/default/smile.gif). Только у меня почему-то пример пролетает сразу в "Изображение изменилось", настраиваю для теста кусок фона на форуме. Вроде он здесь статичный. Можно как-то понять, что ему не нравится? Заодно стало интересно, а как findimage понимает в таком вызове размер шаблона поиска, ведь ему передается чисто его адрес в памяти?
|
|
|
|
sutra |
6.10.2021, 16:02
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Вообще крайне полезная вещь. У меня с тех пор, как я перешёл на новый getimage, стали почему то глючить горячие клавиши Пилота. Запуск скрипта по ним без проблем, а вот с остановкой бывают проблемы. То он пишет что модуль не найден, а иногда и просто виснет. Плюнул, сделал прерывание работы скрипта путём анализа нажатия клавиш. Но у меня было чуть по другому сделано, не как предложил Cirus. Решил на практике поэкспериментировать с битовыми операциями (а то всегда путаю где младший байт, а где старший) и натолкнулся на другой забавный глюк. Интересно было бы понять причину. Предлагаемый пример скрипта при первом запуске работает как надо, а вот если запустить повторно, будет ждать нажатия клавиши CTRL, хотя чётко прописан останов скрипта. код
Код --lua log "clear" log "mode compact" local ffi = require("ffi") ffi.cdef[[short GetKeyState(int vKey);]] function getkeystate(key) if bit.band(ffi.C.GetKeyState(key), 256) ~= 0 then return true else return false end end
local x=255+122 log(bit.band(x,256)) stop_script()
while true do -- ждём нажатия CTRL if getkeystate(17) then break end end while true do -- ждём отпускания CTRL if not(getkeystate(17)) then break end end
Хотя я не удивлюсь если только у меня некорректно работает остановка работы скриптов.
|
|
|
|
фонарик |
6.10.2021, 21:38
|
Apprentice
Сообщений: 145
Регистрация: 23.11.2011 Группа: Пользователи Наличность: 0
Пользователь №: 14.305
|
Интересно, а есть ли возможность при отслеживании нажатия клавиши, после определения события её нажатия, само нажатие клавиши заблокировать? Т.е я нажимаю например 1, срабатывает скрипт, которому прописан код на случай нажатия клавиши 1. Но и в игре при этом нажимается также клавиша 1, что печатает символ в чат. Очень бы хотелось чтобы в самом активном окне ничего не печаталось. В самом пилоте например, если настроить быструю клавишу какому-то скрипту на 1, то при её нажатии в игре ничего не печатается, символ блокируется, а старт скрипта всегда срабатывает.
А еще возникла проблема, если нажать ктрл+1 или альт+1, то срабатывает событие на клавишу 1. Можно ли как-то различать эти нажатия? Чтобы событие на клавишу 1, 2 или другую - при комбинированном нажатии с контролом или альтом не срабатывало?
|
|
|
|
DarkMaster |
7.10.2021, 8:13
|
Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27680
Пользователь №: 11.279
|
Цитата Интересно, а есть ли возможность при отслеживании нажатия клавиши, после определения события её нажатия, само нажатие клавиши заблокировать? Т.е я нажимаю например 1, срабатывает скрипт, которому прописан код на случай нажатия клавиши 1. Но и в игре при этом нажимается также клавиша 1, что печатает символ в чат. Очень бы хотелось чтобы в самом активном окне ничего не печаталось. В самом пилоте например, если настроить быструю клавишу какому-то скрипту на 1, то при её нажатии в игре ничего не печатается, символ блокируется, а старт скрипта всегда срабатывает. Насколько мне известно только через глобальные хоткеи. Т.е. создается N хоткеев, заворачивается на пилот - дальше можете эти эвенты отслеживать или статус клавиш. Не сработает если игра отслеживается не эвенты, а так же статус клавиш. Цитата А еще возникла проблема, если нажать ктрл+1 или альт+1, то срабатывает событие на клавишу 1. Можно ли как-то различать эти нажатия? Чтобы событие на клавишу 1, 2 или другую - при комбинированном нажатии с контролом или альтом не срабатывало? Точно так же сделать проверку нажатия клавиши контрола либо других модификаторов. Теоретически возможна ошибка если между проверкой модификатора и клавиши изменится состояние модификатора или клавиши. Чтобы этого избежать можно дополнительно ориентироваться на второй параметр возвращаемый получением статуса (toggle) из кода здесь https://forum.uokit.com/index.php?s=&sh...st&p=431321
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
sutra |
7.10.2021, 9:59
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Фонарик, даю реально работающий пример работы проверки клавиш. Именно проверки, а не перехвата. Он реально нужен тебе? Используй уникальные клавиши для варьирования своего кода. Про 256 - это число у которого младший байт равен нулю - оно требуется для проверки старшего байта возвращаемого функцией результата. Функции GetKeyState и GetAsyncKeyState различны, можешь посмотреть какая тебе лично больше нравится. GetAsyncKeyState учитывает была ли клавиша нажата начиная с ПОСЛЕДНЕГО вызова функции GetAsyncKeyState и позволяет также отслеживать клавиши мыши. код
Код --lua log "clear" log "mode compact" local ffi = require("ffi") ffi.cdef[[short GetKeyState(int vKey);]] function getkeystate(key) if bit.band(ffi.C.GetKeyState(key), 256) ~= 0 then return true else return false end end
local function CheckStatus(key1,key2,key3) -- Проверка нажатия от 1-ой до 3-х клавиш if getkeystate(key1)then if not(key2)or getkeystate(key2)then if not(key3)or getkeystate(key3)then return true end end end return false end
local function WaitStatus(key1,key2,key3) -- Ожидание нажатия и отпускания от 1-ой до 3-х клавиш while true do -- Этот цикл нужен если требуется ожидание нажатий while key2 do while key3 do if getkeystate(key3) then break end end if getkeystate(key2) then break end end if getkeystate(key1) then break end end -- Ниже ожидание отпускания клавиш (чтобы скрипт не "понёсся" дальше) while true do while key2 do while key3 do if not(getkeystate(key3)) then break end end if not(getkeystate(key2)) then break end end if not(getkeystate(key1)) then break end end end
while true do if CheckStatus(17,49) then -- Если CTRL-1 - выполняем код №1 WaitStatus(17,49) log("Code#1") end if CheckStatus(17,50) then -- Если CTRL-2 - выполняем код №2 WaitStatus(17,50) log("Code#2") end if CheckStatus(17,51) then -- Если CTRL-3 - выполняем код №3 WaitStatus(17,51) log("Code#3") end if CheckStatus(17,18,16)then -- Если CTRL+ALT+SHIFT - выход из цикла log("End work") break end end
|
|
|
|
Gendalfgreen |
22.6.2022, 18:02
|
Neophyte
Сообщений: 18
Регистрация: 29.3.2022 Группа: Пользователи Наличность: 0
Пользователь №: 20.219
Возраст: 30
|
Выше написан ООчень интересный код . но почему то не работает?? Не подскажите в в чем может быть дело?
--lua log 'clear' log 'mode compact'
local window = workwindow() local startX, startY, endX, endY = 90, 108 , 144, 158 -- координаты local address = getimage (startX, startY, endX, endY, window) -- запомнили изображение
log('Ждём когда изображение изменится') while true do local arr, a = findimage (startX, startY, endX, endY, {address}, window) -- поиск if arr == nil then -- если не найдено значит изображение изменилось break -- выход из цикла end wait(100) end log('Изображение изменилось') deleteimage (address) -- удалить картинку
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|