Автор Тема: Альтернатива привязке - работа с несколькими окнами, решение черного окна, и тп.  (Прочитано 27871 раз)

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

dramster

  • Герой форума
  • *****
  • Сообщений: 1130
    • Просмотр профиля
  Проблемы при привязке? Пропадает картинка окна; не работают нажатия кнопок;  постоянное переключение между окнами, если требуется работа с несколькими?
  Есть решение!!!
Код: Clickermann
  1. //alternative windowed mode v1.1
  2.  
  3. //-----------------------------------------------------------
  4. //A_LCLICK
  5. SUB(A_LCLICK, $A_x, $A_y, $A_hwnd)
  6.   postmessage($A_hwnd,0x0201,0x0001,$A_x+($A_y*65536))
  7.   waitms($A_press_delay)
  8.   postmessage($A_hwnd,0x0202,0x0001,$A_x+($A_y*65536))
  9. END_SUB
  10. //-----------------------------------------------------------
  11. //A_LDOWN
  12. SUB(A_LDOWN, $A_x, $A_y, $A_hwnd)
  13.   postmessage($A_hwnd,0x0201,0x0001,$A_x+($A_y*65536))
  14. END_SUB
  15. //-----------------------------------------------------------
  16. //A_LUP
  17. SUB(A_LUP, $A_x, $A_y, $A_hwnd)
  18.   postmessage($A_hwnd,0x0202,0x0001,$A_x+($A_y*65536))
  19. END_SUB
  20. //-----------------------------------------------------------
  21. //A_DBLCLICK
  22. SUB(A_DBLCLICK, $A_x, $A_y, $A_hwnd)
  23.   postmessage($A_hwnd,0x0203,0x0001,$A_x+($A_y*65536))
  24. END_SUB
  25. //-----------------------------------------------------------
  26. // A_RCLICK
  27. SUB(A_RCLICK, $A_x, $A_y, $A_hwnd)
  28.   postmessage($A_hwnd,0x0204,0x0002,$A_x+($A_y*65536))
  29.   waitms($A_press_delay)
  30.   postmessage($A_hwnd,0x0205,0x0002,$A_x+($A_y*65536))
  31. END_SUB
  32. //-----------------------------------------------------------
  33. //A_RDOWN
  34. SUB(A_RDOWN, $A_x, $A_y, $A_hwnd)
  35.   postmessage($A_hwnd,0x0204,0x0002,$A_x+($A_y*65536))
  36. END_SUB
  37. //-----------------------------------------------------------
  38. //A_RUP
  39. SUB(A_RUP, $A_x, $A_y, $A_hwnd)
  40.   postmessage($A_hwnd,0x0205,0x0002,$A_x+($A_y*65536))
  41. END_SUB
  42. //-----------------------------------------------------------
  43. // A_MCLICK
  44. SUB(A_MCLICK, $A_x, $A_y, $A_hwnd)
  45.   postmessage($A_hwnd,0x0207,0x0010,$A_x+($A_y*65536))
  46.   waitms($A_press_delay)
  47.   postmessage($A_hwnd,0x0208,0x0010,$A_x+($A_y*65536))
  48. END_SUB
  49. //-----------------------------------------------------------
  50. //A_MDOWN
  51. SUB(A_MDOWN, $A_x, $A_y, $A_hwnd)
  52.   postmessage($A_hwnd,0x0207,0x0010,$A_x+($A_y*65536))
  53. END_SUB
  54. //-----------------------------------------------------------
  55. //A_MUP
  56. SUB(A_MUP, $A_x, $A_y, $A_hwnd)
  57.   postmessage($A_hwnd,0x0208,0x0010,$A_x+($A_y*65536))
  58. END_SUB
  59. //-----------------------------------------------------------
  60. //A_MOVE
  61. SUB(A_MOVE, $A_x, $A_y, $A_hwnd)
  62.   postmessage($A_hwnd,0x0200,0,$A_x+($A_y*65536))
  63. END_SUB
  64. //-----------------------------------------------------------
  65. //A_KEYPRESS
  66. SUB(A_KEYPRESS, $A_key, $A_hwnd)
  67.   postmessage($A_hwnd,0x0100,$A_key,0)
  68.   waitms($A_press_delay)
  69.   postmessage($A_hwnd,0x0101,$A_key,0)
  70. END_SUB
  71. //-----------------------------------------------------------
  72. //A_KEYDOWN
  73. SUB(A_KEYDOWN, $A_key, $A_hwnd)
  74.   postmessage($A_hwnd,0x0100,$A_key,0)
  75. END_SUB
  76. //-----------------------------------------------------------
  77. //A_KEYUP
  78. SUB(A_KEYUP, $A_key, $A_hwnd)
  79.   postmessage($A_hwnd,0x0101,$A_key,0)
  80. END_SUB
  81. //-----------------------------------------------------------
  82. //A_GETSCREEN
  83. SUB(A_GETSCREEN, $A_x1, $A_y1, $A_x2, $A_y2, $A_hwnd)
  84.   WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
  85.   IF($A_x1+$A_y1+$A_x2+$A_y2 = 0)
  86.      $A_x2 = $A_width
  87.      $A_y2 = $A_height
  88.   END_IF
  89.   GETSCREEN($A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2)
  90. END_SUB
  91. //-----------------------------------------------------------
  92. //A_SCREENSHOTEX
  93. SUB(A_SCREENSHOTEX, $A_x1, $A_y1, $A_x2, $A_y2, $A_pref, $A_format, $A_hwnd)
  94.   WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
  95.   IF(($A_x1+$A_y1+$A_x2+$A_y2) = 0)
  96.      $A_x2 = $A_width
  97.      $A_y2 = $A_height
  98.   END_IF
  99.   SCREENSHOTEX($A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2,$A_pref,$A_format)
  100. END_SUB
  101. //-----------------------------------------------------------
  102. //A_PXL
  103. SUB(A_PXL, $A_x, $A_y, $A_hwnd)
  104.   WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
  105.   $A_return1 = PXL($A_x0+$A_x, $A_y0+$A_y)
  106. END_SUB
  107. //-----------------------------------------------------------
  108. //A_PXLCOUNT
  109. SUB(A_PXLCOUNT, $A_x1, $A_y1, $A_x2, $A_y2, $A_color, $A_hwnd)
  110.   WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
  111.   $A_return1 = PXLCOUNT ($A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2, $A_color)
  112. END_SUB
  113. //-----------------------------------------------------------
  114. //A_PXLXOR
  115. SUB(A_PXLXOR, $A_x1, $A_y1, $A_x2, $A_y2, $A_hwnd)
  116.   WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
  117.   $A_return1 = PXLXOR($A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2)
  118. END_SUB
  119. //-----------------------------------------------------------
  120. //A_PXLCRC
  121. SUB(A_PXLCRC, $A_x1, $A_y1, $A_x2, $A_y2, $A_hwnd)
  122.   WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
  123.   $A_return1 = PXLCRC($A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2)
  124. END_SUB
  125. //-----------------------------------------------------------
  126. //A_IFPIXELIN
  127. SUB(A_IFPIXELIN, $A_x1, $A_y1, $A_x2, $A_y2, $A_color, $A_hwnd)
  128.   WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
  129.   IF_PIXEL_IN($A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2, $A_color)
  130.      $A_return1 = $_return1-$A_x0
  131.      $A_return2 = $_return2-$A_y0
  132.   else
  133.      $A_return1 = 0
  134.      $A_return2 = 0
  135.   END_IF
  136. END_SUB
  137. //-----------------------------------------------------------
  138. //A_IFPICTUREIN
  139. SUB(A_IFPICTUREIN, $A_x1, $A_y1, $A_x2, $A_y2, $A_file, $A_bgcolor, $A_currency, $A_hwnd)
  140.   WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
  141.   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)
  142.      $A_return1 = $_return1-$A_x0
  143.      $A_return2 = $_return2-$A_y0
  144.   else
  145.      $A_return1 = 0
  146.      $A_return2 = 0
  147.   END_IF
  148. END_SUB
  149. //-----------------------------------------------------------
  150. //A_SCANPICTURE
  151. SUB(A_SCANPICTURE, $A_x1, $A_y1, $A_x2, $A_y2, $A_file, $A_bgcolor, $A_currency, $A_hwnd)
  152.   WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
  153.   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)
  154.   FOR($i=0, $i < ARRSIZE($A_var),2)
  155.      $A_var[$i] = $A_var[$i]-$A_x0
  156.      $A_var[$i+1] = $A_var[$i+1]-$A_y0
  157.   END_CYC
  158. END_SUB
  159. //-----------------------------------------------------------
  160. //A_SCANPXL
  161. SUB(A_SCANPXL, $A_x1, $A_y1, $A_x2, $A_y2, $A_color, $A_hwnd)
  162.   WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
  163.   SCANPXL($A_var,$A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2,$A_color)
  164.   FOR($i=0, $i < ARRSIZE($A_var),2)
  165.      $A_var[$i] = $A_var[$i]-$A_x0
  166.      $A_var[$i+1] = $A_var[$i+1]-$A_y0
  167.   END_CYC
  168. END_SUB
  169. //-----------------------------------------------------------
  170. //A_COLORMODE
  171. SUB(A_COLORMODE, $A_mode, $A_x1, $A_y1, $A_x2, $A_y2, $A_hwnd)
  172.   WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
  173.   IF(($A_x1+$A_y1+$A_x2+$A_y2) = 0)
  174.      $A_x2 = $A_width
  175.      $A_y2 = $A_height
  176.   END_IF
  177.   COLORMODE ($A_mode, $A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2)
  178. END_SUB
  179. //-----------------------------------------------------------
  180. //A_CHECK_PXL
  181. SUB(A_CHECK_PXL,$A_hwnd)
  182.   WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
  183.   GETSCREEN
  184.   print("(",$_xmouse-$A_x0,",",$_ymouse-$A_y0,") // ",PXL($_xmouse,$_ymouse))
  185. END_SUB
  186. //-----------------------------------------------------------
  187. //A_KEYSTRING
  188. SUB(A_KEYSTRING, $A_str, $A_delay, $A_hwnd)
  189.   $A_kbl=GETKBLAYOUT($A_hwnd)
  190.   IF($A_kbl ! 1049)
  191.      setkblayout($A_hwnd, 1049)
  192.   END_IF  
  193.   FOR($A_nstr=1,$A_nstr<STRLEN ($A_str)+1)
  194.      $A_l=STRCUT ($A_str, $A_nstr, 1)
  195.      IF(ARRSIZE ($A_keys_arr) = 0)
  196.         TFREADARR ("keys.txt", $A_keys_arr)
  197.      END_IF  
  198.      FOR($A_a=1,$A_a<ARRSIZE ($A_keys_arr),2)
  199.         IF($A_keys_arr[$A_a] = $A_l)
  200.            $A_key = $A_keys_arr[$A_a-1]
  201.            IF($A_key = 46)
  202.               IF(STRMD5($A_l) ! "5058F1AF8388633F609CADB75A75DC9D")
  203.                  $A_key = 48
  204.               END_IF
  205.            END_IF
  206.            IF((($A_key > 64)&($A_key < 91))|(($A_key > 185)&($A_key < 223)))
  207.               $A_mess = 0x0100
  208.            else
  209.               $A_mess = 0x0102
  210.            END_IF
  211.            IF($A_key > 0)
  212.               postmessage($A_hwnd,$A_mess,$A_key,0)
  213.               waitms($A_delay)
  214.            END_IF
  215.            $A_a=999
  216.         END_IF
  217.      END_CYC
  218.   END_CYC
  219.   IF($A_kbl!GETKBLAYOUT($A_hwnd))
  220.      setkblayout($A_hwnd, $A_kbl)
  221.   END_IF
  222. END_SUB
  223. //-----------------------------------------------------------
  224. $A_press_delay = 30
  225.  
  226.  

Альтернативные команды для работы с окнами:
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 между возвращенными координатами при поиске пикселя или картинки, и кликом по возвращенным координатам. Это высота строки заголовка.

Пример:
Код: Clickermann
  1. #include "alt_winmode.cms"
  2.  
  3. $hwnd1 = WNDFIND ("Заголовок первого окна")
  4. $hwnd2 = WNDFIND ("Заголовок второго окна")
  5. A_MOVE(10,10, $hwnd1)
  6. wait(1)
  7. A_GETSCREEN(0,0,0,0,$hwnd1)
  8. A_IFPIXELIN(400,700,500,800, 11465971, $hwnd1)
  9. IF($A_return1>0)
  10.   A_MOVE($A_return1,$A_return2-20, $hwnd1)
  11.   waitms(50)
  12.   A_LCLICK($A_return1,$A_return2-20, $hwnd1)
  13.   waitms(50)  
  14. END_IF
  15.  
  16. THREAD(win_2)
  17.   #include "alt_winmode.cms"
  18.   A_LDOWN (155, 170, $hwnd2)
  19.   waitms(50)
  20.   A_MOVE(231, 170, $hwnd2)
  21.   waitms(50)
  22.   A_LUP(231, 170, $hwnd2)
  23.   wait(5)
  24.   A_KEYPRESS(#enter, $hwnd2)
  25.   waitms(50)
  26. END_THREAD

 Помним, в данном случае при работе с изображениями, нельзя чтобы окно было закрыто другим окном. Мало места на рабочем столе? Решается это просто. Включаем в настройках видеокарты дополнительный монитор и перетаскиваем наши окна на рабочий стол дополнительного монитора. Мы их не видим и они нам не мешают, а кликерманн видит и делает свое дело.
 Как включить доп. монитор при его отсутствии? пример для вин7.
 Теперь без проблем можно ботить в нескольких окнах одновременно, и одноременно заниматься на ПК своими делами  :D



Все функции не тестил, возможны ошибки. Если что не так, пишите, исправлю.



Обновление:

Добавлены команды:
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]
Код: Clickermann
  1. //A_KEYSTRING для clickermann v.4.13 b3
  2. SUB(A_KEYSTRING, $A_str, $A_delay, $A_hwnd)
  3.   FOR($A_nstr=1,$A_nstr<STRLEN ($A_str)+1)
  4.      $A_md5 = strmd5(strcut2($A_str, $A_nstr, $A_nstr ))
  5.      FOR($A_ntxt=1,$A_ntxt<TFCOUNT ("keys_v4.13.txt")+1)
  6.         IF(STRPOS (TFREAD ("keys_v4.13.txt",$A_ntxt),$A_md5) > 0)
  7.            postmessage($A_hwnd,0x0102,int(STRCUT (TFREAD("keys_v4.13.txt",$A_ntxt),1,STRPOS(TFREAD ("keys_v4.13.txt",$A_ntxt)," "))),0)
  8.            $A_ntxt=TFCOUNT ("keys_v4.13.txt")+1
  9.            waitms($A_delay)
  10.         END_IF
  11.      END_CYC
  12.   END_CYC
  13. END_SUB
  14. //-----------------------------------------------------------
  15.  
  16. //пример:
  17.  
  18. //нужную строку обязательно записываенм в начале в переменную
  19. $text = "English, Русский...! # $ % & ' ( * + , - . / 14890 : ; < = > ? @ [ \ ] ^ _ ` { | } ~  ¤ ¦ § © « ¬ ­ ® ° ± µ ¶ · » "
  20.  
  21. //и только после этого вызов подпрограммы.
  22. A_KEYSTRING ($text,100,197534)
  23.  
  24. HALT

[spoiler="пример в картинке"][/spoiler]
единственное, что с кавычками так ничего и не удалось сделать  :(

« Последнее редактирование: Январь 25, 2021, 12:36:16 am от dramster »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3800
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • Просмотр профиля
GETSCREEN в привязке и GETSCREEN по всему экрану это разные вещи. Можешь попробовать.
В твоём варианте, как бы ты не делал, внутри буфера координаты останутся абсолютными, а не относительными.


dramster

  • Герой форума
  • *****
  • Сообщений: 1130
    • Просмотр профиля
GETSCREEN в привязке и GETSCREEN по всему экрану это разные вещи. Можешь попробовать.
В твоём варианте, как бы ты не делал, внутри буфера координаты останутся абсолютными, а не относительными.
да, всё верно. но A_GETSCREEN бал сделан лишь для того, чтобы вводить область GETSCREEN в независимости от местоположения окна. да, будет одинаково работать и с стандартным GETSCREEN, кроме как с разницей скорости выполнения команды, а тем самым нагрузки на цп.
Код: Clickermann
  1. #include "alt_winmode.cms"
  2. $hwnd1 = WNDFIND ("Блокнот")
  3.  
  4. wait(1)
  5. $t=$_ms
  6. A_GETSCREEN(0,0,0,0,$hwnd1)
  7. print($_ms-$t)  //12мс
  8.  
  9. SCREENSHOT
  10.  
  11.  
  12. wait(1)
  13. $t=$_ms
  14. GETSCREEN
  15. print($_ms-$t)  //58мс . ведь скрин делается сразу двух рабочих столов 1920х1080х2, если для работы скрипта использовать дополнотельный монитор.
  16.  
  17. SCREENSHOT
  18. halt

и плюс к этому в A_GETSCREEN вводятся координаты облости относительно окна. где бы окно не находилось, скринить будет только нужную область.



еще хотел добавить, что написание скриптов удобнее делать переместив окно в координаты (0,0,0,0). так удобнее ненакосячить с координатами и цветами в окне. а далее,при использовании, это акно можно перемещять куда угодно.
« Последнее редактирование: Сентябрь 07, 2015, 03:31:56 pm от dramster »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3800
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • Просмотр профиля
Getscreen в привязке располагает окно в начале 0,0. Без привязки скрин полного экрана, а окно там где окно  :D


dramster

  • Герой форума
  • *****
  • Сообщений: 1130
    • Просмотр профиля
еще один плюс A_GETSCREEN в работе с изображениями нескольких окон.можно использовать A_GETSCREEN-ы разных окон в разных потоках, и при этом они не будут помехой друг другу.
Код: Clickermann
  1. #include "alt_winmode.cms"
  2.  
  3. $hwnd1 = 727230 // текстовое поле первого блокнота
  4. $hwnd2 = 1186412 // текстовое поле второго блокнота
  5.  
  6. wait(1)
  7. A_KEYPRESS(#A, $hwnd1) //в первом пишем "а"
  8. waitms(50)
  9. A_GETSCREEN(0,0,0,0,$hwnd1) //скриним первый
  10. SCREENSHOT
  11.  
  12. wait(1)
  13. A_KEYPRESS(#BACKSPACE, $hwnd1) //стираем в первом "а"
  14.  
  15. waitms(50)
  16. A_GETSCREEN(0,0,0,0,$hwnd2)  //скриним второй
  17. SCREENSHOT  //и видим, что в первом асталось "а", хотя в самом деле там пусто. да и вообще это поле осталось в буфере и никуда не делось.
  18.  
  19. halt
первый скрин

второй

если бы мы использовали стандартный GETSCREEN, то при втором SCREENSHOT у нас бы затерлось первое окно. вернее не затерлось, а обновилось.
« Последнее редактирование: Сентябрь 07, 2015, 05:26:34 pm от dramster »

msgkumisi

  • Освоившийся
  • **
  • Сообщений: 22
    • Просмотр профиля
добавьте вот это тоже:

Код: Clickermann
  1. //A_DBLCLICK
  2. SUB(A_DBLCLICK, $A_x, $A_y, $A_hwnd)
  3.   postmessage($A_hwnd,0x0203,0x0001,$A_x+($A_y*65536))
  4. END_SUB
  5.  

Луций

  • Активный участник
  • ***
  • Сообщений: 248
  • чат в телеге: https://t.me/klickermannchat
    • Просмотр профиля
    • Пишу скрипты на заказ:
это прекрасно, ждем пока кто то все команды для этого режима пропишет через сабы

dramster

  • Герой форума
  • *****
  • Сообщений: 1130
    • Просмотр профиля
добавьте вот это тоже:

[spoiler]
Код: Clickermann
  1. //A_DBLCLICK
  2. SUB(A_DBLCLICK, $A_x, $A_y, $A_hwnd)
  3.   postmessage($A_hwnd,0x0203,0x0001,$A_x+($A_y*65536))
  4. END_SUB
  5.  
[/spoiler]
добавил. спс.

это прекрасно, ждем пока кто то все команды для этого режима пропишет через сабы
да в принципе и добавлять то и нечего  :D . кручение колеса в разных окнах по разному себя ведет... а больше я и не знаю что еще нужно, связки кнопок shift+ ctrl+ alt+ нужно.
 а вот про принцип работы  mover я был бы рад разузнать. в 3д играх для движеня камеры (экрана) он необходим. эксперименты с move закончились ничем, с ним экран просто дергается на месте. да, можно использовать клавиши поворота и тп, но с mover движение происходит идеально точно, независимо от фпс в игре.

vao

  • Зашел в гости
  • *
  • Сообщений: 7
    • Просмотр профиля
А никто не знает как в 10й винде реализовать привязку к разным рабочим столам?

n.vlad

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

dramster

  • Герой форума
  • *****
  • Сообщений: 1130
    • Просмотр профиля
обноружил кое-какой баг при использовании этого кода в потоках. с небольшей вероятностью, команды могут выполняться в потоке и вне его почти одновременно, из-за этого переменные путаются. для наглядности:
Код: Clickermann
  1. SUB(test, $n)
  2.      waitms(8)
  3.      print("вне потока ", $n)
  4. END_SUB
  5.  
  6. test("вне потока")
  7.  
  8.  
  9.  
  10. THREAD(thr_test)
  11.   SUB(test, $n)
  12.         waitms(10)
  13.         print("в потоке ", $n)
  14.   END_SUB
  15.  
  16.   test("в потоке")
  17.  
  18. END_THREAD
в логе:
15:47:28 в потоке вне потока
15:47:28 вне потока вне потока
15:47:28 вне потока вне потока
15:47:28 в потоке 0
15:47:28 вне потока в потоке
15:47:28 в потоке 0
15:47:28 вне потока в потоке
15:47:28 в потоке вне потока
15:47:28 вне потока в потоке
15:47:28 в потоке вне потока
15:47:28 вне потока в потоке
15:47:28 в потоке вне потока
15:47:28 вне потока в потоке
15:47:28 в потоке вне потока
15:47:28 вне потока 0
15:47:28 вне потока вне потока
15:47:28 в потоке вне потока
15:47:28 вне потока в потоке
15:47:28 в потоке 0
15:47:28 вне потока в потоке
15:47:28 в потоке 0
15:47:28 вне потока в потоке
15:47:28 в потоке в потоке
15:47:28 вне потока вне потока

может есть идеи как избежать этого? я меня идея лиш одна - для каждого потока отдельный инклуд с переименованными переменными.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3685
  • Котэ
    • Просмотр профиля
Никакого бага, переменные в потоках не изолированы, нужно использовать разные имена переменных.

i0

  • Оплот сообщества
  • ****
  • Сообщений: 353
  • CMann 4.13.014 final, ie, presto, win7 x86, x64
    • Просмотр профиля
dramster, взял себе твой a_keystring, добавил недостающие ascii-коды в файл, ввод заработал в привязке к окну моей игры, спасибо огромное

m.igel

  • Освоившийся
  • **
  • Сообщений: 23
    • Просмотр профиля
Помогите новичку разобраться куды лошадь запрягать!

Уже понял, что KEYSTRING лепит что попало и набрать через него D:\... задача нетривиальная. Пока я поборол её чтением из файла. Но оказалось, что A_KEYSTRING позволяет избежать этих проблем. Я правильно понимаю? Тогда поясните, пожалуйста, куда прицепить этот код и как дальше пользоваться.

Я пока понял так, что сперва кладём текстовик в папку с программой, потом где-то в начале вставляем SUB с A_KEYSTRING, после чего там где надо пишем A_KEYSTRING (Любой текст, который надо вставить) Но лыжи чота не едут...
Да, там же ещё надо куда-то привязаться...

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3800
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • Просмотр профиля
Пишем
A_KEYSTRING("Текст", 10-задержка, hwnd-окна куда пишем)