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
Куда передавать то?Ну, как бы два варианта хотелось бы понять. 1 - передача в другую программу (приоритетный вопрос). Правда потом наверно придется рыть инет в поиске ответов на вопрос - как ПРИНЯТЬ текст... 2 - передача из кликера в кликер.
Вот если кликер должен какие-то донные принимать или отдавать, тогда да, есть смысл.Под данными ты имеешь в виду файлы? Я на это уже не замахиваюсь... Но... Кликер может сделать скрин и отправить команду клиенту, чтобы ТОТ отправил этот скрин серверу. Но это уже другая песня и она более осуществима. А вот насчет передачи кодов можно поподробнее...? К примеру, мне нужно передать от кликера клиенту - 1. Это как будет выглядеть?
будет выглядеть как POSTMESSAGE... :D
POSTMESSAGE
HALT
hwnd | hwnd твоего клиента (можно искать по названию или другим способом, это как всегда). |
message | код сообщения на отдельных кодах будут висеть разные действия. |
wParam, lParam | передаваемые параметры. Твои два 32 битных числа (в 32 битной винде) которые ты можешь передать. |
POSTMESSAGE($_hwnd , 0xD001, 3, 0) // запущена машина №3
POSTMESSAGE($_hwnd , 0xD002, 2, $_time_t) // остановлена машина №2, время текущее
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
#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
#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
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
Вряд ли такие команды есть в WinAPI.По первому я так и подозревал, что таких команд нет. Перерыл весь мелко-мягкий сайт - и MSDN, и API, и UWP, нигде не нашел.
Первое - это стили окна, они задаются при создании. Часть стилей можно заменить и позже. Но мне кажется это не API, а через вызов библиотеки GUI
Второе это обработчик событий. Может и есть команды, но я не знаю.
#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
Принимающий:#name "GETMESSAGE test"
GETMESSAGE($wp, $lp, $isnew)
IF($isnew != 0)
LOGWRITE($str)
else
$str = strconcat($str, char($lp))
END_IF
WAITMS(50)
В итоге принимающий молчит...$WM_text = 53251 // выбрали код для сообщения
и замена в конфиге "msg_hook = 1024" на "msg_hook = 53251" не помогает.
IF($wp+$lp = 0)
halt
END_IF
#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)
Диапазон кодов для использования локально (в одном приложении) хотя работать всё будет, но не всегда:
;~ Локальные сообщения от 0x0400 (1024) до 0x7FFF (32767)
1. $_hwnd = wndfind("Name - GETMESSAGE test") не правильно, правильно - $_hwnd = wndfind("GETMESSAGE test")
1. $hwnd = wndfind("Name - GETMESSAGE test") не правильно, правильно - $hwnd = wndfind("GETMESSAGE test")
С этим у меня все правильно ))
$_hwnd = wndfind("Name - GETMESSAGE test") // дискриптор окна клиента
$_hwnd это системная переменная, не нужно нужно пытаться записывать в нее что либо!Точно шеф. Всех запутав написав на основе старого кода и имена оттуда переползли. Вот такая оказия.
Странно... А почему я в этом диапазоне могу передавать параметры от кликера своему приложению...? В смысле - у меня получается передать их из кликера и принять в приложении.Ограничений нет. Это просто соглашение, что вот тот диапазон для внутреннего использования, а тот для межпрограммного.
IF($isnew != 0)
IF($isnew ! 0)
Покажи тесты где теряются сообщения.
в скрипте кликера отлов входящих сообщений естественно крутится в цикле потока, у которого естественно есть задержка хотя бы в 50мс (для разгрузки процессора), но за эти 50мс может прийти, скажем - три сообщения, и скрипт естественно поймает одно (последнее), а два первых улетят в пустоту.Ну поставь 10 мс. И напиши двунаправленную и правда. Сделай в lParam? например, hwnd передающего окна. При приёме отправляй ответ-подтверждение.
Ты так и не сказал нужно передавать текст или нет. Может достаточно команд.Команд не достаточно. Дело в том, что в одной команде может быть несколько параметров, таких, как например - 1: номер мира в игре, для которого предназначается команда. 2: номер канала в выбранном мире, для которого предназначается команда. 3: номер группы, в которой находится персонаж, находящийся в выбранном мире и на выбранном канале. 4: класс персонажа в выбранной группе. Например, в ини у меня скрипт ориентируется так:
INIREAD(STRCONCAT("ini\",$mir,"\",$group,"\",$class,".ini"), "canal", "1")
Если передавать только числа, то нужно в них какой-то делитель мутить, чтоб принимая сообщение, скрипт мог бы разбивать строку по этому делителю и тогда уже работать с подстроками. Но вся проблема в том, что числа ничем не разбить - в сообщении числовом не может быть отправлено ничего, кроме цифр...
Сколько всего миров в игре? Максимальный номер канала? Количество групп? Класс персонажа это число? Какое максимальное?
Команд не достаточно. Дело в том, что в одной команде может быть несколько параметров, таких, как например - 1: номер мира в игре, для которого предназначается команда. 2: номер канала в выбранном мире, для которого предназначается команда. 3: номер группы, в которой находится персонаж, находящийся в выбранном мире и на выбранном канале. 4: класс персонажа в выбранной группе.
$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
16:47:35 объединенный параметр = 3915558688
16:47:35
16:47:35 разбитый параметр:
16:47:35 mir=32 channel=175 group=98 class=233
#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
#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