M
Mapartipin
Гость
Версия AutoIt: 3.3.6.1
Описание:
Сразу скажу желательно знание Autohotkey скриптового языка.
У меня возникла необходимость в автоматизации в полноэкранном приложении, и я обратился к средству Autohotkey, но хоть
скрипт который я сейчас представлю полностью рабочий, есть интересная особенность, которая сводит результат к
нежелательному. Сначала опишу что делает мой скрипт на Autohotkey.
Итак скрипт (я прошу прощения что он не очень читабелен)
Итак этот мой скриптик работает полностью так как надо, НО есть беда такого рода - при опросе цвета пикселя в
полноэкранном приложении, появляется лаг изображения, и этот лаг не является падением фпс а вызван параметром задержки (Sleep) в цикле. При значении 10 - 100 мс, лаг частый, при 500 мс - редкий но более заметный, без этого параметра цикл будет перегружать процессор, и даже в этом случае наблюдается частый лаг как при 1-10 мс. Такая проблема не у одного меня и не связана с характеристиками пк (колличеством ядер, запуск на оттдельном ядре процесса скрипта и.т.п. - тестировал). Думаю что проблема кроется в самом скриптовом языке Autohotkey и "тяжолой" командой PixelGetColor (взять цвет пикселя).
Итак друзья разработчики, прошу помочь мне написать такой скрипт на AutoIT.
Примечания:
(кто понял для чего этот скрипт, дарю, но с условием о нераспространении. Надеюсь на вашу честность)
ссылка на скрипт(Autohotkey) без комментариев http://ibe.at.ua/AutoCast.ahk
Описание:
Сразу скажу желательно знание Autohotkey скриптового языка.
У меня возникла необходимость в автоматизации в полноэкранном приложении, и я обратился к средству Autohotkey, но хоть
скрипт который я сейчас представлю полностью рабочий, есть интересная особенность, которая сводит результат к
нежелательному. Сначала опишу что делает мой скрипт на Autohotkey.
Итак скрипт (я прошу прощения что он не очень читабелен)
Код:
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
Pause::Pause ; кнопка пауза вкл/выкл паузу
#MaxThreadsPerHotkey 2 ; количество потоков обработки клавиши
F9:: ; кнопка вкл\выкл скрипта
if KeepRunning = y ; проверка переменной, она будет отвечать за вкл либо выкл цикла, первая проверка false, так как
; переменной еще не существует.
{
KeepRunning = n
Send {ScrollLock}
Return
}
KeepRunning = y ; запуск, переменная создана (следующее нажатие кнопки F9 и условие выше даст TRUE, диод
; ScrollLock вкл либо выкл.)
Send {ScrollLock} ; вкл/выкл ScrollLock
Loop, ; цикл, который выполняет основную работу
{
Sleep 900 ; задержка, именно с ней есть проблемы и потому я решил обратиться к AutoIT. Объясню ниже.
PixelGetColor, Color3, 361, 863, bgr ; по заданным координатам берем цвет пикселя.
if (Color3 = 0xF7FFFF) ; условие если цвет такой то...
{
Send {3} ; посылаем нажатие кнопки 3
}
if KeepRunning = n ; вот тут сложно, цикл работает пока не нажмем F9, тогда переменная KeepRunning станет = n, цикл
; остановлен.
Break
if KeepRunning = P ; это отдельно выход из цикла если будет событие - нажат Enter
; (но не все так просто - смотрим ниже).
Break
}
Return
Enter:: ; обработка Enter нужна лишь потому, что надо чтоб цикл приостанавливался\запускался при его нечетном
; нажатии (1 раз - нечет, 2 раз - чет, 3 раз - нечет...)
if KeepRunning = y ; если цикл работает - приостановить, ScrollLock, отключаю F9, посылаю Enter (посылается обычный
; ентер, а не это-же, возврат в ожидание нажатия - Return)
{
KeepRunning = P
Send {ScrollLock}
Hotkey, F9, off
Send {Enter}
Return
}
if KeepRunning = n ; в случае если цикл был остановлен F9, начинаем считать четные нечетные нажатия ENTER. (дабы
; знать нужно ли после нажатия ентера запускать цикл вновь без F9)
{
if OneTwo = one ; нечет - значит это чет нажатие, посылаем простой ентер, вкл F9 хоткей, возврат.
{
OneTwo = two
Send {Enter}
Hotkey, F9, on
Return
}
OneTwo = one ; создаем переменную - первое нажатие ентер, отключаем хоткей F9 (имею ввиду работает просто как
; F9), посылает простой ентер, возврат
Hotkey, F9, off
Send {Enter}
Return
}
if KeepRunning = P ; если был ентер, цикл на остановлен, посылаем простой ентер, вкл хоткей F9 и запускаем цикл,
; возврат.
{
Send {Enter}
Hotkey, F9, on
Send {F9}
Return
}
else ; и снова считаем чет нечет.
{
if OneTwo = one
{
OneTwo = two
Send {Enter}
Hotkey, F9, on
Return
}
OneTwo = one
Hotkey, F9, off
Send {Enter}
Return
}
Return
Итак этот мой скриптик работает полностью так как надо, НО есть беда такого рода - при опросе цвета пикселя в
полноэкранном приложении, появляется лаг изображения, и этот лаг не является падением фпс а вызван параметром задержки (Sleep) в цикле. При значении 10 - 100 мс, лаг частый, при 500 мс - редкий но более заметный, без этого параметра цикл будет перегружать процессор, и даже в этом случае наблюдается частый лаг как при 1-10 мс. Такая проблема не у одного меня и не связана с характеристиками пк (колличеством ядер, запуск на оттдельном ядре процесса скрипта и.т.п. - тестировал). Думаю что проблема кроется в самом скриптовом языке Autohotkey и "тяжолой" командой PixelGetColor (взять цвет пикселя).
Итак друзья разработчики, прошу помочь мне написать такой скрипт на AutoIT.
Примечания:
(кто понял для чего этот скрипт, дарю, но с условием о нераспространении. Надеюсь на вашу честность)
ссылка на скрипт(Autohotkey) без комментариев http://ibe.at.ua/AutoCast.ahk