Проблемы при привязке? Пропадает картинка окна; не работают нажатия кнопок; постоянное переключение между окнами, если требуется работа с несколькими?
Есть решение!!!
//alternative windowed mode v1.1
//-----------------------------------------------------------
//A_LCLICK
SUB(A_LCLICK, $A_x, $A_y, $A_hwnd)
postmessage($A_hwnd,0x0201,0x0001,$A_x+($A_y*65536))
waitms($A_press_delay)
postmessage($A_hwnd,0x0202,0x0001,$A_x+($A_y*65536))
END_SUB
//-----------------------------------------------------------
//A_LDOWN
SUB(A_LDOWN, $A_x, $A_y, $A_hwnd)
postmessage($A_hwnd,0x0201,0x0001,$A_x+($A_y*65536))
END_SUB
//-----------------------------------------------------------
//A_LUP
SUB(A_LUP, $A_x, $A_y, $A_hwnd)
postmessage($A_hwnd,0x0202,0x0001,$A_x+($A_y*65536))
END_SUB
//-----------------------------------------------------------
//A_DBLCLICK
SUB(A_DBLCLICK, $A_x, $A_y, $A_hwnd)
postmessage($A_hwnd,0x0203,0x0001,$A_x+($A_y*65536))
END_SUB
//-----------------------------------------------------------
// A_RCLICK
SUB(A_RCLICK, $A_x, $A_y, $A_hwnd)
postmessage($A_hwnd,0x0204,0x0002,$A_x+($A_y*65536))
waitms($A_press_delay)
postmessage($A_hwnd,0x0205,0x0002,$A_x+($A_y*65536))
END_SUB
//-----------------------------------------------------------
//A_RDOWN
SUB(A_RDOWN, $A_x, $A_y, $A_hwnd)
postmessage($A_hwnd,0x0204,0x0002,$A_x+($A_y*65536))
END_SUB
//-----------------------------------------------------------
//A_RUP
SUB(A_RUP, $A_x, $A_y, $A_hwnd)
postmessage($A_hwnd,0x0205,0x0002,$A_x+($A_y*65536))
END_SUB
//-----------------------------------------------------------
// A_MCLICK
SUB(A_MCLICK, $A_x, $A_y, $A_hwnd)
postmessage($A_hwnd,0x0207,0x0010,$A_x+($A_y*65536))
waitms($A_press_delay)
postmessage($A_hwnd,0x0208,0x0010,$A_x+($A_y*65536))
END_SUB
//-----------------------------------------------------------
//A_MDOWN
SUB(A_MDOWN, $A_x, $A_y, $A_hwnd)
postmessage($A_hwnd,0x0207,0x0010,$A_x+($A_y*65536))
END_SUB
//-----------------------------------------------------------
//A_MUP
SUB(A_MUP, $A_x, $A_y, $A_hwnd)
postmessage($A_hwnd,0x0208,0x0010,$A_x+($A_y*65536))
END_SUB
//-----------------------------------------------------------
//A_MOVE
SUB(A_MOVE, $A_x, $A_y, $A_hwnd)
postmessage($A_hwnd,0x0200,0,$A_x+($A_y*65536))
END_SUB
//-----------------------------------------------------------
//A_KEYPRESS
SUB(A_KEYPRESS, $A_key, $A_hwnd)
postmessage($A_hwnd,0x0100,$A_key,0)
waitms($A_press_delay)
postmessage($A_hwnd,0x0101,$A_key,0)
END_SUB
//-----------------------------------------------------------
//A_KEYDOWN
SUB(A_KEYDOWN, $A_key, $A_hwnd)
postmessage($A_hwnd,0x0100,$A_key,0)
END_SUB
//-----------------------------------------------------------
//A_KEYUP
SUB(A_KEYUP, $A_key, $A_hwnd)
postmessage($A_hwnd,0x0101,$A_key,0)
END_SUB
//-----------------------------------------------------------
//A_GETSCREEN
SUB(A_GETSCREEN, $A_x1, $A_y1, $A_x2, $A_y2, $A_hwnd)
WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
IF($A_x1+$A_y1+$A_x2+$A_y2 = 0)
$A_x2 = $A_width
$A_y2 = $A_height
END_IF
GETSCREEN($A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2)
END_SUB
//-----------------------------------------------------------
//A_SCREENSHOTEX
SUB(A_SCREENSHOTEX, $A_x1, $A_y1, $A_x2, $A_y2, $A_pref, $A_format, $A_hwnd)
WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
IF(($A_x1+$A_y1+$A_x2+$A_y2) = 0)
$A_x2 = $A_width
$A_y2 = $A_height
END_IF
SCREENSHOTEX($A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2,$A_pref,$A_format)
END_SUB
//-----------------------------------------------------------
//A_PXL
SUB(A_PXL, $A_x, $A_y, $A_hwnd)
WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
$A_return1 = PXL($A_x0+$A_x, $A_y0+$A_y)
END_SUB
//-----------------------------------------------------------
//A_PXLCOUNT
SUB(A_PXLCOUNT, $A_x1, $A_y1, $A_x2, $A_y2, $A_color, $A_hwnd)
WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
$A_return1 = PXLCOUNT ($A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2, $A_color)
END_SUB
//-----------------------------------------------------------
//A_PXLXOR
SUB(A_PXLXOR, $A_x1, $A_y1, $A_x2, $A_y2, $A_hwnd)
WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
$A_return1 = PXLXOR($A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2)
END_SUB
//-----------------------------------------------------------
//A_PXLCRC
SUB(A_PXLCRC, $A_x1, $A_y1, $A_x2, $A_y2, $A_hwnd)
WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
$A_return1 = PXLCRC($A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2)
END_SUB
//-----------------------------------------------------------
//A_IFPIXELIN
SUB(A_IFPIXELIN, $A_x1, $A_y1, $A_x2, $A_y2, $A_color, $A_hwnd)
WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
IF_PIXEL_IN($A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2, $A_color)
$A_return1 = $_return1-$A_x0
$A_return2 = $_return2-$A_y0
else
$A_return1 = 0
$A_return2 = 0
END_IF
END_SUB
//-----------------------------------------------------------
//A_IFPICTUREIN
SUB(A_IFPICTUREIN, $A_x1, $A_y1, $A_x2, $A_y2, $A_file, $A_bgcolor, $A_currency, $A_hwnd)
WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
IF_PICTURE_IN($A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2, $A_file, $A_bgcolor, $A_currency)
$A_return1 = $_return1-$A_x0
$A_return2 = $_return2-$A_y0
else
$A_return1 = 0
$A_return2 = 0
END_IF
END_SUB
//-----------------------------------------------------------
//A_SCANPICTURE
SUB(A_SCANPICTURE, $A_x1, $A_y1, $A_x2, $A_y2, $A_file, $A_bgcolor, $A_currency, $A_hwnd)
WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
SCANPICTURE($A_var,$A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2,$A_file,$A_bgcolor,$A_currency)
FOR($i=0, $i < ARRSIZE($A_var),2)
$A_var[$i] = $A_var[$i]-$A_x0
$A_var[$i+1] = $A_var[$i+1]-$A_y0
END_CYC
END_SUB
//-----------------------------------------------------------
//A_SCANPXL
SUB(A_SCANPXL, $A_x1, $A_y1, $A_x2, $A_y2, $A_color, $A_hwnd)
WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
SCANPXL($A_var,$A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2,$A_color)
FOR($i=0, $i < ARRSIZE($A_var),2)
$A_var[$i] = $A_var[$i]-$A_x0
$A_var[$i+1] = $A_var[$i+1]-$A_y0
END_CYC
END_SUB
//-----------------------------------------------------------
//A_COLORMODE
SUB(A_COLORMODE, $A_mode, $A_x1, $A_y1, $A_x2, $A_y2, $A_hwnd)
WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
IF(($A_x1+$A_y1+$A_x2+$A_y2) = 0)
$A_x2 = $A_width
$A_y2 = $A_height
END_IF
COLORMODE ($A_mode, $A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2)
END_SUB
//-----------------------------------------------------------
//A_CHECK_PXL
SUB(A_CHECK_PXL,$A_hwnd)
WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
GETSCREEN
print("(",$_xmouse-$A_x0,",",$_ymouse-$A_y0,") // ",PXL($_xmouse,$_ymouse))
END_SUB
//-----------------------------------------------------------
//A_KEYSTRING
SUB(A_KEYSTRING, $A_str, $A_delay, $A_hwnd)
$A_kbl=GETKBLAYOUT($A_hwnd)
IF($A_kbl ! 1049)
setkblayout($A_hwnd, 1049)
END_IF
FOR($A_nstr=1,$A_nstr<STRLEN ($A_str)+1)
$A_l=STRCUT ($A_str, $A_nstr, 1)
IF(ARRSIZE ($A_keys_arr) = 0)
TFREADARR ("keys.txt", $A_keys_arr)
END_IF
FOR($A_a=1,$A_a<ARRSIZE ($A_keys_arr),2)
IF($A_keys_arr[$A_a] = $A_l)
$A_key = $A_keys_arr[$A_a-1]
IF($A_key = 46)
IF(STRMD5($A_l) ! "5058F1AF8388633F609CADB75A75DC9D")
$A_key = 48
END_IF
END_IF
IF((($A_key > 64)&($A_key < 91))|(($A_key > 185)&($A_key < 223)))
$A_mess = 0x0100
else
$A_mess = 0x0102
END_IF
IF($A_key > 0)
postmessage($A_hwnd,$A_mess,$A_key,0)
waitms($A_delay)
END_IF
$A_a=999
END_IF
END_CYC
END_CYC
IF($A_kbl!GETKBLAYOUT($A_hwnd))
setkblayout($A_hwnd, $A_kbl)
END_IF
END_SUB
//-----------------------------------------------------------
$A_press_delay = 30
Альтернативные команды для работы с окнами:
A_LDOWN (x, y, hwnd)
A_LUP (x, y, hwnd)
A_LCLICK (x, y, hwnd)
A_RDOWN (x, y, hwnd)
A_RUP (x, y, hwnd)
A_RCLICK (x, y, hwnd)
A_MDOWN (x, y, hwnd)
A_MUP (x, y, hwnd)
A_MCLICK (x, y, hwnd)
A_MOVE(x, y, hwnd)
A_KEYPRESS(keycode, hwnd)
A_KEYDOWN (keycode, hwnd)
A_KEYUP (keycode, hwnd)
Всё как со стандартными командами, только добавлен параметр hwnd окна. Команды нажатий и кликов отправляются окну напрямую, не мешая основной работе на ПК (как при привязке). Отсчет координат также как при привязке, начиная с левого верхнего угла окна.
Анализ экрана:
A_GETSCREEN(x1, y1, x2, y2, hwnd)
A_SCREENSHOTEX(x1, y1, x2, y2, pref, format, hwnd)
Все параметры вводить
обязательно Если неохота вводить координаты области, пишем (0,0,0,0), и снимок сделается целого окна.
A_PXL(x, y, hwnd)
A_PXLCOUNT(x1, y1, x2, y2, color, hwnd)
A_PXLXOR(x1, y1, x2, y2, hwnd)
A_PXLCRC(x1, y1, x2, y2, hwnd)
Возвращают значение в переменную $A_return1.
A_IFPIXELIN(x1, y1, x2, y2, color, hwnd)
A_IFPICTUREIN(x1, y1, x2, y2, file, bgcolor, currency, hwnd)
Это уже не условия, это функции возвращающие параметры $A_return1 и $A_return2. Если ничего не найдено, они возвращают "0".
A_SCANPICTURE(x1, y1, x2, y2, file, bgcolor, currency, hwnd)
A_SCANPXL(x1, y1, x2, y2, color, hwnd)
Возвращают массив $A_var .
A_COLORMODE(mode, x1, y1, x2, y2, hwnd)
Все параметры вводить
обязательно, во всех командах, иначе "ошибка".
Не забываем, что все координаты вводить относительно верхнего левого угла окна.
Горячие клавиши alt+q в данном случае не помогут. Поможет команда A_CHECK_PXL(hwnd), которая запишет в лог нужные нам координаты и цвет пикселя под курсором.
Есть небольшой "косячек", который также присутствует при стандартной привязке. Это небольшая разница в 20-25 пикселей по иси Y между возвращенными координатами при поиске пикселя или картинки, и кликом по возвращенным координатам. Это высота строки заголовка.
Пример:
#include "alt_winmode.cms"
$hwnd1 = WNDFIND ("Заголовок первого окна")
$hwnd2 = WNDFIND ("Заголовок второго окна")
A_MOVE(10,10, $hwnd1)
wait(1)
A_GETSCREEN(0,0,0,0,$hwnd1)
A_IFPIXELIN(400,700,500,800, 11465971, $hwnd1)
IF($A_return1>0)
A_MOVE($A_return1,$A_return2-20, $hwnd1)
waitms(50)
A_LCLICK($A_return1,$A_return2-20, $hwnd1)
waitms(50)
END_IF
THREAD(win_2)
#include "alt_winmode.cms"
A_LDOWN (155, 170, $hwnd2)
waitms(50)
A_MOVE(231, 170, $hwnd2)
waitms(50)
A_LUP(231, 170, $hwnd2)
wait(5)
A_KEYPRESS(#enter, $hwnd2)
waitms(50)
END_THREAD
Помним, в данном случае при работе с изображениями, нельзя чтобы окно было закрыто другим окном. Мало места на рабочем столе? Решается это просто.
Включаем в настройках видеокарты дополнительный монитор и перетаскиваем наши окна на рабочий стол дополнительного монитора. Мы их не видим и они нам не мешают, а кликерманн видит и делает свое дело.
Как включить доп. монитор при его отсутствии? пример для вин7. Теперь без проблем можно ботить в нескольких окнах одновременно, и одноременно заниматься на ПК своими делами
Все функции не тестил, возможны ошибки. Если что не так, пишите, исправлю.
Обновление:
Добавлены команды:
A_DBLCLICK (x, y, hwnd)
A_KEYSTRING ("str", delay, hwnd) // "str" - строка, delay - задержка между нажатиями клавиш в мс.
A_KEYSTRING может печатать как на русск. так и на англ. одновременно. Для работы требуется список кодов кнопок (во вложении).
Выведена в переменную и уменьшена задержка для в keypress, LRMclick ($A_press_delay). Как оказалось, 50мс это многовато.
Обновленный A_KEYSTRING, только для CM v4.13
Написал новую подпрограмму A_KEYSTRING. старая показалась мне уж слишком замудреной и корявой. в новой версии символы отправляются окну только лишь посредством WM_CHAR. странно, но эта возможность появиласть лишь в версии v.4.13 b3 (имеется в виду русск. буквы). в старших версиях работать не будет. исключил сравнение самих символов, что приводило к некоторым проблемам со всякими там "0", "." и другими символами. в новой версии сравнивается md5 хеш каждого символа со списком ранее записанных в файл. по сути в этот файл можно всунуть всё что угодно, [spoiler="типа этого"]
❤☺☼☭☮⑯⑰㒇㒈㒉रऱलळ и кучи различных языков. все они в postmessage(hwnd,0x0102,[от 33 до~],0) [/spoiler]
//A_KEYSTRING для clickermann v.4.13 b3
SUB(A_KEYSTRING, $A_str, $A_delay, $A_hwnd)
FOR($A_nstr=1,$A_nstr<STRLEN ($A_str)+1)
$A_md5 = strmd5(strcut2($A_str, $A_nstr, $A_nstr ))
FOR($A_ntxt=1,$A_ntxt<TFCOUNT ("keys_v4.13.txt")+1)
IF(STRPOS (TFREAD ("keys_v4.13.txt",$A_ntxt),$A_md5) > 0)
postmessage($A_hwnd,0x0102,int(STRCUT (TFREAD("keys_v4.13.txt",$A_ntxt),1,STRPOS(TFREAD ("keys_v4.13.txt",$A_ntxt)," "))),0)
$A_ntxt=TFCOUNT ("keys_v4.13.txt")+1
waitms($A_delay)
END_IF
END_CYC
END_CYC
END_SUB
//-----------------------------------------------------------
//пример:
//нужную строку обязательно записываенм в начале в переменную
$text = "English, Русский...! # $ % & ' ( * + , - . / 14890 : ; < = > ? @ [ \ ] ^ _ ` { | } ~ ¤ ¦ § © « ¬ ® ° ± µ ¶ · » "
//и только после этого вызов подпрограммы.
A_KEYSTRING ($text,100,197534)
HALT
[spoiler="пример в картинке"]
[/spoiler]
единственное, что с кавычками так ничего и не удалось сделать