Что нового

[Мышь, клавиатура] Autohotkey скрипт преобразовать в AutoIT скрипт

  • Автор темы Mapartipin
  • Дата начала
M

Mapartipin

Гость
Версия AutoIt: 3.3.6.1

Описание:

Сразу скажу желательно знание 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
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
(подробнее), а обычный код соответственно в тег [code]
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, Модератор раздела.






Добавлено:
Сообщение автоматически объединено:
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 593
Репутация
938
OffTopic:
Было бы что в этом скрипте "не распространять"
 
Автор
M

Mapartipin

Гость
OffTopic:
Belfigor сказал(а):
Было бы что в этом скрипте "не распространять"
Я жадина ;D
А вообще скажу скрипт дает не хилое преимущество, даже нет - превосходство ( ;) )...(даже с лагом)
 
Автор
M

Mapartipin

Гость
IsNull сказал(а):
PixelGetColor has always to get a new snapshot of the hdc for each call. So, if you use it in a Loop, it does much redundant work:
Actually it would be much faster, if you take this snap by yourself (only once) and then search the bitmap for your Pixels. With GDI+ you can do this.

If there is the need, I can make an example.
вот
:scratch:
PixelGetColor в Autoit тоже с такими проблемами?

Заменил PixelGetColor на PixelSearch (ищу решение в том же AutoHotKey...)
Код:
Loop,
{
Sleep 900
PixelSearch, Px, Py, 361, 863, 361, 863, 0xF7FFFF, 0, Fast
if (Px = 361)
{
Send {3}
}
Лаг абсолютно такой же :(

Кста, если просто посылать циклом 3 каждые 900 мс, все норм, именно проблема с взятием цвета пихаря.

:scratch:
Leef_me сказал(а):
>>When it fails, its because PixelGetColor is talking to the video driver halfway through the screen render (where the GUI overlay has not been rendered yet?).

When newbies make these kind of statements, I really wonder why they bother to ask questions?

But let me ask, why do you think that PixelGetColor is talking to a video driver? And why do you think that a screen render takes such a longtime ?

More to the point, what are you really trying to do?
Is the 'Gui Overlay' created by AutoHotkey?

What is your game? Is it using Direct X?

Can you post a small, compileable version of your script that can be checked for good or bad design?
Чеж делать? С видео, графикой. Можно из скрипта обратится к драйверу или директу? :wacko: :blink:

Я решил проблему самостоятельно, если кто-то занимался моим вопросом спасиба.
Сори, но как решил не скажу :laugh: (я говорил я жадина :rofl:)

ТЕМУ В ТОПКУ ПЛИЗ
 
Верх