Author Topic: Альтернатива привязке - работа с несколькими окнами, решение черного окна, и тп.  (Read 53418 times)

0 Members and 1 Guest are viewing this topic.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
  Проблемы при привязке? Пропадает картинка окна; не работают нажатия кнопок;  постоянное переключение между окнами, если требуется работа с несколькими?
  Есть решение!!!
Code: (clickermann) [Select]
//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 между возвращенными координатами при поиске пикселя или картинки, и кликом по возвращенным координатам. Это высота строки заголовка.

Пример:
Code: (clickermann) [Select]
#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.
 Теперь без проблем можно ботить в нескольких окнах одновременно, и одноременно заниматься на ПК своими делами  :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]
Code: (clickermann) [Select]
//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]
единственное, что с кавычками так ничего и не удалось сделать  :(

« Last Edit: January 25, 2021, 12:36:16 AM by dramster »

Vint

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


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
GETSCREEN в привязке и GETSCREEN по всему экрану это разные вещи. Можешь попробовать.
В твоём варианте, как бы ты не делал, внутри буфера координаты останутся абсолютными, а не относительными.
да, всё верно. но A_GETSCREEN бал сделан лишь для того, чтобы вводить область GETSCREEN в независимости от местоположения окна. да, будет одинаково работать и с стандартным GETSCREEN, кроме как с разницей скорости выполнения команды, а тем самым нагрузки на цп.
Code: (clickermann) [Select]
#include "alt_winmode.cms"
$hwnd1 = WNDFIND ("Блокнот")

wait(1)
$t=$_ms
A_GETSCREEN(0,0,0,0,$hwnd1)
print($_ms-$t)  //12мс

SCREENSHOT


wait(1)
$t=$_ms
GETSCREEN
print($_ms-$t)  //58мс . ведь скрин делается сразу двух рабочих столов 1920х1080х2, если для работы скрипта использовать дополнотельный монитор.

SCREENSHOT
halt

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



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

Vint

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


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
еще один плюс A_GETSCREEN в работе с изображениями нескольких окон.можно использовать A_GETSCREEN-ы разных окон в разных потоках, и при этом они не будут помехой друг другу.
Code: (clickermann) [Select]
#include "alt_winmode.cms"

$hwnd1 = 727230 // текстовое поле первого блокнота
$hwnd2 = 1186412 // текстовое поле второго блокнота

wait(1)
A_KEYPRESS(#A, $hwnd1) //в первом пишем "а"
waitms(50)
A_GETSCREEN(0,0,0,0,$hwnd1) //скриним первый
SCREENSHOT

wait(1)
A_KEYPRESS(#BACKSPACE, $hwnd1) //стираем в первом "а"

waitms(50)
A_GETSCREEN(0,0,0,0,$hwnd2)  //скриним второй
SCREENSHOT  //и видим, что в первом асталось "а", хотя в самом деле там пусто. да и вообще это поле осталось в буфере и никуда не делось.

halt
первый скрин

второй

если бы мы использовали стандартный GETSCREEN, то при втором SCREENSHOT у нас бы затерлось первое окно. вернее не затерлось, а обновилось.
« Last Edit: September 07, 2015, 05:26:34 PM by dramster »

msgkumisi

  • Освоившийся
  • **
  • Posts: 22
    • View Profile
добавьте вот это тоже:

Code: (clickermann) [Select]
//A_DBLCLICK
SUB(A_DBLCLICK, $A_x, $A_y, $A_hwnd)
   postmessage($A_hwnd,0x0203,0x0001,$A_x+($A_y*65536))
END_SUB

Луций

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

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
добавьте вот это тоже:

[spoiler]
Code: (clickermann) [Select]
//A_DBLCLICK
SUB(A_DBLCLICK, $A_x, $A_y, $A_hwnd)
   postmessage($A_hwnd,0x0203,0x0001,$A_x+($A_y*65536))
END_SUB
[/spoiler]
добавил. спс.

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

vao

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

n.vlad

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
Спасибо! невероятно полезно!

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
обноружил кое-какой баг при использовании этого кода в потоках. с небольшей вероятностью, команды могут выполняться в потоке и вне его почти одновременно, из-за этого переменные путаются. для наглядности:
Code: (clickermann) [Select]
SUB(test, $n)
      waitms(8)
      print("вне потока ", $n)
END_SUB

test("вне потока")



THREAD(thr_test)
   SUB(test, $n)
         waitms(10)
         print("в потоке ", $n)
   END_SUB
   
   test("в потоке")
   
END_THREAD
в логе:
Code: [Select]
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

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

i0

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

m.igel

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

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

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

Vint

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