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

Основной раздел => Общие вопросы => Topic started by: Kryak on June 10, 2019, 11:26:25 PM

Title: SENDMESSAGE
Post by: Kryak on June 10, 2019, 11:26:25 PM
Ребят, как при помощи SENDMESSAGE отправить клик по элементу?
Title: Re: SENDMESSAGE
Post by: Oraven on June 11, 2019, 07:36:28 AM
Code: (clickermann) [Select]
SUB(SM_Lclick, $xsm,$ysm,$hwsm) // в начале скрипта
   SENDMESSAGE($hwsm,0x0201,0x0001,$xsm+($ysm*65536))//LDOWN
   WAITMS(50)
   SENDMESSAGE($hwsm,0x0202,0x0000,$xsm+($ysm*65536))//LUP
   WAITMS(50)
END_SUB

// вызов подпрограммы клика там где нужно
SM_Lclick(271,35,$_hwnd) // x,y,HWND

HALT
Title: Re: SENDMESSAGE
Post by: Kryak on June 11, 2019, 09:07:04 AM
Спасибо!
Title: Re: SENDMESSAGE
Post by: Kryak on June 11, 2019, 09:20:34 AM
А "271,35", это внутренние координаты того элемента, по которому кликаем, я так понимаю?
Title: Re: SENDMESSAGE
Post by: Hito on June 18, 2019, 08:20:38 AM
А такой вопрос у меня, ребят... А текст как-то можно передать через все это дело? Ну, и принять соответственно...
Title: Re: SENDMESSAGE
Post by: Hito on June 19, 2019, 03:40:26 PM
Что - никак...?
Title: Re: SENDMESSAGE
Post by: Vint on June 19, 2019, 04:31:59 PM
Как последовательность кодов. Только нужно выбрать код обозначающий конец последовательности.
Куда передавать то?
Title: Re: SENDMESSAGE
Post by: Hito on June 19, 2019, 05:52:59 PM
Куда передавать то?
Ну, как бы два варианта хотелось бы понять. 1 - передача в другую программу (приоритетный вопрос). Правда потом наверно придется рыть инет в поиске ответов на вопрос - как ПРИНЯТЬ  текст... 2 - передача из кликера в кликер.
Title: Re: SENDMESSAGE
Post by: Hito on June 19, 2019, 05:58:51 PM
Могу объяснить задачу... К примеру, я написал сервер, который может принимать сообщения от клиентов. Клиенты я так же написал. В каждой виртуалке, в которой я запускаю кликер, запускается клиент, который должен "общаться" с кликером. Этот клиент так же общается с сервером, обмениваясь сообщениями. То есть... С сервера может быть послана команда всем клиентам - "Первая машина - стоп". Клиент в первой виртуальной машине ловит это сообщение и передает кликеру (который запущен в этой же машине) команду - "Стоп", и кликер отвечает клиенту - "Остановка", и останавливается. А клиент ловит сообщение от кликера и отвечает серверу - "Первая машина - остановлена".
Title: Re: SENDMESSAGE
Post by: Vint on June 19, 2019, 08:23:04 PM
А нафига текст. Проще коды передавать.
Там же ограниченное число команд будет. Создать словарик 1-старт, 2-стоп, 3-самоубиться, 4-запуск потока D и т.д.
Но можно и текст, лишняя сложность. Вот если кликер должен какие-то донные принимать или отдавать, тогда да, есть смысл.
Title: Re: SENDMESSAGE
Post by: Hito on June 19, 2019, 10:13:04 PM
Вот если кликер должен какие-то донные принимать или отдавать, тогда да, есть смысл.
Под данными ты имеешь в виду файлы? Я на это уже не замахиваюсь... Но... Кликер может сделать скрин и отправить команду клиенту, чтобы ТОТ отправил этот скрин серверу. Но это уже другая песня и она более осуществима. А вот насчет передачи кодов можно поподробнее...? К примеру, мне нужно передать от кликера клиенту - 1. Это как будет выглядеть?
Title: Re: SENDMESSAGE
Post by: Vint on June 20, 2019, 06:54:00 AM
будет выглядеть как POSTMESSAGE...  :D
Данные любые текстовые. Не файлы. Имя аккаунта, например, его уровень жизни, или имя моба поблизости или что собрали, координаты, сообщения в чат и т.п.
Передаёшь ты к примеру команду 'всем собраться в координатах ...'.
Title: Re: SENDMESSAGE
Post by: Hito on June 20, 2019, 09:18:06 AM
будет выглядеть как POSTMESSAGE...  :D
Code: (clickermann) [Select]
POSTMESSAGE
HALT

(https://my-files.ru/Get/4wu5md/QIP%20Shot%20-%20Screen%20053.png)

Ты просто не понял ) Я в POSTMESSAGE не в зуб ногой, как я вас тут когда-то мучал с вопросом о переменной. И сколько я инет по этой теме не рою - никак понять не могу. Мне досконально примерами разжевать надо...
Title: Re: SENDMESSAGE
Post by: Hito on June 20, 2019, 10:08:14 AM
Объясню ситуацию... Да - я все со своими пресловутыми виртуалками + дистанционное управление скриптами в них...
У меня запущено 15 виртуалок и в каждой из них запущен кликер, в котором скрипт сам круглые сутки запускает игру при дисконектах, заходит на нужного перса, входит в игру и соответственно выполняет действия в игре. Все эти 15 персов (в 15-ти виртуалках) должны действовать сообща. То есть - не каждый действует сам по себе - по своей программе, а они "общаются" между собой и действуют исходя из ситуации. Это общение у меня настроено через ини-файл, который находится в папке хостового компьютера, а в виртуалках эта папка настроена, как сетевая. И все бы ничего, но проект расширяется - добавляются новые фишки, команды и так далее. В скрипте уже 108 обращений к этому ини-файлу, будь то INIWRITE или INIREAD. СТО ВОСЕМЬ раз скрипт таскает этот ини-файл через сеть... Если бы можно было, как в других программах - один раз открыть этот файл и взять из него все нужные данные, то я прописал бы это в самом начале скрипта, но у нас на каждый INIWRITE и INIREAD кликер открывает и закрывает файл, так что смысла в том, чтобы весь файл считывать в начале скрипта, а потом работать с полученной информацией, я не вижу. Один хрен, что так, что так на получение всей этой инфы будет уходить драгоценное время и мощность процессора, так как кликер 108 раз протащит ини-файл через сеть, 108 раз его откроет и 108 раз закроет при любом раскладе. И вот моя задача - наладить "общение" каждого кликера в виртуалке с клиентом (написанным на delphi и который так же будет запущен в каждой виртуалке), через POSTMESSAGE (то есть - не используя никакие файлы для этого), а эти клиенты уже в свою очередь будут "общаться" с сервером (который будет запущен на хосте уже) через интернет, обмениваясь короткими сообщениями. Если бы кликер не агрился на совместное использование ини-файла с посторонней программой, то можно было бы обойтись и без этого POSTMESSAGE. В таком случае я бы просто устроил общение кликера с клиентом через ини-файл, который лежал бы уже в обычной папке на каждой виртуалке, но в виду того, что при таком совместном использовании у нас выскакивают ошибки в кликере, такой вариант отпадает...
Вот в общем я и пытаюсь разобраться с этим POSTMESSAGE... Или можно еще что-то придумать...? Помогите плиз... Я с этой темой уже давно мучаюсь...
Добавлю, что управление скриптами через telegram у меня уже налажено - с эти мне помогать не нужно ) Скрипты так же шлют в telegram оповещения, об интересующих меня ситуациях. Это все у меня работает. Так что с этим, если кому надо, могу помочь.
Title: Re: SENDMESSAGE
Post by: Vint on June 20, 2019, 04:07:16 PM
Давай по порядку. Передаём сообщение от кликера твоему клиенту.

POSTMESSAGE(hwnd, message, wParam, lParam)
 
где
hwnd hwnd твоего клиента (можно искать по названию или другим способом, это как всегда).
messageкод сообщения на отдельных кодах будут висеть разные действия.
wParam, lParam   передаваемые параметры. Твои два 32 битных числа (в 32 битной винде) которые ты можешь передать.

message
код сообщения. Часть кодов используется системой, поэтому их лучше не использовать
Диапазон кодов используемых системой:
;~ Стандартные сообщения   от  0   до  0x03FF (1023)

Диапазон кодов для использования локально (в одном приложении) хотя работать всё будет, но не всегда:
;~ Локальные сообщения       от  0x0400  (1024)  до  0x7FFF (32767)

То, что нам надо!
;~ Глобальные сообщения     от  0xC000 (49152)  до  0xFFFF (65535)


У каждого системного сообщения параметры wParam, lParam свои и передаётся там то, что нужно именно этому сообщению (в своих мы используем то, что нужно нам)
Пример
POSTMESSAGE($_hwnd,0x0301,0,0) // передаём окну код 0x0301 - скопировать
POSTMESSAGE($_hwnd,0x0302,0,0) // передаём окну код 0x0302 - вставить
wParam, lParam равны 0 и не используются

//Отправляем сообщение окну о нажатой левой кнопке мыши
POSTMESSAGE($HWND, 0x0201, 1, $x + ($y*65536))
0x0201 - код нажатия ЛКМ
lParam содержит в одном числе координаты, куда именно кликаем. Координаты запихиваются так $x + ($y*65536))

Наш пример.
Так как же нам использовать. Да вот так берём и шлём сообщения, а клиент учим понимать их правильно.
Как писал выше кода будем использовать в диапазоне от 0xC000 (49152)  до  0xFFFF (65535)
Вот хотим мы передать клиенту ответ "машина запущена" или "машина остановлена"
Назначим кода

0xD001  (53249 в десятеричной) - машина запущена
0xD002  (53250)                            - машина остановлена
wParam                                         - номер машины
$_hwnd - дискриптор окна клиента

Code: (clickermann) [Select]
POSTMESSAGE($_hwnd , 0xD001, 3, 0) // запущена машина №3
можно во втором параметре передавать время действия в UNIX

Code: (clickermann) [Select]
POSTMESSAGE($_hwnd , 0xD002, 2, $_time_t) // остановлена машина №2, время текущее

Как делфи не знаю, знаю как в AutoIT если на нём сделана принимающая сторона
На код сообщения можно назначить свою функцию
Code: (php) [Select]
GUIRegisterMsg(0xD001, '_StartMashine')
GUIRegisterMsg(0xD002, '_StopMashine')

Func _StartMashine($hWnd, $iMsg, $iwParam, $ilParam)
    ConsoleWrite('Машина № ' & $iwParam & ' запущена' @CRLF)
EndFunc

Func _StopMashine($hWnd, $iMsg, $iwParam, $ilParam)
    ConsoleWrite('Машина № ' & $iwParam & ' остановлена в ' & $ilParam & @CRLF)
EndFunc
Title: Re: SENDMESSAGE
Post by: Vint on June 20, 2019, 04:28:25 PM
Вот как кликер принимает сообщения:
Code: (clickermann) [Select]
#name "GETMESSAGE test2"
// Author: Vint
// Version: 0.1 (20.06.2019)
// Скрипт для Clickermann v4.13.14

LOGCLEAR

// поток слушающий сообщение
THREAD(mess, 1)
   GETMESSAGE($wp, $lp, $isnew)
   IF($isnew != 0)
      LOGWRITE("wParam:", $wp, "  lParam:", $lp)
   END_IF
   WAITMS(200)
END_THREAD


// эмулируем отправку сообщения. Шлём сами себе
// кликер принимает только на один код прописанный в конфиге
// msg_hook = 1024
// по нормальному нужно поменять на любой из диапазона 0xC000 (49152)  до  0xFFFF (65535)
// но будет и так работать

// через 1 сек шлём  wParam = 123, lParam = 321
WAIT(1)
POSTMESSAGE($_hwnd_self, 1024, 123, 321)

// через 3 сек шлём  wParam = 555, lParam = 777
WAIT(3)
POSTMESSAGE($_hwnd_self, 1024, 555, 777)


WAIT(1)  // даём время сработать потоку
HALT
Title: Re: SENDMESSAGE
Post by: Vint on June 20, 2019, 04:48:06 PM
И так же можно передавать текст.
От кликера клиенту или другому кликеру
Code: (clickermann) [Select]
#name "Передача текста POSTMESSAGE"
// Author: Vint
// Version: 0.1 (20.06.2019)
// Скрипт для Clickermann v4.13.14

LOGCLEAR

$hwnd = 5000      // дискриптор окна клиента
$WM_text = 0xD003  // выбрали код для сообщения

$text = "Ехали медведи на велосипеде. 3 шт."

print("Символ -   Код")

$len = STRLEN($text) + 1
FOR($i=1,$i < $len)
   $chr = STRCUT($text, $i, 1)
   $cod = code($chr)
   print("  ", $chr, "    -  ", $cod)
   
   // передаём символ
   POSTMESSAGE($hwnd, $WM_text, $cod,1)  // lParam = 1 символ передаётся
END_CYC
POSTMESSAGE($hwnd, $WM_text, 0,0)  // wParam/lParam = 0 строка окончена

HALT

Quote
16:46:07 Символ -   Код
16:46:07   Е    -  1045
16:46:07   х    -  1093
16:46:07   а    -  1072
16:46:07   л    -  1083
16:46:07   и    -  1080
16:46:07        -  32
16:46:07   м    -  1084
16:46:07   е    -  1077
16:46:07   д    -  1076
16:46:07   в    -  1074
16:46:07   е    -  1077
16:46:07   д    -  1076
16:46:07   и    -  1080
16:46:07        -  32
16:46:07   н    -  1085
16:46:07   а    -  1072
16:46:07        -  32
16:46:07   в    -  1074
16:46:07   е    -  1077
16:46:07   л    -  1083
16:46:07   о    -  1086
16:46:07   с    -  1089
16:46:07   и    -  1080
16:46:07   п    -  1087
16:46:07   е    -  1077
16:46:07   д    -  1076
16:46:07   е    -  1077
16:46:07   .    -  46
16:46:07        -  32
16:46:07   3    -  51
16:46:07        -  32
16:46:07   ш    -  1096
16:46:07   т    -  1090
16:46:07   .    -  46
Title: Re: SENDMESSAGE
Post by: Hito on June 20, 2019, 06:53:13 PM
ОГРОМНОЕ спасибо за развернутый ответ! Разбираться буду через два дня - завтра мне вставать в 5 утра на работу и работаю 2/2.
Title: Re: SENDMESSAGE
Post by: Graubart on June 21, 2019, 02:44:39 PM
А кто знает, какие коды и параметры POSTMESSAGE для нижеперечисленных сообщений окну (если они вообще есть в винде)?

1. Убрать с заголовка окна иконку, все кнопки управления и меню по правой клавише.
2. Закрепить окно на своем месте поверх всех окон так, чтобы невозможно его было ни сдвинуть, ни переместить, ни перекрыть никаким способом.
Title: Re: SENDMESSAGE
Post by: Vint on June 21, 2019, 04:24:54 PM
Вряд ли такие команды есть в WinAPI.

Первое - это стили окна, они задаются при создании. Часть стилей можно заменить и позже. Но мне кажется это не API, а через вызов библиотеки GUI

Второе это обработчик событий. Может и есть команды, но я не знаю.
Title: Re: SENDMESSAGE
Post by: Graubart on June 21, 2019, 07:19:15 PM
Вряд ли такие команды есть в WinAPI.

Первое - это стили окна, они задаются при создании. Часть стилей можно заменить и позже. Но мне кажется это не API, а через вызов библиотеки GUI

Второе это обработчик событий. Может и есть команды, но я не знаю.
По первому я так и подозревал, что таких команд нет. Перерыл весь мелко-мягкий сайт - и MSDN, и API, и UWP, нигде не нашел.
А по второму, думаю, есть. Вот, например маленькая прога - Power Menu для Win - https://power-menu.ru.uptodown.com/windows. Закрепляет окно, сворачивает в трей, регулирует прозрачность. Как-то она делает это.
Title: Re: SENDMESSAGE
Post by: Hito on June 23, 2019, 09:21:35 AM
Что не правильно делаю? Отправляющий скрипт:
Code: (clickermann) [Select]
#name "Передача текста POSTMESSAGE"

LOGCLEAR
 
$_hwnd = wndfind("Name - GETMESSAGE test")      // дискриптор окна клиента
$WM_text = 0xD003  // выбрали код для сообщения
 
$text = "Ехали медведи на велосипеде. 3 шт."
 
print("Символ -   Код")
 
$len = STRLEN($text) + 1
FOR($i=1,$i < $len)
   $chr = STRCUT($text, $i, 1)
   $cod = code($chr)
   print("  ", $chr, "    -  ", $cod)
 
   // передаём символ
   POSTMESSAGE($_hwnd, $WM_text, $cod,1)  // lParam = 1 символ передаётся
   WAITMS(100)
END_CYC
POSTMESSAGE($_hwnd, $WM_text, 0,0)  // wParam/lParam = 0 строка окончена
 
HALT
Принимающий:
Code: (clickermann) [Select]
#name "GETMESSAGE test"

GETMESSAGE($wp, $lp, $isnew)
IF($isnew != 0)
   LOGWRITE($str)
else
   $str = strconcat($str, char($lp))
END_IF
WAITMS(50)
В итоге принимающий молчит...
Code: (clickermann) [Select]
$WM_text = 53251  // выбрали код для сообщенияи замена в конфиге "msg_hook = 1024" на "msg_hook = 53251" не помогает.
Title: Re: SENDMESSAGE
Post by: dramster on June 23, 2019, 06:06:02 PM
1. $hwnd = wndfind("Name - GETMESSAGE test") не правильно, правильно - $hwnd = wndfind("GETMESSAGE test")
2. ты отправляешь wparam а принимаешь lparam. В принимающем ставим $str = strconcat($str, char($wp))

Ну и желательно начальное значение строки задать, ато там будет "0" . define($str,"")
И остановить принимающий кликер тоже вроде как задумывалось из отправляющего
Code: (clickermann) [Select]
   IF($wp+$lp = 0)
      halt
   END_IF


В общем, принимающий у меня вышел так
Code: (clickermann) [Select]
#name "GETMESSAGE test"
define($str,"")

GETMESSAGE($wp, $lp, $isnew)

IF($isnew = 0) 
   LOGWRITE($str)
else
   IF($wp+$lp = 0)
      halt
   END_IF   
   $str = strconcat($str, char($wp))
END_IF
WAITMS(50)

(https://i.imgur.com/oWNrjfo.png)
Title: Re: SENDMESSAGE
Post by: Hito on June 23, 2019, 06:37:54 PM
Диапазон кодов для использования локально (в одном приложении) хотя работать всё будет, но не всегда:
;~ Локальные сообщения       от  0x0400  (1024)  до  0x7FFF (32767)

Странно... А почему я в этом диапазоне могу передавать параметры от кликера своему приложению...? В смысле - у меня получается передать их из кликера и принять в приложении.

https://www.youtube.com/watch?v=v35tr0Ch5Yw&feature=youtu.be (https://www.youtube.com/watch?v=v35tr0Ch5Yw&feature=youtu.be)
Title: Re: SENDMESSAGE
Post by: Hito on June 23, 2019, 06:41:19 PM
1. $_hwnd = wndfind("Name - GETMESSAGE test") не правильно, правильно - $_hwnd = wndfind("GETMESSAGE test")

С этим у меня все правильно ))

(http://9w.f.mf-image.ru/d/eyJ0IjoiMjAxOS0wNi0yM1QxNTo0MDozMS40NTIyODYwWiIsInRtIjoxNSwiYmQiOjEsImZkIjo1ODQwODcxLCJyZiI6bnVsbCwic2wiOjAsImZuIjpudWxsLCJyIjoiaHR0cHM6Ly9teS1maWxlcy5ydS9zbHJtZW0iLCJsIjpudWxsfQ,,.9DA691C1743A14A7AAF066619E9E2ADC./QIP%20Shot%20-%20Screen%20059.png)
Title: Re: SENDMESSAGE
Post by: dramster on June 24, 2019, 12:24:57 AM
1. $hwnd = wndfind("Name - GETMESSAGE test") не правильно, правильно - $hwnd = wndfind("GETMESSAGE test")

С этим у меня все правильно ))


АААА  :D так у тебя окно кликера переименовано, ктож знал...


твой скрин:
(https://i.imgur.com/vQe6Y3R.png)
Title: Re: SENDMESSAGE
Post by: Oraven on June 24, 2019, 07:29:37 AM
Code: (clickermann) [Select]
$_hwnd = wndfind("Name - GETMESSAGE test")      // дискриптор окна клиента
$_hwnd это системная переменная, не нужно нужно пытаться записывать в нее что либо!
Title: Re: SENDMESSAGE
Post by: Hito on June 24, 2019, 10:03:37 AM
Ребят, спасибо большое за ответы! Буду разбираться потихоньку )) До меня все новое долго доходит...))
Title: Re: SENDMESSAGE
Post by: Vint on June 24, 2019, 10:38:25 AM
$_hwnd это системная переменная, не нужно нужно пытаться записывать в нее что либо!
Точно шеф. Всех запутав написав на основе старого кода и имена оттуда переползли. Вот такая оказия.
Но, т.к. я привязкой не пользуюсь, то моё переназначение ничего не ломало.
Поправлю ка в скрипте выше, чтоб не сбивал с толку.
Title: Re: SENDMESSAGE
Post by: Vint on June 24, 2019, 10:45:56 AM
Странно... А почему я в этом диапазоне могу передавать параметры от кликера своему приложению...? В смысле - у меня получается передать их из кликера и принять в приложении.
Ограничений нет. Это просто соглашение, что вот тот диапазон для внутреннего использования, а тот для межпрограммного.
Когда обе программы твои, то никакой проблемы не возникнет, а вот если, допустим, принимающая написана не тобой, она может использовать часть кодов для внутреннего обмен командами. Если не придерживаться можно создать конфликт, ты ведь не знаешь код внутри и что он использует.
Для этого и принято разделение, чтоб не сломать внутрянку чужой программы.
Title: Re: SENDMESSAGE
Post by: Hito on June 24, 2019, 12:49:04 PM
Вопрос возник, ребят. Не понятен параметр один.
Code: (clickermann) [Select]
IF($isnew != 0)
Путем проб, я вычислил, что если сообщений не поступает, то $isnew = 0, а если сообщение поступило, то $isnew = 1. На сколько я понимаю, условие "!=" = "не равно или равно", но тогда оно должно срабатывать, и тогда, когда сообщений нет, и тогда, когда они есть...
У меня вот нормально работает:
Code: (clickermann) [Select]
IF($isnew ! 0)
Что я не правильно понял?

Title: Re: SENDMESSAGE
Post by: Vint on June 24, 2019, 01:33:04 PM
! и !=  это синонимы. Означают "не равно".

"!=" ведено в последних версиях для тех кто привык к другим языкам, в большинстве их "не равно " обозначается так.
Если версия кликера старее, то такое условие не сработает.


Ты в этом своём сообщении
http://crapware.aidf.org/forum/index.php?topic=4720.msg32297#msg32297
условие перепутал местами. Или знак должен быть "равно" или действия наоборот.
Title: Re: SENDMESSAGE
Post by: Hito on June 29, 2019, 07:06:24 AM
Отпадает по ходу у меня вся эта тема... Все получается, но проблема в том, что в скрипте кликера отлов входящих сообщений естественно крутится в цикле потока, у которого естественно есть задержка хотя бы в 50мс (для разгрузки процессора), но за эти 50мс может прийти, скажем - три сообщения, и скрипт естественно поймает одно (последнее), а два первых улетят в пустоту.
Title: Re: SENDMESSAGE
Post by: Космич on June 29, 2019, 08:26:27 AM
допиши двунаправленную свзяь для синхронизации и проблемы не будет
Title: Re: SENDMESSAGE
Post by: Vint on June 29, 2019, 12:44:56 PM
По идее пропускать не должно. Ты же используешь POSTMESSAGE? Не SENDMESSAGE?
При пост, винда организует очередь сообщений для приложения.
Покажи тесты где теряются сообщения.
Title: Re: SENDMESSAGE
Post by: Hito on July 01, 2019, 11:42:58 AM
Покажи тесты где теряются сообщения.

Сорри - я не тестировал. Просто в delphi, например, я создаю процедуру, которая срабатывает при каждом получении сообщения, а в кликере получение сообщений у нас крутится в цикле, у которого конечно есть пауза. Вот я как бы логически и предположил...
Title: Re: SENDMESSAGE
Post by: Vint on July 01, 2019, 01:18:19 PM
в скрипте кликера отлов входящих сообщений естественно крутится в цикле потока, у которого естественно есть задержка хотя бы в 50мс (для разгрузки процессора), но за эти 50мс может прийти, скажем - три сообщения, и скрипт естественно поймает одно (последнее), а два первых улетят в пустоту.
Ну поставь 10 мс. И напиши двунаправленную и правда. Сделай в lParam? например, hwnd передающего окна. При приёме отправляй ответ-подтверждение.
В передающем после каждой команды отправки жди подтверждения, если нет в течении N мс отправляй повторно.

Ты так и не сказал нужно передавать текст или нет. Может достаточно команд.
Title: Re: SENDMESSAGE
Post by: Hito on July 01, 2019, 02:01:38 PM
Ты так и не сказал нужно передавать текст или нет. Может достаточно команд.
Команд не достаточно. Дело в том, что в одной команде может быть несколько параметров, таких, как например - 1: номер мира в игре, для которого предназначается команда. 2: номер канала в выбранном мире, для которого предназначается команда. 3: номер группы, в которой находится персонаж, находящийся в выбранном мире и на выбранном канале. 4: класс персонажа в выбранной группе. Например, в ини у меня скрипт ориентируется так:
Code: (clickermann) [Select]
INIREAD(STRCONCAT("ini\",$mir,"\",$group,"\",$class,".ini"), "canal", "1")Если передавать только числа, то нужно в них какой-то делитель мутить, чтоб принимая сообщение, скрипт мог бы разбивать строку по этому делителю и тогда уже работать с подстроками. Но вся проблема в том, что числа ничем не разбить - в сообщении числовом не может быть отправлено ничего, кроме цифр...
Title: Re: SENDMESSAGE
Post by: dramster on July 01, 2019, 03:48:00 PM

Команд не достаточно. Дело в том, что в одной команде может быть несколько параметров, таких, как например - 1: номер мира в игре, для которого предназначается команда. 2: номер канала в выбранном мире, для которого предназначается команда. 3: номер группы, в которой находится персонаж, находящийся в выбранном мире и на выбранном канале. 4: класс персонажа в выбранной группе.
Сколько всего миров в игре? Максимальный номер канала? Количество групп? Класс персонажа это число? Какое максимальное?
Дело в том, что если эти значения не большие, то их всех можно всунуть в один параметр, разделив его на нужное для каждого значения количество бит. Если в один параметр не влезут, то есть второй.  При приеме сообщение снова разделяешь на начальные значения.
Title: Re: SENDMESSAGE
Post by: dramster on July 01, 2019, 04:46:32 PM
Вот набросал обьединение четырех параметров в один, где максимальное значение каждого из начальных параметров не больше 255, по одному байту. И последующее разделение на начальные параметры.

Code: (clickermann) [Select]
$mir = 32
$channel = 175
$group = 98
$class = 233


// соединяем
$parameter = $mir + $channel*256 + $group*65536 + $class*16777216

print("объединенный параметр = ", $parameter) //  3915558688


////////////////////////////////////////////////////////////////////////////////


//разбиваем
$re_class = int($parameter/16777216)
$re_group = int(($parameter-$re_class*16777216)/65536)
$re_channel = int(($parameter-$re_class*16777216-$re_group*65536)/256)
$re_mir =  $parameter - $re_channel*256 - $re_group*65536 - $re_class*16777216

print(" ")
print("разбитый параметр:")
print("mir=", $re_mir," channel=", $re_channel, " group=", $re_group, " class=", $re_class)
halt


Лог:
Code: (лог) [Select]
16:47:35 объединенный параметр = 3915558688
16:47:35 
16:47:35 разбитый параметр:
16:47:35 mir=32 channel=175 group=98 class=233
Title: Re: SENDMESSAGE
Post by: Vint on July 01, 2019, 04:49:01 PM
Вот, вот. Всё пытаюсь к этому подвести. Запаковать биты и отправить одним параметром это совсем не то, что передавать текст как серию параметров, да потом ещё и текст расшифровывать.

Но не исключаю и необходимость текстовой информации.
Если общаются две программы, то достаточно задержки. Если действительно приёмник один, а передатчиков несколько, они могут посылать в одно время.
Как выяснилось GETMESSAGE в кликере работает по очень простой схеме и переход с POSTMESSAGE на SENDMESSAGE ничего не даёт (может даст в одностороннем порядке на сервере, как там делфи будет обрабатывать). Или SENDMESSAGE  не ждёт. Короче кликер с кликером ничего не ждёт.

Вот с подтверждением получилось так
Приёмник
Code: (clickermann) [Select]
#name "SENDMESSAGE-GETMESSAGE_Receiver"
// Author: Vint
// Version: 0.1 (01.07.2019)
// Скрипт для Clickermann v4.13.14

LOGCLEAR

$WM_tr = 2000  // код сообщения у передатчиков


WHILE(1)
    define($str, "")
    GETMESSAGE($wp, $lp, $isnew)
   
    IF($isnew != 0)
        // отправляем подтверждение
        POSTMESSAGE($lp, 2000, 1, $lp)
       
        IF($wp ! 0)
            $str = strconcat($str, char($wp))
            LOGWRITE("сообщение  ", char($wp),  "  wParam:", $wp, "  от ", $lp)
        ELSE
            $event = $str
            $str = ""
            // здесь обрабатываем наше сообщение
            LOGWRITE("Принята строка: ", $event, "  от программы ", $lp)
        END_IF
    END_IF
    WAITMS(5)
END_CYC

HALT

Передатчик
Code: (clickermann) [Select]
#name "SENDMESSAGE-GETMESSAGE_Receiver Transmitter"
// Author: Vint
// Version: 0.1 (01.07.2019)
// Скрипт для Clickermann v4.13.14

#define @CRLF:STRCONCAT(char(13),char(10))

LOGCLEAR
print("Передатчик", @CRLF)

$WM_re = 1024  // код сообщения у приёмника
$hwnd_re = wndfind("SENDMESSAGE-GETMESSAGE_Receiver")

SUB(wait_confirmation, $cwp)
    $confirmation = 0
    $time_conf = $_ms + 300
    WHILE($confirmation = 0)
        GETMESSAGE($wp, $lp, $isnew)
        IF(($isnew ! 0) & ($lp = $_hwnd_self))
            $confirmation = 1
            //print("-------------------------подтверждено")
        END_IF
       
        IF(($time_conf < $_ms) & ($confirmation = 0))
            // отправляем запрос повторно
            SENDMESSAGE($hwnd_re, $WM_re, $cwp, $_hwnd_self)
            $time_conf = $_ms + 300
            //print("ПОВТОРНО ", $cwp)
        END_IF
        WAITMS(3)
    END_CYC
END_SUB

SUB(Send_message, $t)
    $len = STRLEN($t) + 1
    FOR($i=1, $i < $len)
        $chr = STRCUT($t, $i, 1)
        $cod = code($chr)
        print("передаём  ", $chr, "    -  ", $cod)
        SENDMESSAGE($hwnd_re, $WM_re, $cod, $_hwnd_self)
        WAITMS(3)       
        wait_confirmation($cod)
    END_CYC
   
    SENDMESSAGE($hwnd_re, $WM_re, 0, $_hwnd_self)  // wParam = 0 строка окончена
    wait_confirmation(0)
    print("--- Передали! ---", $t)
END_SUB

IF($hwnd_re ! 0)   
    Send_message("Очень важный текст")
   
    print("")
    //WAITMS(1000)
   
    Send_message("Второй текст")
END_IF


HALT