1

Тема: AHK: ControlClick и прокрутка колесом

Здравствуйте. Задача: реализовать перемещение туда-сюда персонажа в игре по указанным координатам при зажатии клавиши/кнопки мыши. Имеется следующий код:

 XButton2::
While GetKeyState("XButton2","P")
{
	ControlClick, x920 y507, Diablo III,, Middle , 1, NA
	DllCall("Sleep","UInt",115)
	ControlClick, x1000 y507, Diablo III,, Middle , 1, NA
	DllCall("Sleep","UInt",115)
}
return

Суть в том, что в игре есть клавиша, отвечающая за Force move - только перемещение, и данный скрипт симулирует бег влево-вправо при зажатии кнопки мыши. И все работает прекрасно, если данный Force move назначен на среднюю кнопку мыши, как в указанном выше скрипте. Но требуется заставить работать этот скрипт при Force move, назначенном на именно прокрутку колесом вверх-вниз. Пробовал вместо Middle прописывать WheelUp и WheelDown, но после этого скрипт работал некорректно. Подозреваю, что это как-то связано с координатами, скроллом и ClickCount. Буду благодарен за помощь в решении проблемы.

2

Re: AHK: ControlClick и прокрутка колесом

Если я правильно понял проблему, то причиной является то, что условие while GetKeyState("WheelDown","P") срабатывает всего один раз - так как между прокручиваниями колесика существует некая задержка. Попробуйте так:

global tick := 0

Loop {
	if (tick > 0) {
		ToolTip, Работаю
		tick := tick - 1
	} else {
		ToolTip, Не работаю
	}
}

WheelDown::
tick := tick + 50
return

Таким образом каждое прокручивание колесика будет заставлять скрипт срабатывать определенное количество раз (в моем примере 50). Это будет иметь свои минусы (скрипт будет выполнять эту команду ещё несколько раз после завершения прокручивания колесика) - но в игре этот минус может оказаться несущественным, если подобрать правильный тайминг.

Заранее предупрежу что увеличение переменной tick на 50 пунктов для игры будет слишком большим. Пробуйте с единицы и повышайте пока не найдете лучший вариант. Этот метод можно назвать костылем - возможно более опытные товарищи подскажут что-нибудь более стоящее: мне было бы самому интересно взглянуть на скрипт, который работал бы пока я проворачиваю колесико.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

3

Re: AHK: ControlClick и прокрутка колесом

belyankin12
Нет, вы не так меня поняли. Нужен не скрипт, работающий пока проворачивается колесо. Нужно при зажатии клавиши/кнопки мыши скроллить колесом по данным координатам. Для наглядности приведу пример:


XButton2::
     While GetKeyState("XButton2", "p") { 
        MouseClick, WheelUp, 920, 507
	MouseClick, WheelDown, 1000, 507
    }
return

Вот этот скрипт практически решает мою задачу - скроллит по данным координатам, но при его исполнении в игре забирается управление мышью, что не подходит.


XButton2::
While GetKeyState("XButton2","P")
{
	ControlClick, x920 y507, Diablo III,, MIDDLE , 1, NA
	DllCall("Sleep","UInt",115)
	ControlClick, x1000 y507, Diablo III,, MIDDLE , 1, NA
	DllCall("Sleep","UInt",115)
}
return

А вот этот управление мышью не отбирает, и опять же практически идеально подходит, вот только если Middle изменить на WheelUp или WheelDown, скрипт работает некорректно. Задача именно заставить работать второй скрипт с WheelUp или WheelDown.

4

Re: AHK: ControlClick и прокрутка колесом

А если использовать MouseMove + SendInput?

MouseMove, x920 y507
SendInput, {WheelDown}
MouseMove, x1000 y507
SendInput, {WheelDown}
Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.