Автор Тема: Типовые алгоритмы, вводные статьи (Новички, читайте!)  (Прочитано 237911 раз)

0 Пользователей и 1 Гость просматривают эту тему.

mikem

  • Зашел в гости
  • *
  • Сообщений: 3
    • Просмотр профиля
Развернуть окно на весь экран

Столкнулся с проблемой как корректно развернуть (maximize) окно. Кто-то уже отвечал на этот вопрос на форуме и посоветовал использовать WNDSETINFO($hwnd, 0,0, $_xmax,$_ymax), но это не "честный" maximize, и это не будет работать в случае мульти-мониторов (ну точнее это будет работать, но совсем не так как вы предполагали :)) )
Нашел как сделать "честный" maximize:
Код: Clickermann
  1. POSTMESSAGE($_hwnd, 0x0112, 0xF030, 0) // Развернуть окно на весь экран
где
0x0112 это WM_SYSCOMMAND
0xF030 это SC_MAXIMIZE
(Если нужен minimize, то - 0xF020 это SC_MINIMIZE)
Работает идеально у меня на версии кликерманна 4.12, ОС: Win10 x64
Может кому пригодится..
« Последнее редактирование: Октябрь 11, 2016, 09:43:28 pm от Oraven »

m.igel

  • Освоившийся
  • **
  • Сообщений: 23
    • Просмотр профиля
Re: Типовые алгоритмы
« Ответ #196 : Январь 12, 2017, 06:50:37 pm »
Заметь, что должна быть включена английская раскладка.
Нельзя ли   процедуру  переключения раскладки  поручить  самой программе, или хотя бы дать понять пользователю , что  у него раскладка не та? 


Попробовал скрестить два учебный скрпта.

// 12.01.2017 6

#name "Запись в блокнот"//Имя нашего скрипта

EXECUTE("notepad.exe")//Запускаем программу notepad.exe. Команда EXECUTE равносильна окну "Выполнить" в Виндовс (Win+R).

WNDSTATE(WNDFIND("Блокнот"), 1)//Разворачиваем окно в заголовке которого есть строка "Блокнот". 1 - означает развернуть, 0 - свернуть.

WAITMS(1000)//Ждем чтобы блокнот окончательно запустился. 500 мс достаточно

//--------------------
$hwnd1 = wndfind("Clickermann -") // получаем HWND окна кликера
$hwnd2 = wndfind("Блокнот") // получаем HWND окна Блокнота

SETKBLAYOUT($hwnd1, 1033) // устанавливаем английскую раскладку для окон
SETKBLAYOUT($hwnd2, 1033)

print   ($hwnd1) // добавил для контроля
print   ($hwnd2)

//или
//    SETKBLAYOUT($hwnd1, 1049) // устанавливаем русскую раскладку для окон
//    SETKBLAYOUT($hwnd2, 1049)
//--------------------

FOR($i, $i < 2)//Начало цикла. Цифра 5 означает что цикл повторится 5 раз

   KEYSTRING("The quick brown fox jumps over the lazy dog.", 20)//Вводим текст. 20 означает задержку в 20 мс между вводом каждой буквы

   KEYPRESS(#ENTER)//Нажимаем Enter чтобы перевести строку. #ENTER - код клавиши Enter

END_CYC//Заканчиваем цикл

HALT//Останавливаем скрипт

Тело взял тут, а вставку между // ------------ отсюда:
http://crapware.aidf.org/forum/index.php?topic=382.msg3092#msg3092
Ну и русскую раскладку закомментил, понятное дело.

Первоначальный код установки раскладки, тот, что по ссылке, прекрасно работает отдельно. Но будучи вставленным внутрь кода "Запись блокнота" перестаёт работать нормально, т.е. переключает только кликермена, а блокнот остаётся в русской раскладке. Более того, $hwnd2 оказывается равен $hwnd1 и возвращает значение кликермена.
Но всё заработало, когда в
$hwnd2 = wndfind("Блокнот")
вместо "Блокнот" я написал "Безымянный".

Как-то оно странно...

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3685
  • Котэ
    • Просмотр профиля
Re: Типовые алгоритмы
« Ответ #197 : Январь 12, 2017, 07:04:25 pm »
Как-то оно странно...

Ничего странного. Функция WNDFIND возвращает hwnd первого попавшегося окна в заголовке которого присутствует слово "блокнот". Можно использовать дополнительный параметр для поиска слов от начала, читай справку.

m.igel

  • Освоившийся
  • **
  • Сообщений: 23
    • Просмотр профиля
Re: Типовые алгоритмы
« Ответ #198 : Январь 12, 2017, 07:11:38 pm »
Функция WNDFIND возвращает hwnd первого попавшегося окна в заголовке которого присутствует слово "блокнот".


ОК, спасибо!

Но в окне кликермана вроде ничего про блокнот нету...
Кроме названия "Блокнот.cms"  ;)
Оно?

Нет. Поменял название .cms — ничего не изменилось. Где там "блокнот" у кликермана?

От я ж слепошарый! Во первых строках кода!
Поменял на
#name "Запись в notepad"//Имя нашего скрипта
и всё заработало.

Ещё раз спасибо!
« Последнее редактирование: Январь 12, 2017, 07:19:04 pm от m.igel »

quant13

  • Активный участник
  • ***
  • Сообщений: 174
    • Просмотр профиля
Скриншот(окна)
Код: Clickermann
  1. #name "Get Screenshot"
  2. HSET(12345,0)
  3. $h=WNDFIND ("Блокнот")      //название окна (при скриншоте должно быть активным, разумеется)
  4. wndgetinfo($h, $var1, $var2, $var3, $var4)
  5. $x1=$var1
  6. $y1=$var2
  7. $x2=$x1+$var3
  8. $y2=$y1+$var4
  9. waitms(100)
  10. IF(iskeydown(#PAGEDOWN)=1) //пока нажат #PAGEDOWN делает скриншотики
  11.   GETSCREEN($x1,$y1,$x2,$y2)
  12.   COLORMODE(6,$x1,$y1,$x2,$y2)
  13.   SCREENSHOTEX($x1,$y1,$x2,$y2, "Image_",0)
  14. //   HINTPOPUP("saved")
  15.   waitms(250)
  16. END_IF
  17.  
  18.  
  19.  

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3685
  • Котэ
    • Просмотр профиля
Скриншот окна под курсором
Код: Clickermann
  1. #name "Get Screenshot"
  2.  
  3. IF(ISKEYDOWN(#CTRL)=1) // при нажатии CTRL делаем скриншот
  4.   WHILE(ISKEYDOWN(#CTRL)=1)
  5.      WAITMS(5)
  6.   END_CYC
  7.   WNDGETINFO(HGET($_xmouse,$_ymouse), $x,$y, $sizx,$sizy)
  8.   WAITMS(50)
  9.   GETSCREEN
  10.   COLORMODE(6)
  11.   SCREENSHOTEX($x,$y, $x+$sizx,$y+$sizy, "Image_",0)
  12.   WAITMS(20)
  13. ELSE
  14.   WAITMS(20)
  15. END_IF

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3800
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • Просмотр профиля
Ближайшая к заданным координатам/центру картинка:
Код: Clickermann
  1. #name "Ближайшая к заданным координатам/центру картинка"
  2. // Author: Vint
  3. // Version: 1.0 (14.10.2013)
  4.  
  5. // цель
  6. $Xtarget = 500
  7. $Ytarget = 500
  8.  
  9. // цель - центр экрана
  10. //$Xtarget = ($_xmax+1) / 2
  11. //$Ytarget = ($_ymax+1) / 2
  12.  
  13.  
  14. GETSCREEN(0,0, $_xmax,$_ymax)
  15. SCANPICTURE($scan, 0,0, $_xmax,$_ymax, "picture.bmp", -1, 100)
  16.  
  17. $dist = 10000
  18. $scan_size = ARRSIZE($scan)
  19. FOR($i=0, $i < $scan_size, 2)
  20.    $X = $scan[$i]
  21.    $Y = $scan[$i+1]
  22.    $d_temp = DIST($Xtarget, $Ytarget, $X, $Y)
  23.    IF($d_temp < $dist)
  24.        $dist = $d_temp
  25.        $Xdot_target = $X
  26.        $Ydot_target = $Y
  27.    END_IF
  28.    IF($Y > ($Ytarget + $dist))
  29.        $i = $scan_size
  30.    END_IF
  31. END_CYC
  32. UNDEFINE($scan)
  33.  
  34. IF($dist ! 10000)
  35.    LOGWRITE ("Ближайшая картинка к заданным координатам X/Y: ", $Xdot_target, " / ", $Ydot_target)
  36. ELSE
  37.    LOGWRITE ("Картинка не найдена")
  38. END_IF
  39.  
  40. HALT
  41.  

Ближайший к заданным координатам пиксель:
Код: Clickermann
  1. #name "Ближайший к заданным координатам пиксель"
  2.  
  3. // цель
  4. $Xtarget = 500
  5. $Ytarget = 500
  6.  
  7. GETSCREEN
  8. SCANPXL($scan, 0,0, $_xmax,$_ymax, 255)
  9.  
  10. $dist = 10000
  11. $scan_size = ARRSIZE($scan)
  12. FOR($i=0, $i < $scan_size, 2)
  13.    $X = $scan[$i]
  14.    $Y = $scan[$i+1]
  15.    $d_temp = DIST($Xtarget, $Ytarget, $X, $Y)
  16.    IF($d_temp < $dist)
  17.        $dist = $d_temp
  18.        $Xdot_target = $X
  19.        $Ydot_target = $Y
  20.    END_IF
  21.    IF($Y > ($Ytarget + $dist))
  22.       $i = $scan_size
  23.    END_IF    
  24. END_CYC
  25. UNDEFINE($scan)
  26.  
  27. IF($dist ! 10000)
  28.    LOGWRITE ("Ближайший пиксель к заданным координатам X/Y: ", $Xdot_target, " / ", $Ydot_target)
  29. ELSE
  30.    LOGWRITE ("Заданный цвет не найден")
  31. END_IF
  32.  
  33. HALT
  34.  

А то периодически всплывает.

P.S. 04.09.2018 исправлена опечатка.
« Последнее редактирование: Сентябрь 04, 2018, 11:24:51 am от Vint »


Axelenz

  • Освоившийся
  • **
  • Сообщений: 31
  • Парсинг сайтов, наполнение интернет-магазинов
    • Просмотр профиля
Развернуть окно на весь экран

Столкнулся с проблемой как корректно развернуть (maximize) окно. Кто-то уже отвечал на этот вопрос на форуме и посоветовал использовать WNDSETINFO($hwnd, 0,0, $_xmax,$_ymax), но это не "честный" maximize, и это не будет работать в случае мульти-мониторов (ну точнее это будет работать, но совсем не так как вы предполагали :)) )
Нашел как сделать "честный" maximize:
Код: Clickermann
  1. POSTMESSAGE($_hwnd, 0x0112, 0xF030, 0) // Развернуть окно на весь экран
где
0x0112 это WM_SYSCOMMAND
0xF030 это SC_MAXIMIZE
(Если нужен minimize, то - 0xF020 это SC_MINIMIZE)
Работает идеально у меня на версии кликерманна 4.12, ОС: Win10 x64
Может кому пригодится..

Погасить экран монитора
(иногда полезно ставить перед HALT)
Код: Clickermann
  1. SendMessage(0xFFFF, 0x0112, 0xF170, 2) //Погасить экран монитора

HWND_BROADCAST = 0xFFFF
WM_SYSCOMMAND = 0x0112
SC_MONITORPOWER = 0xF170
Код: HTML
  1. lParam Описание
  2. -1 Переводит монитор в нормальный, рабочий режим
  3. 0 Переводит монитор в режим "легкого" засыпания
  4. 1 Переводит монитор в спящий режим
  5. 2 Монитор выключается
(у меня на Windows 8.1 работает только "2").

Включить экран - движение мышкой.
"Можно бесконечно смотреть на три вещи: как течёт вода, как горит огонь и как Clickermann работает вместо тебя..."

_______

  • Зашел в гости
  • *
  • Сообщений: 6
    • Просмотр профиля
Было бы неплохо дописать в пост "Скрипт выполняет действия в разные промежутки времени" ещё выполнение действий в заданное время. К примеру нужно мне в 7:00, 14:00 и 19:00 выполнить что-то.
Код: Clickermann
  1. if(($_time_h=14)&($_time_m=00) ^ ($_time_h=7)&($_time_m=00) ^ ($_time_h=21)&($_time_m=00))
  2. BEEP(500,500) //своё действие
  3. ELSE
  4. WAIT(1)
  5. END_IF
Хотя мне кажется, что если попытаться моим кодом сделать в 7:30, 14:00 и 19:20, то он будет и в 7:00 и в 7:20 и в 7:30 действие повторять, хотя и не проверял..
Или к примеру если каждый час нужно выполнять, то:
Код: Clickermann
  1. if(($_time_m=00)) //вместо 00 ставим свои минуты в которые выполнять
  2. BEEP(500,500) //своё действие
  3. ELSE
  4. WAIT(1)
  5. END_IF
Можно конечно так же написать действие раз в минуту, но если действие длится дольше минуты то не получится.
« Последнее редактирование: Октябрь 21, 2018, 01:35:26 pm от _______ »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3685
  • Котэ
    • Просмотр профиля
Исправление ошибок
Код: Clickermann
  1. IF((($_time_h=14)&($_time_m=0)) | (($_time_h=7)&($_time_m=0)) | (($_time_h=21)&($_time_m=0)))
  2.   BEEP(500,500) //своё действие
  3. ELSE
  4.   WAIT(1)
  5. END_IF
  6.  

Код: Clickermann
  1. IF($_time_m=0) //вместо 00 ставим свои минуты в которые выполнять
  2.   BEEP(500,500) //своё действие
  3. ELSE
  4.   WAIT(1)
  5. END_IF

_______

  • Зашел в гости
  • *
  • Сообщений: 6
    • Просмотр профиля
Исправление ошибок
Спасибо=) Теперь буду знать как это пишется правильно.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3800
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • Просмотр профиля
Клик в глобальных координатах без перемещения. LCLICK без MOVE.

Код: Clickermann
  1. SUB(only_lclick, $olclx, $olcly)
  2.    $olcl_hwnd = HGET($olclx, $olcly)
  3.    WNDGETINFO($olcl_hwnd, $olcl_wx, $olcl_wy, $olcl_w, $olcl_h)
  4.    LOGWRITE($olcl_wx, "  ", $olcl_wy)
  5.    $olclx = $olclx - $olcl_wx
  6.    $olcly = $olcly - $olcl_wy
  7.    LOGWRITE($olclx, "  ", $olcly)
  8.    POSTMESSAGE($olcl_hwnd, 0x0201, 0x0001,$olclx+($olcly*65536)) //LDOWN
  9.    WAITMS(30)
  10.    POSTMESSAGE($olcl_hwnd, 0x0202, 0x0001,$olclx+($olcly*65536)) //LUP
  11. END_SUB
  12.  
  13. // Lclick в глобальных координатах 253,  365
  14. only_lclick(253, 365)
  15.  
  16. HALT

При необходимости можно доработать, сделать переключатель локальные/глобальные координаты. Передавать в ПП задержку между нажатием-отпусканием.


Мыха

  • Освоившийся
  • **
  • Сообщений: 43
    • Просмотр профиля
вскочил следующий вопрос

перед завершением скрипта хотелось бы, чтобы кликерманн отображался поверх всех окон.


???

Vint

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


Код: Clickermann
  1. WNDBUMP($_hwnd_self)
« Последнее редактирование: Январь 14, 2021, 02:59:13 pm от Vint »


hrytsea

  • Зашел в гости
  • *
  • Сообщений: 13
    • Просмотр профиля
ШИКАРНЫЙ (и достаточно простой) симулятор человеческого движения мыши WindMouse.
Адаптировано под Clickermann отсюда: https://ben.land/post/2021/04/25/windmouse-human-mouse-movement/

Менять скорость параметром $m0, скорость ветра $w0, расстояние замедления перед остановкой $d0, гравитацию - $g0

Код: Clickermann
  1. // Mouse movement that's affected by gravity and wind physics laws
  2. // https://ben.land/post/2021/04/25/windmouse-human-mouse-movement/
  3. sub(hyp, $A, $B)
  4.    $R1 = round(sqrt($A*$A + $B*$B), 0)
  5. end_sub
  6.  
  7. sub(min, $A, $B)
  8.    if($A > $B)
  9.        $R1 = $B
  10.    else
  11.        $R1 = $A
  12.    end_if
  13. end_sub
  14.  
  15. sub(rand, $A, $B, $round)   // если round=1, округляет результат
  16.    $rand = rnd(0, 1000000)
  17.    $rnd = $A + ($B - $A)*$rand/1000000
  18.  
  19.    if($round = 1)
  20.        $rnd = round($rnd, 0)
  21.    end_if
  22. end_sub
  23.  
  24. sub(mouse_init)
  25.    $SQRT3 = sqrt(3)
  26.    $SQRT5 = sqrt(5)
  27.  
  28.    $cX = $_xmouse
  29.    $cY = $_ymouse
  30.    $mDist = round(dist($cX, $cY, $eX, $eY), 0) + 1
  31.  
  32.    // скорости по осям X и Y
  33.    $vX = 0
  34.    $vY = 0
  35.    $vMag = 0
  36.    $wX = 0
  37.    $wY = 0
  38.    $wMag = 0
  39.    $tMMax = $_time_t + rnd(4,6)
  40.  
  41.    rand(8,9,0)
  42.    $g0 = $rnd     // magnitude of the gravitational force                        (влияет на амплитуду волны)
  43.  
  44.    rand(0,100,0)
  45.    if($rnd < 10)  // в 10% сильный ветер
  46.        rand(2,4,0)
  47.        $w0 = $rnd     // magnitude of the wind force fluctuations                    (влияет на длину волны)
  48.    else
  49.        rand(0.8,2,0)
  50.        $w0 = $rnd
  51.    end_if
  52.  
  53.    rand(15,25,0)
  54.    $m0 = $rnd     // maximum mouse_step size (velocity clip threshold)           (влияет на скорость волны)
  55.  
  56.    rand(2,8,0)
  57.    $d0 = $rnd     // distance where wind behavior changes from random to damped  (влияет на затухание волны)
  58. end_sub
  59.  
  60. sub(mouse_step)      // считает скорость по осям X и Y, вычисляет координаты следующего шаг
  61.    min($m0, $mDist)
  62.    $m0 = $R1
  63.  
  64.    min($w0, $mDist)    // чтобы не перепрыгнуть цель
  65.    $wMag = $R1
  66.  
  67.    if($mDist > $d0)
  68.        rand(-$wMag, $wMag, 0)
  69.        $wX = $wX / $SQRT3 + $rnd / $SQRT5
  70.  
  71.        rand(-$wMag, $wMag, 0)
  72.        $wY = $wY / $SQRT3 + $rnd / $SQRT5
  73.    else
  74.        $wX = $wX / $SQRT3
  75.        $wY = $wY / $SQRT3
  76.  
  77.        if($m0 < 1)
  78.            $m0 = 1
  79.        else
  80.            if($m0 > 2)    // чтобы замедлиться перед остановкой
  81.                $m0 = $m0 / $SQRT3
  82.            end_if
  83.        end_if
  84.    end_if
  85.  
  86.    // "ветер" и "гравитация" влияют на скорость мыши по осям
  87.    $vX = $vX + $wX + $g0 * ($eX - $cX)/$mDist
  88.    $vY = $vY + $wY + $g0 * ($eY - $cY)/$mDist
  89.    hyp($vX, $vY)
  90.    $vMag = $R1
  91.  
  92.    if($vMag > $m0)    // чтобы не перепрыгнуть цель
  93.        rand(0,$m0,0)
  94.        $vClip = $m0/2 + $rnd/2
  95.        $vX = ($vX/$vMag) * $vClip
  96.  
  97.        rand(0,$m0,0)
  98.        $vClip = $m0/2 + $rnd/2
  99.        $vY = ($vY/$vMag) * $vClip
  100.    end_if
  101.  
  102.    $mX = round($cX + $vX, 0)           // where to move
  103.    min($mX, $_xmax)
  104.    max($R1, 0)
  105.    $mX = $R1
  106.    $mY = round($cY + $vY, 0)
  107.    min($mY, $_ymax)
  108.    max($R1, 0)
  109.    $mY = $R1
  110.  
  111.    if(($cX != $mX) or ($cY != $mY))
  112.        move($mX, $mY)
  113.        $cX = $_xmouse
  114.        $cY = $_ymouse
  115.    end_if
  116. end_sub
  117.  
  118. sub(wind_mouse, $eX, $eY, $wMin, $wMax)
  119.    mouse_init()
  120.  
  121.    while(($mDist > 2) and ($_time_t < $tMMax))    // разброс вокруг цели <= 3
  122.        mouse_step()
  123.  
  124.        $mDist = round(dist($cX, $cY, $eX, $eY), 0)
  125.    end_cyc
  126.  
  127.    waitms(rnd($wMin,$wMax))
  128. end_sub

Чтобы протестировать, откройте на весь экран Paint, выберите кисть и запустите данный скрипт:
Код: Clickermann
  1. sub(move_rand)
  2.    $m_x = rnd(200, $_xmax-200)
  3.    $m_y = rnd(200, $_ymax-200)
  4.    wind_mouse($m_x, $m_y, 500, 1500)
  5. end_sub
  6.  
  7. move_rand()
  8. lclick($_xmouse, $_ymouse)
  9. waitms(100)
  10. ldown($_xmouse, $_ymouse)
  11.  
  12. for($rmove = 0, $rmove < 10)
  13.    move_rand()
  14. end_cyc
  15.  
  16. lup($_xmouse, $_ymouse)
  17.  
  18. halt()

Если попытаться сдвинуть курсор во время исполнения скрипта, получится интересный узор :)
« Последнее редактирование: Март 25, 2022, 04:51:03 pm от hrytsea »