Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: airdox on October 08, 2014, 02:01:59 PM

Title: Вернуть состояние окна. Фулскрин или нет.(Решено костылем)
Post by: airdox on October 08, 2014, 02:01:59 PM
И еще раз надоем.
Хочу задать скрипту ожидание, пока окно из полноэкранного режима перейдет в оконный. Есть ли какая нибудь специальная команда которая возвращает состояние окна? Думал сделать проверку по черному экрану, но оказалось бестолковой затеей) :D
Title: Re: Вернуть состояние окна. Фулскрин или нет.
Post by: aden on October 08, 2014, 02:37:53 PM
так задай ожидание через которое окно гарантировано перейдет в нужное состояние
Title: Re: Вернуть состояние окна. Фулскрин или нет.
Post by: airdox on October 08, 2014, 03:19:58 PM
Такое решение не подходит) Подошла бы проверка каждые 10 сек например, но не придумаю никак относительно чего проверять..
Title: Re: Вернуть состояние окна. Фулскрин или нет.
Post by: Vint on October 08, 2014, 03:29:23 PM
Работа с окнами в кликере не очень развита и функций мало, это не какой нибудь...
Костыли только придумывать, опять же по изображению.
Не плохо бы было, как предлагали системные переменные типа $_xmax/$_ymax только для окна, хоть это тоже костыль.
Title: Re: Вернуть состояние окна. Фулскрин или нет.
Post by: Vint on October 08, 2014, 03:29:56 PM
Такое решение не подходит) Подошла бы проверка каждые 10 сек например, но не придумаю никак относительно чего проверять..
А окно привязано?
Title: Re: Вернуть состояние окна. Фулскрин или нет.
Post by: airdox on October 08, 2014, 03:33:24 PM
hset есть. Это имеется в виду?
Title: Re: Вернуть состояние окна. Фулскрин или нет.
Post by: Vint on October 08, 2014, 03:40:50 PM
Если окно с привязкой, то проверять один из пикселов (или область или количество или контрольную сумму) в координатах приближённых к $_xmax $_ymax.
Если экран Fullscreen - там чёрного не будет, если приложение перейдёт в оконный - эта часть уже не влезет и окажется за пределами привязанного окна. Там чернота.
Title: Re: Вернуть состояние окна. Фулскрин или нет.
Post by: airdox on October 10, 2014, 09:35:33 AM
В результате получилось сделать следующим образом:
Так как механизм привязки мне не доконца понятее(как в нем ведет себя мышь и почему не хочет кликать и т.д.) было принято решение для проверки на фулскриновость :
Выставить окно в 0,0, предварительно найдя его по названию ->  включить привязку->сделать getscreen ->выключить привязку->проанализировать в координатах близких к 0,0 на черный квадрат. Если приложение фулскрин - чернота будет, если нет - будет наше окно.
Спасибо за идею!

UPD: прошу прощения за поспешные вопли о том, что все работает. На самом деле пришлось повозиться. Причины нижеописанного кроются ,видимо, где то в недрах кликермана. На деле вышло вот что:
Сперва я дума, что будет работать так:
Code: [Select]
hset($hwnd,1)        //ingame check
getscreen
hset($hwnd,0)

IF_PICTURE_IN (0,0, 100,100,"черный_квадрат.bmp", -1, 100)
//код
END_IF

На деле же, когда цикл проходил один раз в оконном режиме, а потом пытался проверить на полноэкранный, то не находил черноту по которй мы проверяем потому, что в той области оставалось изображение оконного режима(хоть и не должно бы).
Обновить изображение до требуемой черноты получилось только вот так:
Code: [Select]
   
wndsize ($hwnd, 1000,-1) //вот эта строка

hset($hwnd,1)       
getscreen
hset($hwnd,0)
   
IF_PICTURE_IN (0,0, 100,100,"черный_квадрат.bmp", -1, 100)
//код
END_IF

Выходит, чтобы убрать остаточное изображение, нужно перед гетскрином изменить размер окна. Как то так..
Title: Re: Вернуть состояние окна. Фулскрин или нет.(Решено костылем)
Post by: quant13 on October 14, 2014, 10:02:25 AM
Code: (Clickermann) [Select]
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) вручную заголовок окна не всегда совпадает с тем что об этом окне знает система, особенно если название окна на русском. думаю дело в кодировке.
Title: Re: Вернуть состояние окна. Фулскрин или нет.(Решено костылем)
Post by: Vint on October 14, 2014, 11:02:49 AM
Всё хорошо, только что это за компиляция разных версий? Подпрограммы вызываются по новому (кстати должна быть выше). А отдельный тип строковых переменных  %  с бородатой версии.

В чём проявляется странность работы анализа экрана в режиме привязки? Просто мне кажется полагаться на hgettext куда как "страннее" и ненадёжнее. Если только не хапануть этот текст для сравнения так же автоматом до отвязки окна.
Title: Re: Вернуть состояние окна. Фулскрин или нет.(Решено костылем)
Post by: airdox on October 15, 2014, 03:43:46 AM
Да, так наверное даже лучше. В моем случае были еще проблемы со сворачиванием окна. И от анализа экрана If_picture_in-ом я ушел, и по совету сделал анализ хешем. В результате вылеты поборол. Ожидание работает как надо. Может кому пригодится:


Code: (clickermann) [Select]
$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)
Title: Re: Вернуть состояние окна. Фулскрин или нет.(Решено костылем)
Post by: quant13 on October 15, 2014, 09:09:48 AM
Quote
Всё хорошо, только что это за компиляция разных версий? Подпрограммы вызываются по новому (кстати должна быть выше). А отдельный тип строковых переменных  %  с бородатой версии.
все взято из Help'а версии 4,10,003

Quote
В чём проявляется странность работы анализа экрана в режиме привязки?
У меня если привязать к окну игры (да и к любому окну, даже блокнота) нельзя получить код цвета. Все одного цвета(серое,черное, по-разному от окна зависит), везде, по всему окну, только за границами черное. Ну и соответственно ни о каком анализе речь уже не идет. И при этом тут на форуме пишут что оно работает. Это и странно.
Title: Re: Вернуть состояние окна. Фулскрин или нет.(Решено костылем)
Post by: Oraven on October 15, 2014, 10:32:43 AM
Quote
Всё хорошо, только что это за компиляция разных версий? Подпрограммы вызываются по новому (кстати должна быть выше). А отдельный тип строковых переменных  %  с бородатой версии.
все взято из Help'а версии 4,10,003

Устаревший пример. Раньше строковые переменные писались знаком % теперь все пишутся единым $
Подпрограммы теперь нужно располагать выше их вызова.

Вот правильный упрощенный вариант
Code: (clickermann) [Select]
sub(mysub)
   //делаем свои дела     
end_sub

HSET(-1,0)  //отвязываем от любого окна
IF(hgettext(hget($_xmax-50,$_ymax-50)) = "Заголовок окна")
   mysub()
END_IF
wait(1)
Title: Re: Вернуть состояние окна. Фулскрин или нет.(Решено костылем)
Post by: Oraven on October 15, 2014, 10:45:23 AM
только сначала надо бы поймать один раз окно и выяснить какой у него hgettext($h), вывести в лог или файл. Потому как введенный hgettext($h) вручную заголовок окна не всегда совпадает с тем что об этом окне знает система, особенно если название окна на русском. думаю дело в кодировке.

Проще использовать специализированную программу.
Например InqSoft Window Scanner 1.7 (http://crapware.aidf.org/forum/index.php?topic=42.msg572#msg572)
Title: Re: Вернуть состояние окна. Фулскрин или нет.(Решено костылем)
Post by: quant13 on October 15, 2014, 03:12:01 PM
Quote
Устаревший пример.
Значит пора править Help. Большинство пользователей берут примеры из него, и если там код уже не рабочий/устаревший, то пора менять.  :)
Title: Re: Вернуть состояние окна. Фулскрин или нет.(Решено костылем)
Post by: Oraven on October 15, 2014, 05:37:53 PM
Quote
Устаревший пример.
Значит пора править Help. Большинство пользователей берут примеры из него, и если там код уже не рабочий/устаревший, то пора менять.  :)
Да ты кэп!