1

Тема: AHK: W.o.T in World

Код уже раздутый и неказистый - но привожу полностью.
Программа выводит в чат игры "быстрые сообщения"
(типо тупо печатает по хоткею фразу).

Проблема же такая...
При первом запуске - вызывается Gui, где можно поменять фразы.
Затем, Gui должно вызываться через пункт меню в трее - но выдает ошибку.
Вроде как повторное определение переменных.
(Gui - в самом конце кода).

Немогу сообразить как этого избежать...

;#IfWinActive, W.o.T. Client ; хоткеи будут работать только в окне WoT
#MaxThreadsPerHotkey 1
#SingleInstance force ; Запрещает копии программы (можно закоментировать или отключить - "off")

;#MaxMem 1
State =

;=========================================
;Поиск файлов игры
;=========================================
Loop, HKEY_CLASSES_ROOT, Local Settings\Software\Microsoft\Windows\Shell\MuiCache, 1, 1
{
if a_LoopRegType = key
value =
else
{
RegRead, value
if ErrorLevel
value = *Ошибка*
}

if value = World of Tanks Launcher
Launcher = %A_LoopRegName%

if value = World of Tanks
WoTexe = %A_LoopRegName%

}
;=========================================
; Создаем Ярлык на рабочем столе
;=========================================

IfNotExist, %A_Desktop%\WoT.lnk ; Если нет ярлыка - создает
{

FileCreateShortcut, %A_ScriptFullPath%, %A_Desktop%\WoT.lnk, %A_WorkingDir%, "%A_ScriptFullPath%", Описание, %WoTexe%
;IniWrite, %WoTexe%, C:\My Shortcut.url, InternetShortcut, IconFile
;IniWrite, 0, C:\My Shortcut.url, InternetShortcut, IconIndex
}

;MsgBox %WoTexe%`n%Launcher% ; Для проверки переменных, убрать ";" в начале строки

;=========================================
; Ищем ini Файл и создаем дефолтный если не находим
;=========================================


IfNotExist, AHK WoT.ini ; Если файла ini не находит - создает, с днфолтными параметрами
{
FileAppend, [AHK Zero]`nnum0 = Не берите их базу! Добьем гадов!`nnum1 = Прикрывайте левый фланг`nnum2 = Прикрывайте центр`nnum3 = Прикрывайте правый фланг`nnum4 = ИЗВИНИ!`nnum5 = Сидим в засаде!`nnum6 = Кто рядом? Давай за мной! РАШ!`nnum7 = Левый фланг`nnum8 = Центр`nnum9 = Правый фланг`nnumdiv = Подсветите квадрат…`nnummul = ОТЪЕДЬ! Артиллерия стреляет!`nnumded = К своей базе`, скорее! Угроза захвата.`nnumsum = На их базу`, скорее! Берем базу!`nNumDot = Нас мало! На ражон не лезьте!`nNumEnt = Я свечу! Арты и ТТ не зевайте...`nNuLock = В гору! За мной!`n, AHK WoT.ini

Sleep 2000

gosub ReadAll
gosub Guiii

; ExitApp ; Выход из приложения
}
;=========================================

Menu, Tray, UseErrorLevel
menu, tray, Icon, %WoTexe%, 0, 1 ; меняем иконку в трее
Menu, Tray, Click, 1
Menu, Tray, Tip, WoT in World
Menu, Tray, MainWindow

Menu, tray, add  ; Добавить разделитель.
Menu, tray, add, Настройка, MenuSET  ; Добавить новый пункт.


;=========================================
;Печатаем справку по значениям клавишь (что бы печатало убрать ";" в начале строки)
;=========================================

;MsgBox, num0 = %num0%`nnum1 = %num1%`nnum2 = %num2%`nnum3 = %num3%`nnum4 = %num4%`nnum5 = %num5%`nnum6 = %num6%`nnum7 = %num7%`nnum8 = %num8%`nnum9 = %num9%`nnumdiv = %numdiv%`nnummul = %nummul%`nnumded = %numded%`nnumsum = %numsum%`nNumDot = %NumDot%`nNumEnt = %NumEnt%`nNuLock = %NuLock%`n

;=========================================
; Запускаем игру
;=========================================
IfWinNotExist, W.o.T. Client
Run %Launcher%
;Run, %A_Desktop%\World of Tanks.lnk
;Run,
WinWait, W.o.T. Client ;,, 3000
Sleep 10000

SetScrollLockState Off
SetNumLockState Off
SetCapsLockState Off

;=========================================
; Ждем выхода из игры, и закрываем скрипт
;========================================

Loop,
{
IfWinNotExist, W.o.T. Client
{
ExitApp
}
sleep, 5000
}

;=========================================
return

;=========================================
; Устанавливаем "хук" для данных клавишь
;=========================================

;Num 0
*$SC052::
print(num0)
return

;Num 1
*$SC04F::
print(num1)
return

;Num 2
*$SC050::
print(num2)
return

;Num 3
*$SC051::
print(num3)
return

;Num 4
*$SC04B::
print(num4)
return

;Num 5
*$SC04C::
print(num5)
return

;Num 6
*$SC04D::
print(num6)
return

;Num 7
*$SC047::
print(num7)
return

;Num 8
*$SC048::
print(num8)
return

;Num 9
*$SC049::
print(num9)
return

;Num /
*$SC135::
print(numdiv)
return

;Num *
*$SC037::
print(nummul)
return

;Num -
*$SC04A::
print(numded)
return

;Num +
*$SC04E::
print(numsum)
return

;Num .
*$SC053::
print(NumDot)
return

;Num Enter
*$SC11C::
print(NumEnt)
return

;Num Num Lock
*$SC145::
print(NuLock)
return

;Тильда `
*$SC029::

If State = ; если у переменной нет значения
  {
    State = 1 ; присвоим переменной новое значение
    ;MsgBox Первое действие
    Send, {q Down}
  }
Else ;if State = 1 ; условие: если переменная имеет значение 1
  {
    State = ; очищаем переменную, или если надо, присвоим ей иное значение
    ;MsgBox Второе действие ; производим действие
    Send, {q Up}
  }

return

XButton1::
SendPlay {CapsLock Down}0
Sleep 50
SendInput {CapsLock Up}
SetCapsLockState Off ; Отключаем CapsLock
Sleep 300
return

;XButton2::
;return

RWin::return
LWin::return

;=========================================
; Подпрограмма печати сообщения
;=========================================

print(string)
{
SendMessage, 0x50,, 0x4190419,, W.o.T. Client ; переключаем в русскую раскладку
SetCapsLockState Off ; Отключаем CapsLock
Sleep 100
SendPlay {Enter}{Raw}%string%
Sleep 100
SendInput {Enter}
Sleep 10000
}

MenuSET:
gosub ReadAll
Sleep 2500
gosub Guiii
return 
;=========================================
;=========================================
Guiii:
Gui, Add, Text, section, num0 
Gui, Add, Text,, num1
Gui, Add, Text,, num2
Gui, Add, Text,, num3
Gui, Add, Text,, num4
Gui, Add, Text,, num5
Gui, Add, Text,, num6
Gui, Add, Text,, num7
Gui, Add, Text,, num8
Gui, Add, Text,, num9

Gui, Add, Edit, vnum00 w350 ym, %num0% ; Опция ym начинает новую колонку элементов управления.
Gui, Add, Edit, vnum10 w350, %num1%
Gui, Add, Edit, vnum20 w350, %num2%
Gui, Add, Edit, vnum30 w350, %num3%
Gui, Add, Edit, vnum40 w350, %num4%
Gui, Add, Edit, vnum50 w350, %num5%
Gui, Add, Edit, vnum60 w350, %num6%
Gui, Add, Edit, vnum70 w350, %num7%
Gui, Add, Edit, vnum80 w350, %num8%
Gui, Add, Edit, vnum90 w350, %num9%
;=========================================

Gui, Add, Text, ym, numdiv
Gui, Add, Text,, num -
Gui, Add, Text,, num /
Gui, Add, Text,, num +
Gui, Add, Text,, Num *
Gui, Add, Text,, NumEnter
Gui, Add, Text,, NuLock

;=========================================


Gui, Add, Edit, vnumdiv0  ym w350, %numdiv%
Gui, Add, Edit, vnummul0 w350, %nummul%
Gui, Add, Edit, vnumded0 w350, %numded%
Gui, Add, Edit, vnumsum0 w350, %numsum%
Gui, Add, Edit, vNumDot0 w350, %NumDot%
Gui, Add, Edit, vNumEnt0 w350, %NumEnt%
Gui, Add, Edit, vNuLock0 w350, %NuLock%

;=========================================
Gui, Add, Button, default w150 h70, OK ; Метка ButtonOK (если она существует) будет запущена при нажатии кнопки.
Gui, Show, Center w900 h320, W.o.T. in World
WinWaitClose, W.o.T. in World
return ; Скрипт ожидает каких-нибудь действий пользователя.

GuiClose:
ButtonOK:
Gui, Submit ; Сохраняем входные данные пользователя в ассоциированной переменной каждого элемента управления.
gosub SaveAS
;MsgBox Вы ввели "%num0% %num1%".
;ExitApp
return

SaveAS:

num0 := num00
num1 := num10
num2 := num20
num3 := num30
num4 := num40
num5 := num50
num6 := num60
num7 := num70
num8 := num80
num9 := num90
numdiv := numdiv0
nummul := nummul0
numded := numded0
numsum := numsum0
NumDot := NumDot0
NumEnt := NumEnt0
NuLock := NuLock0

IniWrite, %num0%, AHK WoT.ini, AHK Zero, num0
IniWrite, %num1%, AHK WoT.ini, AHK Zero, num1
IniWrite, %num2%, AHK WoT.ini, AHK Zero, num2
IniWrite, %num3%, AHK WoT.ini, AHK Zero, num3
IniWrite, %num4%, AHK WoT.ini, AHK Zero, num4
IniWrite, %num5%, AHK WoT.ini, AHK Zero, num5
IniWrite, %num6%, AHK WoT.ini, AHK Zero, num6
IniWrite, %num7%, AHK WoT.ini, AHK Zero, num7
IniWrite, %num8%, AHK WoT.ini, AHK Zero, num8
IniWrite, %num9%, AHK WoT.ini, AHK Zero, num9
IniWrite, %numdiv%, AHK WoT.ini, AHK Zero, numdiv
IniWrite, %nummul%, AHK WoT.ini, AHK Zero, nummul
IniWrite, %numded%, AHK WoT.ini, AHK Zero, numded
IniWrite, %numsum%, AHK WoT.ini, AHK Zero, numsum
IniWrite, %NumDot%, AHK WoT.ini, AHK Zero, NumDot
IniWrite, %NumEnt%, AHK WoT.ini, AHK Zero, NumEnt
IniWrite, %NuLock%, AHK WoT.ini, AHK Zero, NuLock
return

ReadAll:
;=========================================
; Загрузка параметров из ini
;=========================================

IniRead, num0, AHK WoT.ini, AHK Zero, num0
IniRead, num1, AHK WoT.ini, AHK Zero, num1
IniRead, num2, AHK WoT.ini, AHK Zero, num2
IniRead, num3, AHK WoT.ini, AHK Zero, num3
IniRead, num4, AHK WoT.ini, AHK Zero, num4
IniRead, num5, AHK WoT.ini, AHK Zero, num5
IniRead, num6, AHK WoT.ini, AHK Zero, num6
IniRead, num7, AHK WoT.ini, AHK Zero, num7
IniRead, num8, AHK WoT.ini, AHK Zero, num8
IniRead, num9, AHK WoT.ini, AHK Zero, num9
IniRead, numdiv, AHK WoT.ini, AHK Zero, numdiv
IniRead, nummul, AHK WoT.ini, AHK Zero, nummul
IniRead, numded, AHK WoT.ini, AHK Zero, numded
IniRead, numsum, AHK WoT.ini, AHK Zero, numsum
IniRead, NumDot, AHK WoT.ini, AHK Zero, NumDot
IniRead, NumEnt, AHK WoT.ini, AHK Zero, NumEnt
IniRead, NuLock, AHK WoT.ini, AHK Zero, NuLock
return

;=========================================

2 (изменено: InFlames, 2011-06-26 11:05:28)

Re: AHK: W.o.T in World

Приводите тогда текст ошибки. Код большой, да еще и файлы какие-то создает. Запускать его никто не будет.
Предполагаю, что Вы пытаетесь 2 раза создать Gui.
Gui создается один раз в начале скрипта, в секции автовыполнения.
Затем это Gui может открываться командой

Gui, show

А закрываться

Gui, destroy

Только в этом случае не будет ошибок.

3

Re: AHK: W.o.T in World

InFlames
Вы совершенно правы.
Мало опыта с Gui. Даже такая мелочь приводит в замешательство.
Проблема решена.

Спасибо за помощь.