Что нового

[Автоматизация] Не меняется значение глобальной переменной в цикле через функцию

Krip1

Новичок
Сообщения
3
Репутация
0
Global $phase = false

While 1
HotKeySet("w", "changephase")
if $phase then
ToolTip("Зашёл", 0, 0)
EndIf
WEnd

func changephase()
$phase = not $phase
EndFunc

Не меняется значение переменной $phase, это естественно часть кода. По какой причине такое может происходить? Уже намучился, и Select'ом пробовал... и так и сяк... Такое ощущение, что функция создает и меняет локальную переменную внутри себя, так как если в неё вставить ToolTip($phase, 0, 0), то на кнопку W оно будет меняться на True и False. Но глобальную он не меняет ни в какую! Помогите... ;_C
 

ra4o

AutoIT Гуру
Сообщения
1 101
Репутация
222
Переменная меняет значение ! Посмотрите, что у Вас происходит, если "$phase"=True ! Постоянно вызывается функция , которая создаёт подсказку , эта подсказка в цикле непрерывно пересоздаётся , в итоге в левом-верхнем углу мелькает окно подсказки, после второго нажатия HotKey подсказка перестанет пересоздаваться и будет отображаться статично (ведь Вы её не убираете). Вынесите создание HotKey вне цикла , зачем его постоянно пересоздавать ? Значение переменной легко проверить , дописав вывод её значения в консоль , например :
Код:
Global $phase = false
HotKeySet("w", "changephase")
While 1
      if $phase then
         ToolTip("Зашёл", 0, 0)
      EndIf
sleep(100)
WEnd

func changephase()
   $phase =  not $phase
   ConsoleWrite('$phase='&$phase&@CR)
EndFunc

В подобные циклы включайте небольшую паузу. Для эксперимента - запустите скрипт без паузы в цикле и с паузой и сравните нагрузку на процессор .
 
Автор
K

Krip1

Новичок
Сообщения
3
Репутация
0
ra4o сказал(а):
Переменная меняет значение ! Посмотрите, что у Вас происходит, если "$phase"=True ! Постоянно вызывается функция , которая создаёт подсказку , эта подсказка в цикле непрерывно пересоздаётся , в итоге в левом-верхнем углу мелькает окно подсказки, после второго нажатия HotKey подсказка перестанет пересоздаваться и будет отображаться статично (ведь Вы её не убираете). Вынесите создание HotKey вне цикла , зачем его постоянно пересоздавать ? Значение переменной легко проверить , дописав вывод её значения в консоль , например :
Код:
Global $phase = false
HotKeySet("w", "changephase")
While 1
      if $phase then
         ToolTip("Зашёл", 0, 0)
      EndIf
sleep(100)
WEnd

func changephase()
   $phase =  not $phase
   ConsoleWrite('$phase='&$phase&@CR)
EndFunc

В подобные циклы включайте небольшую паузу. Для эксперимента - запустите скрипт без паузы в цикле и с паузой и сравните нагрузку на процессор .
Я вставлял сюда Exit и ничего не происходило.

While 1
if $phase then
Exit 0
EndIf
WEnd

Hotkey переназначаю, т.к. у меня идёт проверка, что если я в активном окне, то hotkeyset с функцией, иначе сбрасываю функцию.
Интересно тем, что если я отдельно в скрипте воссоздам ваш вариант - всё работает, но в моём скрипте почему-то не работает.

Сейчас для теста поставил, чтобы когда в варкрафте при $phase = true жал 2, но ноль действий. Бинд на w вне цикла. Все другие функции работают.

Вот полный скрипт:
#include <GUIConstants.au3>
#include <File.au3>

if FileExists ( "config.ini" ) <> True Then
_FileCreate ("config.ini")
Dim $config_key[5][2] = [ [ "1skill", "" ], [ "2skill", "" ], [ "3skill", "" ], [ "5skill", "" ], [ "6skill", "" ] ]
Dim $config_res[2][2] = [ [ "x", "" ], [ "y", "" ]]
IniWriteSection("config.ini", "Keys", $config_key, 0)
IniWriteSection("config.ini", "Resolution", $config_res, 0)
EndIf

GUICreate("Установка разрешения", 240, 120)
GUICtrlCreateLabel("Введи своё разрешение экрана", 35, 10)
$res_x = IniRead("config.ini", "Resolution", "x", "0")
$res_y = IniRead("config.ini", "Resolution", "y", "0")
$x = GUICtrlCreateInput($res_x, 50, 30, 60)
$y = GUICtrlCreateInput($res_y, 120, 30, 60)
$okbutton = GUICtrlCreateButton("Ввёл", 65, 60, 100)
GUICtrlCreateLabel("@Made by Krip1", 77, 95)
GUISetState(@SW_SHOW)

While 1
$msg = GUIGetMsg()

Select
Case $msg = $GUI_EVENT_CLOSE
MsgBox(0, "GUI Event", "А зачем тогда запускал?")
Exit 0
Case $msg = $okbutton
ExitLoop
EndSelect
WEnd

IniWrite("config.ini", "Resolution", "x", GUICtrlRead($x))
IniWrite("config.ini", "Resolution", "y", GUICtrlRead($y))

GUIDelete ( )

; Окно с дополнениями
$dopwindow = GUICreate("Дополнения", 350, 240)
GUICtrlCreateLabel("ФЕЙЗЫ ПОКА ЧТО НЕ РАБОТАЮТ.", 15, 5)
GUICtrlCreateLabel("Автокаст фейзов на", 15, 30)
$PhaseAutoCast = GUICtrlCreateInput("", 130, 26, 30)
GUICtrlCreateLabel("На какую кнопку будут юзатся Фейзы?", 15, 55)
$phasebindini = GUICtrlCreateInput("", 230, 51, 30)
GUICtrlCreateLabel("Можно использовать комбинацию, но тогда Alt это !,", 15, 100)
GUICtrlCreateLabel("Cntrl это ^, а Shift это +.", 15, 120)
GUICtrlCreateLabel("Например !w - это Alt+W, ", 15, 150)
GUICtrlCreateLabel("^d - это Cntrl+D, +2 - это Shift+2.", 15, 170)
$backbutton = GUICtrlCreateButton("Назад", 120, 200, 100)

; Окно с настройками биндов
$mainchange = GUICreate("Настройка биндов", 300, 260)
GUICtrlCreateLabel("На сочетание с какой клавишей биндить?", 45, 20)
local $radio1 = GUICtrlCreateRadio ("Alt", 40, 50, 40)
local $radio2 = GUICtrlCreateRadio ("Ctrl", 90, 50, 40)
local $radio3 = GUICtrlCreateRadio ("Shift", 140, 50, 40)
local $radio4 = GUICtrlCreateRadio ("Без сочетания", 190, 50, 110)

; Загрузка бинда из файла ini
Select
Case IniRead("config.ini", "keys", "combokey", "") == "!"
GUICtrlSetState($radio1, $GUI_CHECKED)
Case IniRead("config.ini", "keys", "combokey", "") == "^"
GUICtrlSetState($radio2, $GUI_CHECKED)
Case IniRead("config.ini", "keys", "combokey", "") == "+"
GUICtrlSetState($radio3, $GUI_CHECKED)
Case Else
GUICtrlSetState($radio4, $GUI_CHECKED)
EndSelect

; Ввод биндов
GUICtrlCreateLabel("Введи свои бинды клавиш", 73, 95)
$1 = GUICtrlCreateInput(IniRead("config.ini", "keys", "1skill", ""), 90, 150, 20)
$2 = GUICtrlCreateInput(IniRead("config.ini", "keys", "2skill", ""), 130, 150, 20)
$3 = GUICtrlCreateInput(IniRead("config.ini", "keys", "3skill", ""), 170, 150, 20)
$5 = GUICtrlCreateInput(IniRead("config.ini", "keys", "5skill", ""), 130, 120, 20)
$6 = GUICtrlCreateInput(IniRead("config.ini", "keys", "6skill", ""), 170, 120, 20)
GUICtrlCreateLabel("Ульт", 200, 153)
$dopbutton = GUICtrlCreateButton("Дополнения", 90, 190, 100)
$okbutton = GUICtrlCreateButton("Ввёл", 90, 220, 100)
GUISetState(@SW_SHOW)

While 1
$msg = GUIGetMsg()

Select
Case $msg = $dopbutton
GUISetState(@SW_HIDE)
GUISwitch($dopwindow)
GUISetState(@SW_SHOW)
Case $msg = $backbutton
GUISetState(@SW_HIDE)
GUISwitch($mainchange)
GUISetState(@SW_SHOW)
Case $msg = $okbutton
MsgBox(0, "GUI Event", "Поехали!")
ExitLoop
Case $msg = $GUI_EVENT_CLOSE
MsgBox(0, "GUI Event", "Не забывай обо мне")
Exit 0
EndSelect
WEnd

; Запись бинда комбинирующей клавиши в файл ini
Select
Case BitAND(GUICtrlRead($Radio1), $GUI_CHECKED); Will evaluate to 1 := True or 0 := False
IniWrite("config.ini", "keys", "combokey", "!")
Case BitAND(GUICtrlRead($Radio2), $GUI_CHECKED); Same
IniWrite("config.ini", "keys", "combokey", "^")
Case BitAND(GUICtrlRead($Radio3), $GUI_CHECKED); Same
IniWrite("config.ini", "keys", "combokey", "+")
Case Else
IniWrite("config.ini", "keys", "combokey", "")
EndSelect

IniWrite("config.ini", "keys", "1skill", GUICtrlRead($1))
IniWrite("config.ini", "keys", "2skill", GUICtrlRead($2))
IniWrite("config.ini", "keys", "3skill", GUICtrlRead($3))
IniWrite("config.ini", "keys", "5skill", GUICtrlRead($5))
IniWrite("config.ini", "keys", "6skill", GUICtrlRead($6))
GUIDelete ()

; Задержка для нажатий клавиш 0.005 сек
Opt("SendKeyDownDelay", 5)

; Разрешение экрана из config.ini
Global $Resolution_X = IniRead("config.ini", "Resolution", "x", "")
Global $Resolution_Y = IniRead("config.ini", "Resolution", "y", "")

;Бинды клавиш из config.ini
Global $1skill = IniRead("config.ini", "Keys", "1skill", "")
Global $2skill = IniRead("config.ini", "Keys", "2skill", "")
Global $3skill = IniRead("config.ini", "Keys", "3skill", "")
Global $5skill = IniRead("config.ini", "Keys", "5skill", "")
Global $6skill = IniRead("config.ini", "Keys", "6skill", "")
Global $ComboKey = IniRead("config.ini", "Keys", "ComboKey", "")
Global $phaseon = false

; Индексы скиллов - НЕ ТРОГАТЬ!
Global $1skillPosInd_X = 0.795
Global $2_5skillPosInd_X = 0.85
Global $3_6skillPosInd_X = 0.900

Global $TopSkillsPosInd_Y = 0.88
Global $DownSkillsPosInd_Y = 0.95
; Индексы скиллов - НЕ ТРОГАТЬ!
HotKeySet("w", "ChangePhase")
; Рабочий процесс программы
While 1

if WinWaitActive("Warcraft III") Then

if $phaseon Then
Send(2)
endif

if $1skill <> "" then HotKeySet($ComboKey&$1skill, "OnAutoCast1")

if $2skill <> "" then HotKeySet($ComboKey&$2skill, "OnAutoCast2")

if $3skill <> "" then HotKeySet($ComboKey&$3skill, "OnAutoCast3")

if $5skill <> "" then HotKeySet($ComboKey&$5skill, "OnAutoCast5")

if $6skill <> "" then HotKeySet($ComboKey&$6skill, "OnAutoCast6")

EndIf

; Когда вышли из WarCraft
if WinWaitNotActive("Warcraft III") Then

if $1skill <> "" then HotKeySet($ComboKey&$1skill, "off")

if $2skill <> "" then HotKeySet($ComboKey&$2skill, "off")

if $3skill <> "" then HotKeySet($ComboKey&$3skill, "off")

if $5skill <> "" then HotKeySet($ComboKey&$5skill, "off")

if $6skill <> "" then HotKeySet($ComboKey&$6skill, "off")

EndIf

WEnd

; Пустая функция, чтобы сбросить с кнопки бинд, пока не в WarCraft
func off()
EndFunc

func ChangePhase()
$phaseon = not $phaseon
EndFunc

; Функции для клика правой по скиллам
Func OnAutoCast1()

$cur_pos_mouse = MouseGetPos()
MouseClick("right", $Resolution_X*$1skillPosInd_X, $Resolution_Y*$DownSkillsPosInd_Y, 1, 0)
MouseMove($cur_pos_mouse[0], $cur_pos_mouse[1], 0)
EndFunc

Func OnAutoCast2()

$cur_pos_mouse = MouseGetPos()
MouseClick("right", $Resolution_X*$2_5skillPosInd_X, $Resolution_Y*$DownSkillsPosInd_Y, 1, 0)
MouseMove($cur_pos_mouse[0], $cur_pos_mouse[1], 0)
EndFunc

Func OnAutoCast3()

$cur_pos_mouse = MouseGetPos()
MouseClick("right", $Resolution_X*$3_6skillPosInd_X, $Resolution_Y*$DownSkillsPosInd_Y, 1, 0)
MouseMove($cur_pos_mouse[0], $cur_pos_mouse[1], 0)
EndFunc

Func OnAutoCast5()

$cur_pos_mouse = MouseGetPos()
MouseClick("right", $Resolution_X*$2_5skillPosInd_X, $Resolution_Y*$TopSkillsPosInd_Y, 1, 0)
MouseMove($cur_pos_mouse[0], $cur_pos_mouse[1], 0)
EndFunc

Func OnAutoCast6()

$cur_pos_mouse = MouseGetPos()
MouseClick("right", $Resolution_X*$3_6skillPosInd_X, $Resolution_Y*$TopSkillsPosInd_Y, 1, 0)
MouseMove($cur_pos_mouse[0], $cur_pos_mouse[1], 0)
EndFunc
 

ra4o

AutoIT Гуру
Сообщения
1 101
Репутация
222
OffTopic:
Заключайте текст скрипта в соответсвующие теги , ведь в таком виде гораздо удобнее читать скрипт !

Из того , на что обратил внимание :
Код:
;Этот участок кода
         if $phaseon Then
            Send(2)
		 endif
;При $phaseon=True будет постоянно отправлять "2" , пока не вызовите функцию "ChangePhase()" так и нужно ?
;Если нужно однократно отправить "2" , то сбрасывайте $phaseon , можно так:
         if $phaseon Then
			ChangePhase()
            Send(2)
		 endif

Удивила Ваша функция "off()" , если Вы внимательно прочитаете справку по функции "HotKeySet ( ...)" и обратите внимание на параметр "function" , то увидите :"[необязательный] Имя функции, которая будет вызвана при использовании горячей клавиши. Отсутствие этого параметра приводит к сбросу ранее установленной горячей клавиши."
Обратите внимание на следующий момент :
Код:
if WinWaitActive("Warcraft III") Then
	 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 EndIf
 
 ; Когда вышли из WarCraft
if WinWaitNotActive("Warcraft III") Then
   ;;;;;;;;;;;;;;;;;;;;;;;;;;
   ;;;;;;;;;;;;;;;;;;;;;;;;;;
EndIf

Условие "Когда вышли из WarCraft" не выполнится НИКОГДА , так как ранее в " if WinWaitActive("Warcraft III") Then" Вы останавливаете выполнение скрипта до активизации окна "Warcraft III", причём без таймаута, то есть бесконечно ждёте появление этого окна...
Более подробно вникнуть в скрипт тяжело , так как он в виде обычного текста, вне тегов. Ещё раз повторюсь - уважайте участников форума - вставляйте текст скрипта в теги !!! Более того для длинных участков кода также есть тег внутрь которого заключайте скрипт уже в теге для скрипта. (Надеюсь понятно сформулировал свою мысль :scratch: )
 
Автор
K

Krip1

Новичок
Сообщения
3
Репутация
0
ra4o сказал(а):
OffTopic:
Заключайте текст скрипта в соответсвующие теги , ведь в таком виде гораздо удобнее читать скрипт !

Из того , на что обратил внимание :
Код:
;Этот участок кода
         if $phaseon Then
            Send(2)
		 endif
;При $phaseon=True будет постоянно отправлять "2" , пока не вызовите функцию "ChangePhase()" так и нужно ?
;Если нужно однократно отправить "2" , то сбрасывайте $phaseon , можно так:
         if $phaseon Then
			ChangePhase()
            Send(2)
		 endif
Я меньше недели как познакомился с autoit - не всё ещё знаю)
Дело в том, что он не отправляет 2 бесконечно после нажатия хоткея, мне нужно сделать так: изначально $phase стоит false, а с помощью хоткея он переключается на true или false. Он не переключается, Send(2) никогда не происходит. Вопрос в том, как его исправить, по поводу ненужности функции off учту)


Добавлено:
Сообщение автоматически объединено:

;При $phaseon=True будет постоянно отправлять "2" , пока не вызовите функцию "ChangePhase()" так и нужно ?

Да, нужно так, дело не в Send(2), а в том, что у меня там своя функция. Это лишь пример. Попробуйте скопировать мой скрипт и запустить, удалив проверку на активацию окна варкрафт - не будет работать хоткей w, так как не меняется значение переменной $phase
 

ra4o

AutoIT Гуру
Сообщения
1 101
Репутация
222
Попробуйте скопировать мой скрипт и запустить, удалив проверку на активацию окна варкрафт - не будет работать хоткей w
Всё работает !
Код:
#include <GUIConstants.au3>
#include <File.au3>

if FileExists ( "config.ini" ) <> True Then
   _FileCreate ("config.ini")
   Dim $config_key[5][2] = [ [ "1skill", "" ], [ "2skill", "" ], [ "3skill", "" ], [ "5skill", "" ], [ "6skill", "" ] ]
   Dim $config_res[2][2] = [ [ "x", "" ], [ "y", "" ]]
   IniWriteSection("config.ini", "Keys", $config_key, 0)
   IniWriteSection("config.ini", "Resolution", $config_res, 0)
EndIf

GUICreate("Установка разрешения", 240, 120)
GUICtrlCreateLabel("Введи своё разрешение экрана", 35, 10)
$res_x = IniRead("config.ini", "Resolution", "x", "0")
$res_y = IniRead("config.ini", "Resolution", "y", "0")
$x = GUICtrlCreateInput($res_x, 50, 30, 60)
$y = GUICtrlCreateInput($res_y, 120, 30, 60)
$okbutton = GUICtrlCreateButton("Ввёл", 65, 60, 100)
GUICtrlCreateLabel("@Made by Krip1", 77, 95)
GUISetState(@SW_SHOW)

While 1
  $msg = GUIGetMsg()

  Select
   Case $msg = $GUI_EVENT_CLOSE
      MsgBox(0, "GUI Event", "А зачем тогда запускал?")
      Exit 0
    Case $msg = $okbutton
      ExitLoop
  EndSelect
WEnd

IniWrite("config.ini", "Resolution", "x", GUICtrlRead($x))
IniWrite("config.ini", "Resolution", "y", GUICtrlRead($y))

GUIDelete ( )

; Окно с дополнениями
$dopwindow = GUICreate("Дополнения", 350, 240)
GUICtrlCreateLabel("ФЕЙЗЫ ПОКА ЧТО НЕ РАБОТАЮТ.", 15, 5)
GUICtrlCreateLabel("Автокаст фейзов на", 15, 30)
$PhaseAutoCast = GUICtrlCreateInput("", 130, 26, 30)
GUICtrlCreateLabel("На какую кнопку будут юзатся Фейзы?", 15, 55)
$phasebindini = GUICtrlCreateInput("", 230, 51, 30)
GUICtrlCreateLabel("Можно использовать комбинацию, но тогда Alt это !,", 15, 100)
GUICtrlCreateLabel("Cntrl это ^, а Shift это +.", 15, 120)
GUICtrlCreateLabel("Например !w - это Alt+W, ", 15, 150)
GUICtrlCreateLabel("^d - это Cntrl+D, +2 - это Shift+2.", 15, 170)
$backbutton = GUICtrlCreateButton("Назад", 120, 200, 100)

; Окно с настройками биндов
$mainchange = GUICreate("Настройка биндов", 300, 260)
GUICtrlCreateLabel("На сочетание с какой клавишей биндить?", 45, 20)
local $radio1 = GUICtrlCreateRadio ("Alt", 40, 50, 40)
local $radio2 = GUICtrlCreateRadio ("Ctrl", 90, 50, 40)
local $radio3 = GUICtrlCreateRadio ("Shift", 140, 50, 40)
local $radio4 = GUICtrlCreateRadio ("Без сочетания", 190, 50, 110)

; Загрузка бинда из файла ini
Select
   Case IniRead("config.ini", "keys", "combokey", "") == "!"
     GUICtrlSetState($radio1, $GUI_CHECKED)
   Case IniRead("config.ini", "keys", "combokey", "") == "^"
     GUICtrlSetState($radio2, $GUI_CHECKED)
   Case IniRead("config.ini", "keys", "combokey", "") == "+"
     GUICtrlSetState($radio3, $GUI_CHECKED)
   Case Else
     GUICtrlSetState($radio4, $GUI_CHECKED)
EndSelect

; Ввод биндов
GUICtrlCreateLabel("Введи свои бинды клавиш", 73, 95)
$1 = GUICtrlCreateInput(IniRead("config.ini", "keys", "1skill", ""), 90, 150, 20)
$2 = GUICtrlCreateInput(IniRead("config.ini", "keys", "2skill", ""), 130, 150, 20)
$3 = GUICtrlCreateInput(IniRead("config.ini", "keys", "3skill", ""), 170, 150, 20)
$5 = GUICtrlCreateInput(IniRead("config.ini", "keys", "5skill", ""), 130, 120, 20)
$6 = GUICtrlCreateInput(IniRead("config.ini", "keys", "6skill", ""), 170, 120, 20)
GUICtrlCreateLabel("Ульт", 200, 153)
$dopbutton = GUICtrlCreateButton("Дополнения", 90, 190, 100)
$okbutton = GUICtrlCreateButton("Ввёл", 90, 220, 100)
GUISetState(@SW_SHOW)

While 1
  $msg = GUIGetMsg()

  Select
  Case $msg = $dopbutton
    GUISetState(@SW_HIDE)
     GUISwitch($dopwindow)
     GUISetState(@SW_SHOW)
  Case $msg = $backbutton
     GUISetState(@SW_HIDE)
     GUISwitch($mainchange)
     GUISetState(@SW_SHOW)
   Case $msg = $okbutton
      MsgBox(0, "GUI Event", "Поехали!")
      ExitLoop
   Case $msg = $GUI_EVENT_CLOSE
      MsgBox(0, "GUI Event", "Не забывай обо мне")
      Exit 0
  EndSelect
WEnd

; Запись бинда комбинирующей клавиши в файл ini
Select
        Case BitAND(GUICtrlRead($Radio1), $GUI_CHECKED); Will evaluate to 1 := True or 0 := False
            IniWrite("config.ini", "keys", "combokey", "!")
        Case BitAND(GUICtrlRead($Radio2), $GUI_CHECKED); Same
            IniWrite("config.ini", "keys", "combokey", "^")
        Case BitAND(GUICtrlRead($Radio3), $GUI_CHECKED); Same
            IniWrite("config.ini", "keys", "combokey", "+")
       Case Else
         IniWrite("config.ini", "keys", "combokey", "")
EndSelect

IniWrite("config.ini", "keys", "1skill", GUICtrlRead($1))
IniWrite("config.ini", "keys", "2skill", GUICtrlRead($2))
IniWrite("config.ini", "keys", "3skill", GUICtrlRead($3))
IniWrite("config.ini", "keys", "5skill", GUICtrlRead($5))
IniWrite("config.ini", "keys", "6skill", GUICtrlRead($6))
GUIDelete ()

; Задержка для нажатий клавиш 0.005 сек
Opt("SendKeyDownDelay", 5)

; Разрешение экрана из config.ini
Global $Resolution_X = IniRead("config.ini", "Resolution", "x", "")
Global $Resolution_Y = IniRead("config.ini", "Resolution", "y", "")

;Бинды клавиш из config.ini
Global $1skill = IniRead("config.ini", "Keys", "1skill", "")
Global $2skill = IniRead("config.ini", "Keys", "2skill", "")
Global $3skill = IniRead("config.ini", "Keys", "3skill", "")
Global $5skill = IniRead("config.ini", "Keys", "5skill", "")
Global $6skill = IniRead("config.ini", "Keys", "6skill", "")
Global $ComboKey = IniRead("config.ini", "Keys", "ComboKey", "")
Global $phaseon = false

; Индексы скиллов - НЕ ТРОГАТЬ!
Global $1skillPosInd_X = 0.795
Global $2_5skillPosInd_X = 0.85
Global $3_6skillPosInd_X = 0.900

Global $TopSkillsPosInd_Y = 0.88
Global $DownSkillsPosInd_Y = 0.95
; Индексы скиллов - НЕ ТРОГАТЬ!
HotKeySet("w", "ChangePhase")
; Рабочий процесс программы
While 1
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
;Допустим, окно "Warcraft III" есть и это условие выполняется
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     if True Then;WinWaitActive("Warcraft III") Then

         if $phaseon Then
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;		 
    ;проверка отработки Вашей функии
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
             ConsoleWrite('NowMyFunction'&@CR)
            ;Send(2)
         endif

         if $1skill <> "" then HotKeySet($ComboKey&$1skill, "OnAutoCast1")

         if $2skill <> "" then HotKeySet($ComboKey&$2skill, "OnAutoCast2")

         if $3skill <> "" then HotKeySet($ComboKey&$3skill, "OnAutoCast3")

         if $5skill <> "" then HotKeySet($ComboKey&$5skill, "OnAutoCast5")

         if $6skill <> "" then HotKeySet($ComboKey&$6skill, "OnAutoCast6")

     EndIf

     ; Когда вышли из WarCraft
	 
	 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     ;Пока этот участок кода не выполняем
	 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	 
     if False Then;WinWaitNotActive("Warcraft III") Then

       if $1skill <> "" then HotKeySet($ComboKey&$1skill, "off")

       if $2skill <> "" then HotKeySet($ComboKey&$2skill, "off")

       if $3skill <> "" then HotKeySet($ComboKey&$3skill, "off")

       if $5skill <> "" then HotKeySet($ComboKey&$5skill, "off")

       if $6skill <> "" then HotKeySet($ComboKey&$6skill, "off")

     EndIf
	 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	 
;Дописал небольшую задержку
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     sleep(100)

WEnd

; Пустая функция, чтобы сбросить с кнопки бинд, пока не в WarCraft
func off()
EndFunc

func ChangePhase()
   $phaseon = not $phaseon
EndFunc

; Функции для клика правой по скиллам
Func OnAutoCast1()

   $cur_pos_mouse = MouseGetPos()
   MouseClick("right", $Resolution_X*$1skillPosInd_X, $Resolution_Y*$DownSkillsPosInd_Y, 1, 0)
   MouseMove($cur_pos_mouse[0], $cur_pos_mouse[1], 0)
EndFunc

Func OnAutoCast2()

   $cur_pos_mouse = MouseGetPos()
   MouseClick("right", $Resolution_X*$2_5skillPosInd_X, $Resolution_Y*$DownSkillsPosInd_Y, 1, 0)
   MouseMove($cur_pos_mouse[0], $cur_pos_mouse[1], 0)
EndFunc

Func OnAutoCast3()

   $cur_pos_mouse = MouseGetPos()
   MouseClick("right", $Resolution_X*$3_6skillPosInd_X, $Resolution_Y*$DownSkillsPosInd_Y, 1, 0)
   MouseMove($cur_pos_mouse[0], $cur_pos_mouse[1], 0)
EndFunc

Func OnAutoCast5()

   $cur_pos_mouse = MouseGetPos()
   MouseClick("right", $Resolution_X*$2_5skillPosInd_X, $Resolution_Y*$TopSkillsPosInd_Y, 1, 0)
   MouseMove($cur_pos_mouse[0], $cur_pos_mouse[1], 0)
EndFunc

Func OnAutoCast6()

   $cur_pos_mouse = MouseGetPos()
   MouseClick("right", $Resolution_X*$3_6skillPosInd_X, $Resolution_Y*$TopSkillsPosInd_Y, 1, 0)
   MouseMove($cur_pos_mouse[0], $cur_pos_mouse[1], 0)
EndFunc
Проверяйте, специально ничего практически не менял в Вашем коде, только лишь то, что бы выполнилось условие без "Warcraft III" и дописал небольшую паузу .
Уберите диалог запроса разрешения экрана, ведь его можно получить макросами "@DesktopHeight" и "@DesktopWidth" , если не предполагается работать с разрешением экрана отличным от реального.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
Krip1

Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
(подробнее), а обычный код соответственно в тег [code]
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Администратор.
 
Верх