Page 1 of 1

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

Posted: 13 May 2023, 22:35
by emil0zulkarnaev
По сути делаю автонаведение для игры. Но есть проблема. Вызов 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 функция выполнится один раз, наведение работает нормально, но вот нужно сделать это в цикле, пока нажата определённая клавиша.

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

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

Попробуйте добавить в цикл задержку. Так как у вас старенький ноут с частотою кадров экрана вряд ли более 60 Гц, а игра вряд ли стабильно выдаёт хотя бы столько же, нет смысла вызывать DllCall чаще, чем раз в 16—50 мс.