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

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

UoKit.com Форумы _ UO Pilot _ Слежение за изменением курсора

Автор: cirus 24.1.2017, 19:40

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

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

Запустить 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 килобайт ) Кол-во скачиваний: 531

Параметры 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

Автор: dunkel 27.1.2017, 17:21

а если курсор не статичен? То есть при наведении на нужный объект он постоянно меняет форму и цвет. Будет ли достаточно зафиксировать только одну из позиций?

Автор: Cockney 27.1.2017, 17:43

Наверное зависит от задачи.

Автор: cirus 27.1.2017, 17:57

Можно же искать обычный вид курсора, а не изменённый. Т. е. если обычный не найден, значит он изменился.

Автор: cirus 12.6.2020, 19:42

Определить идентификатор курсора
Код
--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

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

Автор: Levo222 12.6.2020, 22:04

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

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

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

Автор: Cockney 12.6.2020, 22:05

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

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



Это вполне нормальное поведение системы, а не костыль.

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