Author Topic: Типовые алгоритмы, вводные статьи (Новички, читайте!)  (Read 291052 times)

0 Members and 1 Guest are viewing this topic.

mikem

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
Развернуть окно на весь экран

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

m.igel

  • Освоившийся
  • **
  • Posts: 23
    • View Profile
Re: Типовые алгоритмы
« Reply #196 on: January 12, 2017, 06:50:37 PM »
Заметь, что должна быть включена английская раскладка.
Нельзя ли   процедуру  переключения раскладки  поручить  самой программе, или хотя бы дать понять пользователю , что  у него раскладка не та? 


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

Code: [Select]
// 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

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Типовые алгоритмы
« Reply #197 on: January 12, 2017, 07:04:25 PM »
Как-то оно странно...

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

m.igel

  • Освоившийся
  • **
  • Posts: 23
    • View Profile
Re: Типовые алгоритмы
« Reply #198 on: January 12, 2017, 07:11:38 PM »
Функция WNDFIND возвращает hwnd первого попавшегося окна в заголовке которого присутствует слово "блокнот".


ОК, спасибо!

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

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

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

Ещё раз спасибо!
« Last Edit: January 12, 2017, 07:19:04 PM by m.igel »

quant13

  • Активный участник
  • ***
  • Posts: 174
    • View Profile
Скриншот(окна)
Code: (Clickermann) [Select]
#name "Get Screenshot"
HSET(12345,0)
$h=WNDFIND ("Блокнот")      //название окна (при скриншоте должно быть активным, разумеется)
wndgetinfo($h, $var1, $var2, $var3, $var4)
$x1=$var1
$y1=$var2
$x2=$x1+$var3
$y2=$y1+$var4
waitms(100)
IF(iskeydown(#PAGEDOWN)=1) //пока нажат #PAGEDOWN делает скриншотики
   GETSCREEN($x1,$y1,$x2,$y2)
   COLORMODE(6,$x1,$y1,$x2,$y2)
   SCREENSHOTEX($x1,$y1,$x2,$y2, "Image_",0)
//   HINTPOPUP("saved")
   waitms(250)
END_IF



Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Скриншот окна под курсором
Code: (clickermann) [Select]
#name "Get Screenshot"

IF(ISKEYDOWN(#CTRL)=1) // при нажатии CTRL делаем скриншот
   WHILE(ISKEYDOWN(#CTRL)=1)
      WAITMS(5)
   END_CYC
   WNDGETINFO(HGET($_xmouse,$_ymouse), $x,$y, $sizx,$sizy)
   WAITMS(50)
   GETSCREEN
   COLORMODE(6)
   SCREENSHOTEX($x,$y, $x+$sizx,$y+$sizy, "Image_",0)
   WAITMS(20)
ELSE
   WAITMS(20)
END_IF

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Ближайшая к заданным координатам/центру картинка:
Code: (clickermann) [Select]
#name "Ближайшая к заданным координатам/центру картинка"
// Author: Vint
// Version: 1.0 (14.10.2013)

// цель
$Xtarget = 500
$Ytarget = 500

// цель - центр экрана
//$Xtarget = ($_xmax+1) / 2
//$Ytarget = ($_ymax+1) / 2


GETSCREEN(0,0, $_xmax,$_ymax)
SCANPICTURE($scan, 0,0, $_xmax,$_ymax, "picture.bmp", -1, 100)

$dist = 10000
$scan_size = ARRSIZE($scan)
FOR($i=0, $i < $scan_size, 2)
    $X = $scan[$i]
    $Y = $scan[$i+1]
    $d_temp = DIST($Xtarget, $Ytarget, $X, $Y)
    IF($d_temp < $dist)
        $dist = $d_temp
        $Xdot_target = $X
        $Ydot_target = $Y
    END_IF
    IF($Y > ($Ytarget + $dist))
        $i = $scan_size
    END_IF
END_CYC
UNDEFINE($scan)

IF($dist ! 10000)
    LOGWRITE ("Ближайшая картинка к заданным координатам X/Y: ", $Xdot_target, " / ", $Ydot_target)
ELSE
    LOGWRITE ("Картинка не найдена")
END_IF

HALT

Ближайший к заданным координатам пиксель:
Code: (clickermann) [Select]
#name "Ближайший к заданным координатам пиксель"

// цель
$Xtarget = 500
$Ytarget = 500

GETSCREEN
SCANPXL($scan, 0,0, $_xmax,$_ymax, 255)

$dist = 10000
$scan_size = ARRSIZE($scan)
FOR($i=0, $i < $scan_size, 2)
    $X = $scan[$i]
    $Y = $scan[$i+1]
    $d_temp = DIST($Xtarget, $Ytarget, $X, $Y)
    IF($d_temp < $dist)
        $dist = $d_temp
        $Xdot_target = $X
        $Ydot_target = $Y
    END_IF
    IF($Y > ($Ytarget + $dist))
       $i = $scan_size
    END_IF   
END_CYC
UNDEFINE($scan)

IF($dist ! 10000)
    LOGWRITE ("Ближайший пиксель к заданным координатам X/Y: ", $Xdot_target, " / ", $Ydot_target)
ELSE
    LOGWRITE ("Заданный цвет не найден")
END_IF

HALT

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

P.S. 04.09.2018 исправлена опечатка.
« Last Edit: September 04, 2018, 11:24:51 AM by Vint »


Axelenz

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

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

Погасить экран монитора
(иногда полезно ставить перед HALT)
Code: (clickermann) [Select]
SendMessage(0xFFFF, 0x0112, 0xF170, 2) //Погасить экран монитора
HWND_BROADCAST = 0xFFFF
WM_SYSCOMMAND = 0x0112
SC_MONITORPOWER = 0xF170
Code: (html5) [Select]
lParam Описание
-1 Переводит монитор в нормальный, рабочий режим
0 Переводит монитор в режим "легкого" засыпания
1 Переводит монитор в спящий режим
2 Монитор выключается
(у меня на Windows 8.1 работает только "2").

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

_______

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
Было бы неплохо дописать в пост "Скрипт выполняет действия в разные промежутки времени" ещё выполнение действий в заданное время. К примеру нужно мне в 7:00, 14:00 и 19:00 выполнить что-то.
Code: (clickermann) [Select]
if(($_time_h=14)&($_time_m=00) ^ ($_time_h=7)&($_time_m=00) ^ ($_time_h=21)&($_time_m=00))
BEEP(500,500) //своё действие
ELSE
WAIT(1)
END_IF
Хотя мне кажется, что если попытаться моим кодом сделать в 7:30, 14:00 и 19:20, то он будет и в 7:00 и в 7:20 и в 7:30 действие повторять, хотя и не проверял..
Или к примеру если каждый час нужно выполнять, то:
Code: (clickermann) [Select]
if(($_time_m=00)) //вместо 00 ставим свои минуты в которые выполнять
BEEP(500,500) //своё действие
ELSE
WAIT(1)
END_IF
Можно конечно так же написать действие раз в минуту, но если действие длится дольше минуты то не получится.
« Last Edit: October 21, 2018, 01:35:26 PM by _______ »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Исправление ошибок
Code: (clickermann) [Select]
IF((($_time_h=14)&($_time_m=0)) | (($_time_h=7)&($_time_m=0)) | (($_time_h=21)&($_time_m=0)))
   BEEP(500,500) //своё действие
ELSE
   WAIT(1)
END_IF

Code: (clickermann) [Select]
IF($_time_m=0) //вместо 00 ставим свои минуты в которые выполнять
   BEEP(500,500) //своё действие
ELSE
   WAIT(1)
END_IF

_______

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

Vint

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

Code: (clickermann) [Select]
SUB(only_lclick, $olclx, $olcly)
    $olcl_hwnd = HGET($olclx, $olcly)
    WNDGETINFO($olcl_hwnd, $olcl_wx, $olcl_wy, $olcl_w, $olcl_h)
    LOGWRITE($olcl_wx, "  ", $olcl_wy)
    $olclx = $olclx - $olcl_wx
    $olcly = $olcly - $olcl_wy
    LOGWRITE($olclx, "  ", $olcly)
    POSTMESSAGE($olcl_hwnd, 0x0201, 0x0001,$olclx+($olcly*65536)) //LDOWN
    WAITMS(30)
    POSTMESSAGE($olcl_hwnd, 0x0202, 0x0001,$olclx+($olcly*65536)) //LUP
END_SUB

// Lclick в глобальных координатах 253,  365
only_lclick(253, 365)

HALT

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


hrytsea

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

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

Code: (clickermann) [Select]
// Mouse movement that's affected by gravity and wind physics laws
// https://ben.land/post/2021/04/25/windmouse-human-mouse-movement/
sub(hyp, $A, $B)
    $R1 = round(sqrt($A*$A + $B*$B), 0)
end_sub

sub(min, $A, $B)
    if($A > $B)
        $R1 = $B
    else
        $R1 = $A
    end_if
end_sub

sub(rand, $A, $B, $round)   // если round=1, округляет результат
    $rand = rnd(0, 1000000)
    $rnd = $A + ($B - $A)*$rand/1000000
   
    if($round = 1)
        $rnd = round($rnd, 0)
    end_if
end_sub

sub(mouse_init)
    $SQRT3 = sqrt(3)
    $SQRT5 = sqrt(5)
   
    $cX = $_xmouse
    $cY = $_ymouse
    $mDist = round(dist($cX, $cY, $eX, $eY), 0) + 1
   
    // скорости по осям X и Y
    $vX = 0
    $vY = 0
    $vMag = 0
    $wX = 0
    $wY = 0
    $wMag = 0
    $tMMax = $_time_t + rnd(4,6)
   
    rand(8,9,0)
    $g0 = $rnd     // magnitude of the gravitational force                        (влияет на амплитуду волны)
   
    rand(0,100,0)
    if($rnd < 10)  // в 10% сильный ветер
        rand(2,4,0)
        $w0 = $rnd     // magnitude of the wind force fluctuations                    (влияет на длину волны)
    else
        rand(0.8,2,0)
        $w0 = $rnd
    end_if
   
    rand(15,25,0)
    $m0 = $rnd     // maximum mouse_step size (velocity clip threshold)           (влияет на скорость волны)
   
    rand(2,8,0)
    $d0 = $rnd     // distance where wind behavior changes from random to damped  (влияет на затухание волны)
end_sub

sub(mouse_step)      // считает скорость по осям X и Y, вычисляет координаты следующего шаг
    min($m0, $mDist)
    $m0 = $R1
   
    min($w0, $mDist)    // чтобы не перепрыгнуть цель
    $wMag = $R1
   
    if($mDist > $d0)
        rand(-$wMag, $wMag, 0)
        $wX = $wX / $SQRT3 + $rnd / $SQRT5
       
        rand(-$wMag, $wMag, 0)
        $wY = $wY / $SQRT3 + $rnd / $SQRT5
    else
        $wX = $wX / $SQRT3
        $wY = $wY / $SQRT3
       
        if($m0 < 1)
            $m0 = 1
        else
            if($m0 > 2)    // чтобы замедлиться перед остановкой
                $m0 = $m0 / $SQRT3
            end_if
        end_if
    end_if
   
    // "ветер" и "гравитация" влияют на скорость мыши по осям
    $vX = $vX + $wX + $g0 * ($eX - $cX)/$mDist
    $vY = $vY + $wY + $g0 * ($eY - $cY)/$mDist
    hyp($vX, $vY)
    $vMag = $R1
   
    if($vMag > $m0)    // чтобы не перепрыгнуть цель
        rand(0,$m0,0)
        $vClip = $m0/2 + $rnd/2
        $vX = ($vX/$vMag) * $vClip
       
        rand(0,$m0,0)
        $vClip = $m0/2 + $rnd/2
        $vY = ($vY/$vMag) * $vClip
    end_if
   
    $mX = round($cX + $vX, 0)           // where to move
    min($mX, $_xmax)
    max($R1, 0)
    $mX = $R1
    $mY = round($cY + $vY, 0)
    min($mY, $_ymax)
    max($R1, 0)
    $mY = $R1
   
    if(($cX != $mX) or ($cY != $mY))
        move($mX, $mY)
        $cX = $_xmouse
        $cY = $_ymouse
    end_if
end_sub

sub(wind_mouse, $eX, $eY, $wMin, $wMax)
    mouse_init()
   
    while(($mDist > 2) and ($_time_t < $tMMax))    // разброс вокруг цели <= 3
        mouse_step()
       
        $mDist = round(dist($cX, $cY, $eX, $eY), 0)
    end_cyc
   
    waitms(rnd($wMin,$wMax))
end_sub

Чтобы протестировать, откройте на весь экран Paint, выберите кисть и запустите данный скрипт:
Code: (clickermann) [Select]
sub(move_rand)
    $m_x = rnd(200, $_xmax-200)
    $m_y = rnd(200, $_ymax-200)
    wind_mouse($m_x, $m_y, 500, 1500)
end_sub

move_rand()
lclick($_xmouse, $_ymouse)
waitms(100)
ldown($_xmouse, $_ymouse)

for($rmove = 0, $rmove < 10)
    move_rand()
end_cyc

lup($_xmouse, $_ymouse)

halt()

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


Шамбамбукли вздохнул и опустил небо пониже.

dramster

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

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

hrytsea

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

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

Прикрепил код Clickermann  ;)


Шамбамбукли вздохнул и опустил небо пониже.