Как дождаться окончания выполнения функции dllcall?

Опубликуйте ваши работающие скрипты, библиотеки и ПО для AutoHotkey
emil0zulkarnaev
Posts: 1
Joined: 13 May 2023, 22:32

Как дождаться окончания выполнения функции dllcall?

Post by emil0zulkarnaev » 13 May 2023, 22:35

По сути делаю автонаведение для игры. Но есть проблема. Вызов dll функции, как мне кажется, происходит на заднем фоне, т.е. ahk скрипт не дожидается его окончания и идёт работать дальше. Из-за чего происходит следующее: вместо нашёлся пиксель - навелись на него, получается нашёлся пиксель, вызвали наведение, но ещё не навелись, но уже нашли снова пиксель, снова вызвали наведение, но ещё не навелись, нашли пиксель, может уже отработало первое наведение и т.д. Это приводит не к простому наведению, а к скачкам. Таким образом появился вопрос: как мне дождаться окончания выполнения вызова dll функции? (вызов отдельной программы через RunWait прошу не предлагать, опробовано, есть свои минусы) Такой проблемы нет на мощных компах, но вот конкретно сейчас у меня старенький ноут, поэтому хочу решить её.

Code: Select all

while GetKeyState("LShift", "P") {
    PixelSearch, Px, Py, xStart, yStart, xStop, yStop, 0x4949FA, 10, Fast

    if not ErrorLevel {
        dX := Px-middleX
        dY := Py-middleY+60
        DllCall("mouse_event", uint, 1, int, dX, int, dY, uint, 0, int, 0)
    }
}
Если выполнить код внутри цикла без цикла, т.е. когда dll функция выполнится один раз, наведение работает нормально, но вот нужно сделать это в цикле, пока нажата определённая клавиша.

mcl
Posts: 357
Joined: 04 May 2018, 16:35

Re: Как дождаться окончания выполнения функции dllcall?

Post by mcl » 14 May 2023, 16:21

emil0zulkarnaev wrote: Вызов dll функции, как мне кажется, происходит на заднем фоне
Мне кажется, вам кажется. Предположу, что на самом деле происходит другое:
— скрипт вызывает DllCall, который добавляет в очередь сообщение о новом положении мыши и состоянии кнопок;
— игра получает сообщение из очереди и начинает менять положение игрока, направление его взгляда и проч.;
— скрипт за это время успевает ещё три раза вызвать DllCall;
— игра, отработав первый вызов, отрисовывает экран с новыми пикселями и начинает обрабатывать три новых сообщения;
— скрипт за это время успевает ещё пять раз вызвать DllCall;
— ...

Попробуйте добавить в цикл задержку. Так как у вас старенький ноут с частотою кадров экрана вряд ли более 60 Гц, а игра вряд ли стабильно выдаёт хотя бы столько же, нет смысла вызывать DllCall чаще, чем раз в 16—50 мс.
github://oGDIp - GDI+ wrapper for AHK v1.1

Post Reply

Return to “Скрипты и библиотеки”