Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Слежение за изменением курсора, Скрипт
cirus
сообщение 24.1.2017, 19:40
Сообщение #1


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Версия пилота 2.39 или выше.
Пример: https://youtu.be/evDiR0jCB3w

Подготовка:
Скачать Прикрепленный файл  irfanview.zip ( 2,8 мегабайт ) Кол-во скачиваний: 275

Запустить IrfanView от администратора, выбрать Option, Capture/Screenshot.
В открывшемся окне ставим параметры:
Прикрепленное изображение
1. Desktop area - current monitor (mouse).
2. Горячая клавиша.
3. Save capture image as file. Указать имя файла и путь для сохранения.
4. BMP - Windows Bitmap.
5. Нажать кнопку Start.

Теперь, при нажатии горячей клавиши, Num 1 в данном случае, будет сохранятся скрин экрана с курсором.

Запускаем игру, делаем скрин с нужным курсором (нажать горячую клавишу). Открыть Paint, Photoshop или что-то подобное, открыть полученный скрин, вырезать курсор, закрасить левый верхний пиксель и всё что не относится к курсору в один любой цвет. Сохранить изображение.
Получится примерно так:
Прикрепленный файл  cursor2.bmp ( 2,16 килобайт ) Кол-во скачиваний: 526

Параметры 1-4 настраиваются 1 раз. После перезапуска программы нужен только пункт 5.
Желательно создать RAM-диск 15-20 мб. И сохранять скрин на него.
IrfanView и UoPilot запускать от администратора.

Поиск курсора:
1. Запустить игру.
2. Запустить IrfanView, нажать Start.
3. Запустить скрипт в пилоте.
Слежение за изменением курсора
Код
set %a [1] LoadImage (C:\cursor2.bmp)      // путь к картинке с курсором
set $path "Z:\111.bmp"                     // путь к скрину, тот что указывали в настройках IrfanView

:start
filedelete ($path)
sendex {num_1}         // горячая клавиша, та что указывали в IrfanView
wait 50
while fileexists ($path) = 0
    wait 1
end_while
wait 10
set %b [1] LoadImage ($path)
set #a findimage(0 0 1920 1080 (%a [1 1]) %arr %b [1 1])
if  #a > 0
    hint (24 clRed 500 500 (Атаковать))
    // что делать если курсор найден, хинт можно убрать
    else
    hint (24 clblue 1920 1 (1))              // можно убрать
    // если курсор не найден, можно ничего не писать
end_if
set %b [1] DeleteImage (%b [1 1])
goto start
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dunkel
сообщение 27.1.2017, 17:21
Сообщение #2


***

Novice
Сообщений: 75
Регистрация: 20.1.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.296
Возраст: 30



а если курсор не статичен? То есть при наведении на нужный объект он постоянно меняет форму и цвет. Будет ли достаточно зафиксировать только одну из позиций?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 27.1.2017, 17:43
Сообщение #3


********

Master
Сообщений: 1.394
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20893
Пользователь №: 16.156



Наверное зависит от задачи.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 27.1.2017, 17:57
Сообщение #4


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Можно же искать обычный вид курсора, а не изменённый. Т. е. если обычный не найден, значит он изменился.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 12.6.2020, 19:42
Сообщение #5


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Определить идентификатор курсора
Код
--lua
local ffi = require("ffi")
local user = ffi.load('User32.dll')
ffi.cdef[[
    typedef struct {int x; int y;} POINT;
    typedef struct {int cbSize; int flags; int hCursor; POINT ptScreenPos;} CURSORINFO, *PCURSORINFO;
    int GetCursorInfo(PCURSORINFO pci);
]]

function GetCursor()
     pci = ffi.new('CURSORINFO')
     pci.cbSize = ffi.sizeof('CURSORINFO')
     user.GetCursorInfo(pci)
     return pci.hCursor
end


log('Идентификатор курсора: ' .. tostring(GetCursor()))
if GetCursor() == 65567 then
    log('Рука')
end

Учтите, идентификатор меняется при перезапуске приложения.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 12.6.2020, 22:04
Сообщение #6


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



Цитата(cirus @ 12.6.2020, 23:42) *

Учтите, идентификатор меняется при перезапуске приложения.

Вот то, о чем я говорил - лишние костыли в коде)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 12.6.2020, 22:05
Сообщение #7


********

Master
Сообщений: 1.394
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20893
Пользователь №: 16.156



Цитата(Levo222 @ 12.6.2020, 22:04) *

Вот то, о чем я говорил - лишние костыли в коде)



Это вполне нормальное поведение системы, а не костыль.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 28.3.2024, 19:18
Designed by Nickostyle