Author Topic: Ошибка в получении координат окна  (Read 3055 times)

0 Members and 1 Guest are viewing this topic.

trillian2018

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Ошибка в получении координат окна
« on: October 02, 2020, 09:00:50 AM »
Здравствуйте, уважаемые знатоки. С кликером работаю около года и вроде уже успел подружиться, но вот одна проблема меня преследует периодически и как от нее избавиться кроме перезапуска скрипта я так и не придумал. Суть в том, что при фактическом нахождении окна в точках "0,0" они читаются скриптом как "4591336,0" и попытки выравнивания ни к чему не приводят. Вот сам скрипт:

WNDGETINFO (wndfind("Wind"), $var1, $var2, $var3, $var4)
      IF(($var1=0) and ($var2=0))
         print("goto skip3")
         goto(skip3)
      END_IF
     
      WHILE (($var1>0) or ($var2>0))
         //viravnivanie okna po koordinatam 0 0
         WNDSTATE (wndfind("Wind"), 1)
         WNDBUMP (wndfind("Wind"))
         WNDSIZE (wndfind("Wind"), 800, 600)
         wndpos (wndfind("Wind"), 0, 0)
         waitms(500)
         WNDGETINFO (wndfind("Wind"), $var1, $var2, $var3, $var4)
      END_CYC
   
      skip3:

Если окно находится в любом месте, скрипт выставляет окно по координатам 0,0 и продолжает работу. НО часто бывает такое, что он подвисает на этом цикле, видя на выходе не верные корды. Подскажите как этого можно избежать раз и навсегда? Вариант перезапуска скрипта я и так знаю, нужно более умное решение

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Ошибка в получении координат окна
« Reply #1 on: October 02, 2020, 09:38:50 AM »
Что за координаты "4591336,0" я без понятия, но такие дикие цифры бывают при полноэкранных, а не оконных режимах.
При свёрнутом окне координаты (-32000, -32000)

Во первых, зачем там WHILE? Простого условия достаточно. Да, и зачем там два условия отлавливающих одно и то же, достаточно одного

Попробуй ставить не через wndpos, а WNDSETINFO.

Ну и последнее, костыль, проверяй не только на ноль, но и на 4591336.


Code: (clickermann) [Select]
// через WNDPOS
$hwnd_win = WNDFIND("Total")
WNDGETINFO($hwnd_win, $wx, $wy, $ww, $wh)
print("win coord: ", $wx, "/", $wy, " ", $ww, "x", $wh)

IF(($wx ! 0) & ($wy ! 0))   
    WNDSTATE($hwnd_win, 1)
    WNDBUMP($hwnd_win)
    WNDSIZE($hwnd_win, 800, 600)
    WNDPOS($hwnd_win, 0, 0)
    WAITMS(500)
    WNDGETINFO($hwnd_win, $wx, $wy, $ww, $wh)
    print("win coord: ", $wx, "/", $wy, " ", $ww, "x", $wh)
END_IF

HALT
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


// через WNDSETINFO
$hwnd_win = WNDFIND("Total")
WNDGETINFO($hwnd_win, $wx, $wy, $ww, $wh4)
print("win coord: ", $wx, "/", $wy, " ", $ww, "x", $wh)

IF(($wx ! 0) & ($wy ! 0))   
    WNDSTATE($hwnd_win, 1)
    WNDBUMP($hwnd_win)
    WNDSETINFO($hwnd_win, 0, 0, 800, 600)
    WAITMS(500)
    WNDGETINFO($hwnd_win, $wx, $wy, $ww, $wh)
    print("win coord: ", $wx, "/", $wy, " ", $ww, "x", $wh)
END_IF

HALT
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// через WNDSETINFO с костылём
$hwnd_win = WNDFIND("Total")
WNDGETINFO($hwnd_win, $wx, $wy, $ww, $wh)
print("win coord: ", $wx, "/", $wy, " ", $ww, "x", $wh)

IF(($wx ! 0) & ($wx < 10000) & ($wy ! 0))   
    WNDSTATE($hwnd_win, 1)
    WNDBUMP($hwnd_win)
    WNDSETINFO($hwnd_win, 0, 0, 800, 600)
    WAITMS(500)
    WNDGETINFO($hwnd_win, $wx, $wy, $ww, $wh)
    print("win coord: ", $wx, "/", $wy, " ", $ww, "x", $wh)
END_IF

HALT
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
« Last Edit: October 02, 2020, 10:14:00 AM by Vint »


trillian2018

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Re: Ошибка в получении координат окна
« Reply #2 on: October 03, 2020, 09:36:11 AM »
While там потому, что простое условие, ввиду особенностей работы кликермана, может попросту проскочить, ничего не изменив. я с таким уже сталкивался. ставил условие, оно истино, поэтому выполняется команда "выставить в координаты 0,0" и скрипт идет дальше, при этом команда выравнивания не срабатывает и дальше идет белеберда. а командой while я создаю бесконечный цикл попыток выровнять окно, единственным условием выхода из которого является получение результата 0,0.

"Что за координаты "4591336,0" я без понятия, но такие дикие цифры бывают при полноэкранных, а не оконных режимах."
Режим оконный, в полноэкранный во время работы не переводится, всегда находится в оконном.

Там не два условия, отлавливающих одно и тоже, первое условие предназначено для пропуска цикла выравнивания.

"Попробуй ставить не через wndpos, а WNDSETINFO."
Вот тут я не понял, это же разные по функционалу команды, одна задает координаты, другая просто получает данные окна. как одна может заменить другую?

"Ну и последнее, костыль, проверяй не только на ноль, но и на 4591336."
Вот это наверное и есть пока самое эффективное решение, но саму суть проблемы это никак не выявляет.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Ошибка в получении координат окна
« Reply #3 on: October 05, 2020, 09:22:54 AM »
While там потому, что простое условие, ввиду особенностей работы кликермана, может попросту проскочить, ничего не изменив. я с таким уже сталкивался.
Это не особенности работы кликера, это особенности конкретного скрипта и многозадачной OS. Будет система занята другим, буфер команд переполнится и остальные перестанут туда попадать.
Или, что чаще, действие происходит не вовремя. Пытаешься передвинуть до появления окна. Согласованность нарушена. Почти все заявления о "не делает", "проскочило" и т.п. это из этой сферы. Кликер, ничего не "проскакивает", команду он отправляет. Вот сможет ли её в этот момент обработать принимающая сторона, не факт.

Там не два условия, отлавливающих одно и тоже, первое условие предназначено для пропуска цикла выравнивания.
Там именно что два. Это всё реализовывается одним WHILE. Он и пропустит, если окно уже на месте.
Это привычка идёт от пользования GOTO. Мышление пока так настроено. Тебе кажется что пропуск это отдельная задача и чтоб пропустить ты должен куда-то перепрыгнуть.
Все там были.

"Попробуй ставить не через wndpos, а WNDSETINFO."
Вот тут я не понял, это же разные по функционалу команды, одна задает координаты, другая просто получает данные окна. как одна может заменить другую?
Ты путаешь WNDGETINFO и WNDSETINFO. Первая получает, вторая устанавливает.


Вот это наверное и есть пока самое эффективное решение, но саму суть проблемы это никак не выявляет.
А суть можешь выявить только ты. Сомневаюсь что подобное поведение можно повторить в отрыве от конкретной системы и набора программ. У меня (и не только у меня) случаев чтоб выдавало неправильные координаты не было.
Такое видел только если это делала сама программа. Своё дочернее окно она задвигала в дикие координаты, но не сворачивала. Уже не вспомню где и зачем это было.
« Last Edit: October 05, 2020, 09:28:06 AM by Vint »