Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: airdox on October 08, 2014, 02:01:59 PM
-
И еще раз надоем.
Хочу задать скрипту ожидание, пока окно из полноэкранного режима перейдет в оконный. Есть ли какая нибудь специальная команда которая возвращает состояние окна? Думал сделать проверку по черному экрану, но оказалось бестолковой затеей) :D
-
так задай ожидание через которое окно гарантировано перейдет в нужное состояние
-
Такое решение не подходит) Подошла бы проверка каждые 10 сек например, но не придумаю никак относительно чего проверять..
-
Работа с окнами в кликере не очень развита и функций мало, это не какой нибудь...
Костыли только придумывать, опять же по изображению.
Не плохо бы было, как предлагали системные переменные типа $_xmax/$_ymax только для окна, хоть это тоже костыль.
-
Такое решение не подходит) Подошла бы проверка каждые 10 сек например, но не придумаю никак относительно чего проверять..
А окно привязано?
-
hset есть. Это имеется в виду?
-
Если окно с привязкой, то проверять один из пикселов (или область или количество или контрольную сумму) в координатах приближённых к $_xmax $_ymax.
Если экран Fullscreen - там чёрного не будет, если приложение перейдёт в оконный - эта часть уже не влезет и окажется за пределами привязанного окна. Там чернота.
-
В результате получилось сделать следующим образом:
Так как механизм привязки мне не доконца понятее(как в нем ведет себя мышь и почему не хочет кликать и т.д.) было принято решение для проверки на фулскриновость :
Выставить окно в 0,0, предварительно найдя его по названию -> включить привязку->сделать getscreen ->выключить привязку->проанализировать в координатах близких к 0,0 на черный квадрат. Если приложение фулскрин - чернота будет, если нет - будет наше окно.
Спасибо за идею!
UPD: прошу прощения за поспешные вопли о том, что все работает. На самом деле пришлось повозиться. Причины нижеописанного кроются ,видимо, где то в недрах кликермана. На деле вышло вот что:
Сперва я дума, что будет работать так:
hset($hwnd,1) //ingame check
getscreen
hset($hwnd,0)
IF_PICTURE_IN (0,0, 100,100,"черный_квадрат.bmp", -1, 100)
//код
END_IF
На деле же, когда цикл проходил один раз в оконном режиме, а потом пытался проверить на полноэкранный, то не находил черноту по которй мы проверяем потому, что в той области оставалось изображение оконного режима(хоть и не должно бы).
Обновить изображение до требуемой черноты получилось только вот так:
wndsize ($hwnd, 1000,-1) //вот эта строка
hset($hwnd,1)
getscreen
hset($hwnd,0)
IF_PICTURE_IN (0,0, 100,100,"черный_квадрат.bmp", -1, 100)
//код
END_IF
Выходит, чтобы убрать остаточное изображение, нужно перед гетскрином изменить размер окна. Как то так..
-
HSET(-1,0) //отвязываем от любого окна
$h = hget($_xmax-50,$_ymax-50) //ловим что есть почти в самом нижнем углу(или задаем место где окно не бывает)
%htext = hgettext($h)
//проверка заголовка пойманного окна
IF(%htext = "нужное окно") // или IF(%htext ! "нужное окно") не равно
mysub()
END_IF
wait(1)
sub(mysub)
//делаем свои дела
end_sub
так можно обойтись без анализа экрана, который с привязкой к окну работает странно.
только сначала надо бы поймать один раз окно и выяснить какой у него hgettext($h), вывести в лог или файл. Потому как введенный hgettext($h) вручную заголовок окна не всегда совпадает с тем что об этом окне знает система, особенно если название окна на русском. думаю дело в кодировке.
-
Всё хорошо, только что это за компиляция разных версий? Подпрограммы вызываются по новому (кстати должна быть выше). А отдельный тип строковых переменных % с бородатой версии.
В чём проявляется странность работы анализа экрана в режиме привязки? Просто мне кажется полагаться на hgettext куда как "страннее" и ненадёжнее. Если только не хапануть этот текст для сравнения так же автоматом до отвязки окна.
-
Да, так наверное даже лучше. В моем случае были еще проблемы со сворачиванием окна. И от анализа экрана If_picture_in-ом я ушел, и по совету сделал анализ хешем. В результате вылеты поборол. Ожидание работает как надо. Может кому пригодится:
$hwnd = wndfind("Название окна")
wndsize ($hwnd, 1050,10) //без этого могут оставаться артефакты от оконного изображения при getscreen и проверка может не пройти. Ширина требуемая, высота любая, кроме (-1).
wndpos($hwnd, 0, 0) // убираем окно в угол
wait(1)
hset($hwnd,1) // привязываем к окну
getscreen
$hash = PXLXOR (100,100, 150, 150) //анализируем кусочек экрана, где окно точно есть
if ($hash=0) //хеш 0 - черный цвет
logwrite ("Обнаружен полноэкранный режим")
while ($hash=0) //цикл ожидания выхода из полноэкранного режима
wait(20) // время до следующей проверки
$hwnd = wndfind("Название окна") // если окно фулскрина имеет то же название, что и оконного, то при смене окна без этого переприсвоения будет ошибка
hset($hwnd,1) // привязываемся снова (на случай если произошла смена окон)
getscreen
$hash = PXLXOR (100,100, 150, 150) //проверяем
end_cyc
end_if
hset($hwnd,0) //отвязываемся
wait(1)
-
Всё хорошо, только что это за компиляция разных версий? Подпрограммы вызываются по новому (кстати должна быть выше). А отдельный тип строковых переменных % с бородатой версии.
все взято из Help'а версии 4,10,003
В чём проявляется странность работы анализа экрана в режиме привязки?
У меня если привязать к окну игры (да и к любому окну, даже блокнота) нельзя получить код цвета. Все одного цвета(серое,черное, по-разному от окна зависит), везде, по всему окну, только за границами черное. Ну и соответственно ни о каком анализе речь уже не идет. И при этом тут на форуме пишут что оно работает. Это и странно.
-
Всё хорошо, только что это за компиляция разных версий? Подпрограммы вызываются по новому (кстати должна быть выше). А отдельный тип строковых переменных % с бородатой версии.
все взято из Help'а версии 4,10,003
Устаревший пример. Раньше строковые переменные писались знаком % теперь все пишутся единым $
Подпрограммы теперь нужно располагать выше их вызова.
Вот правильный упрощенный вариант
sub(mysub)
//делаем свои дела
end_sub
HSET(-1,0) //отвязываем от любого окна
IF(hgettext(hget($_xmax-50,$_ymax-50)) = "Заголовок окна")
mysub()
END_IF
wait(1)
-
только сначала надо бы поймать один раз окно и выяснить какой у него hgettext($h), вывести в лог или файл. Потому как введенный hgettext($h) вручную заголовок окна не всегда совпадает с тем что об этом окне знает система, особенно если название окна на русском. думаю дело в кодировке.
Проще использовать специализированную программу.
Например InqSoft Window Scanner 1.7 (http://crapware.aidf.org/forum/index.php?topic=42.msg572#msg572)
-
Устаревший пример.
Значит пора править Help. Большинство пользователей берут примеры из него, и если там код уже не рабочий/устаревший, то пора менять. :)
-
Устаревший пример.
Значит пора править Help. Большинство пользователей берут примеры из него, и если там код уже не рабочий/устаревший, то пора менять. :)
Да ты кэп!