Author Topic: Вернуть состояние окна. Фулскрин или нет.(Решено костылем)  (Read 6295 times)

0 Members and 3 Guests are viewing this topic.

airdox

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
И еще раз надоем.
Хочу задать скрипту ожидание, пока окно из полноэкранного режима перейдет в оконный. Есть ли какая нибудь специальная команда которая возвращает состояние окна? Думал сделать проверку по черному экрану, но оказалось бестолковой затеей) :D
« Last Edit: October 10, 2014, 09:36:41 AM by airdox »

aden

  • Оплот сообщества
  • ****
  • Posts: 363
    • View Profile
так задай ожидание через которое окно гарантировано перейдет в нужное состояние

airdox

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
Такое решение не подходит) Подошла бы проверка каждые 10 сек например, но не придумаю никак относительно чего проверять..

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Работа с окнами в кликере не очень развита и функций мало, это не какой нибудь...
Костыли только придумывать, опять же по изображению.
Не плохо бы было, как предлагали системные переменные типа $_xmax/$_ymax только для окна, хоть это тоже костыль.


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Такое решение не подходит) Подошла бы проверка каждые 10 сек например, но не придумаю никак относительно чего проверять..
А окно привязано?


airdox

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
hset есть. Это имеется в виду?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Если окно с привязкой, то проверять один из пикселов (или область или количество или контрольную сумму) в координатах приближённых к $_xmax $_ymax.
Если экран Fullscreen - там чёрного не будет, если приложение перейдёт в оконный - эта часть уже не влезет и окажется за пределами привязанного окна. Там чернота.


airdox

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
В результате получилось сделать следующим образом:
Так как механизм привязки мне не доконца понятее(как в нем ведет себя мышь и почему не хочет кликать и т.д.) было принято решение для проверки на фулскриновость :
Выставить окно в 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

Выходит, чтобы убрать остаточное изображение, нужно перед гетскрином изменить размер окна. Как то так..
« Last Edit: October 10, 2014, 02:21:40 PM by airdox »

quant13

  • Активный участник
  • ***
  • Posts: 174
    • View Profile
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) вручную заголовок окна не всегда совпадает с тем что об этом окне знает система, особенно если название окна на русском. думаю дело в кодировке.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Всё хорошо, только что это за компиляция разных версий? Подпрограммы вызываются по новому (кстати должна быть выше). А отдельный тип строковых переменных  %  с бородатой версии.

В чём проявляется странность работы анализа экрана в режиме привязки? Просто мне кажется полагаться на hgettext куда как "страннее" и ненадёжнее. Если только не хапануть этот текст для сравнения так же автоматом до отвязки окна.


airdox

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
Да, так наверное даже лучше. В моем случае были еще проблемы со сворачиванием окна. И от анализа экрана 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)
« Last Edit: October 15, 2014, 07:54:47 AM by Vint »

quant13

  • Активный участник
  • ***
  • Posts: 174
    • View Profile
Quote
Всё хорошо, только что это за компиляция разных версий? Подпрограммы вызываются по новому (кстати должна быть выше). А отдельный тип строковых переменных  %  с бородатой версии.
все взято из Help'а версии 4,10,003

Quote
В чём проявляется странность работы анализа экрана в режиме привязки?
У меня если привязать к окну игры (да и к любому окну, даже блокнота) нельзя получить код цвета. Все одного цвета(серое,черное, по-разному от окна зависит), везде, по всему окну, только за границами черное. Ну и соответственно ни о каком анализе речь уже не идет. И при этом тут на форуме пишут что оно работает. Это и странно.
« Last Edit: October 15, 2014, 09:18:04 AM by quant13 »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
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)

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
только сначала надо бы поймать один раз окно и выяснить какой у него hgettext($h), вывести в лог или файл. Потому как введенный hgettext($h) вручную заголовок окна не всегда совпадает с тем что об этом окне знает система, особенно если название окна на русском. думаю дело в кодировке.

Проще использовать специализированную программу.
Например InqSoft Window Scanner 1.7

quant13

  • Активный участник
  • ***
  • Posts: 174
    • View Profile
Quote
Устаревший пример.
Значит пора править Help. Большинство пользователей берут примеры из него, и если там код уже не рабочий/устаревший, то пора менять.  :)