1 (изменено: Kiber, 2008-09-07 01:36:43)

Тема: AutoHotkey: Warcraft III

Возможности скрипта:
1. Отображает здоровье врагов и союзников (можно отключить).
2. Есть опция автозагрузки программы.
3. На кнопки мышки (3 снадартные на колесо мыши + 2 дополнительные) можно повесить любые сочетания клавиш. Я рекомендую использовать их для рюкзака.
4.1 Можно использовать горячие клавиши (Ctrl+Alt+O и Ctrl+Alt+P) для запуска соответственно оффициального и ПВПГН варкрафта.
4.2 При использовании этих горячих клавиш автоматически подгружается банлист (можно отключить).
5. Есть опции запуска варкрафта в оконном режиме, OpenGL и т.н. Software Transform and Lighting Video.
6. Есть функционал анализа правильности путей и названий файлов. Пока в тестовом режиме.
7. Возможность генерировать необходимые файлы реестра нажатием одной клавиши.

Где скачать (актуальный релиз):
Исполняемый файл: Скачать.
Исходный код: Скачать.

Что происходит при нажатии хоткеев Ctrl+Alt+O и Ctrl+Alt+P:
Ctrl+Alt+O: Сначала просходит запуск банлиста(если включен), затем прописываются официальные сервера и логин при помощи reg-файла, затем запускается сам варкрафт.
Ctrl+Alt+P: Сначала просходит запуск банлиста(если включен), затем прописываются пвпгн сервера и логин при помощи reg-файла, затем запускается пвпгн-лаунчер.

Внимание!
*: Игра должна быть прописана в реестре. (Грубо говоря, если варик запускается то игра прописана в реестре). В папке варкрафта должны присутствовать файлы Frozen Throne.exe - для запуска оффициалки и w3l.exe - ПВПГН лаунчер (если вы используете ПВПГН сервера).
*: Что-бы работал запуск банлиста, он должен находиться в папке варкрафта. Папка должна называться WC3Banlist, а файл запуска WC3Banlist.exe.
*: Если вы используете и ОФФ и ПВПГН, то что-бы гейтвеи с логином прописывались, надо один раз сделать файлы реестра. Делаются они так:
1. Один раз прописываете гейтвеи любой сподручной программой.
2. Запускаете варкрафт, заходите на сервер, выходите.
3. В скрипте нажимаете кнопку "Сгенерировать файл реестра под ...".
Пункты с 1 по 3 делаете два раза - один раз создаете под Офицалку, другой  раз - под ПВПГН.
Рассказываю зачем мне вообще это понадобилось: одно время я активно игра в варкрафт и на пвпгн и на оффе. Под разными логинами. А фишка в том что когда играешь в офф, то он затирает ПВПГН гейтвеи, оставляя только офф. Неудобно каждый раз забивать гейтвеи по новой, поэтому я выгрузил эти файлы реестра и включил автопрописывание в свой скрипт. Ну и до кучи там много настроек сохраняется (в том числе логины, и практически все настройки варкрафта. Фактически, вы можете играть на разных серверах под разными разрешениями экрана, автоматизировав весь процесс до одной кнопки). Довольно удобно.

Скриншоты:
http://manch.naxx.ru/files/kahk/ScreenShot.png

Спасибо:
Ludens, взята часть скрипта определяющая рускую раскладку.

Обсуждение, предложения, багрепорты и пожелания:
Здесь

Проекту требуется новый разработчик!
Если ты умеешь писать скрипты, у тебя есть время, тебя заинтересовал проект и ты хочешь его развивать - тогда напиши мне.
Я для себя создал тот функцонал который мне был нужен, поэтому на данном этапе не могу больше развивать проект.

2

Re: AutoHotkey: Warcraft III

v. 1.01:
- Появилась кнопка проверки правильности всех путей и существования необходимых файлов.
- Появилась возможность устанавливать/снимать галочку видимости здоровья крипов.
- Теперь настройки вызываются и при клике левой кнопкой на иконке в трее.
- Появилась галочка автозапуска программы.
- Добавились кнопки для генерации файлов реестра под офицалку/пвпгн.
- Появилась возможность выбрать: будет-ли загружаться банлист, или нет.
- Появились дополнительные опции запуска варкрафта (-opengl, -window, -swtnl).

3

Re: AutoHotkey: Warcraft III

Версия скрипта 1.01.

; Тема на форуме http://forum.script-coding.com/viewtopic.php?pid=11988
; Обсуждение http://forum.script-coding.com/viewtopic.php?id=435

#SingleInstance force        ;force a single instance
                            ;запретить запуск нескольких копий программы
#HotkeyInterval 0        ;disable the warning dialog if a key is held down
                        ;устанавливает частоту активации горячих клавиш
#InstallKeybdHook        ;Forces the unconditional installation of the keyboard hook 
                        ;Безусловно устанавливает обработчик клавиатурных прерываний
#InstallMouseHook        ;
                        ;Безусловно устанавливает обработчик прерываний для мыши
#UseHook On            ;might increase responsiveness of hotkeys
                    ;заставляет обработчик прерываний использовать все горячие клавиши
#MaxThreads 20            ;use 20 (the max) instead of 10 threads
                        ;Задает максимальное количество одновременно исполняемых потоков
SetBatchLines, -1        ;makes the script run at max speed
                        ;Определяет, как быстро будет выполняться скрипт (влияет на коэффициент загрузки центрального процессора)
SetKeyDelay , -1, -1        ;faster response (might be better with -1, 0)
                            ;Задает задержку после каждого нажатия клавиши, посланного командой Send или ControlSend.

;======== Изменяет иконку в трее на иконку варкрафта ========
regread, war, HKEY_CURRENT_USER, Software\Blizzard Entertainment\Warcraft III, Program ; читаем из реестра путь до варкрафта
regread, war3path, HKEY_CURRENT_USER, Software\Blizzard Entertainment\Warcraft III, InstallPathX ; эта переменная будет использоваться дальше
menu, tray, Icon, %War%, 1, 1 ; меняем иконку

GoSub, GenerateGui1
;GoSub, HideGui1
GoSub, GenerateGui2
GoSub, CheckCorrectly
GoSub, HideGui2
GoSub, ReadConfig
GoSub, CheckErrorsAndLoadDefaults
GoSub, RefreshGui1
GoSub, SetHotkeys
GoSub, TrayInit
wasalttabed := 1 ; 0 - нужные клавиши ("[" и "]") зажаты, 1 - в альттабе
SetTimer, timer_Warcraft, 500 ; 500 мс = 0.5 секунды
; =====================     global Hotkeys          ============================

^!o:: ; ctrl+alt+o - OFF
    ; определяем параметры запуска
    GuiControlGet, WINDOWED
    GuiControlGet, OPENGL
    GuiControlGet, SWTNL
    param = ""
    If (WINDOWED = 1)
      param := "-window"
    If (OPENGL = 1)
      param := "" param " -opengl"
    If (SWTNL = 1)
      param := "" param " -swtnl"

    Run, %windir%\regedit.exe /s "%war3path%\off.reg" ; прописываем офф гейтвеи
    GoSub, load_banlist
    Process, Exist, war3.exe ; проверить существование процесса
    If ErrorLevel = 0 ; если Warcraft не запущен, то...
      {
        ; запускаем оффициальный варкрафт
        Run, %war3path%\Frozen Throne.exe %param%
      }
Return 

^!p:: ; ctrl+alt+p - PVPGN
    ; определяем параметры запуска
    GuiControlGet, WINDOWED
    GuiControlGet, OPENGL
    GuiControlGet, SWTNL
    param = ""
    If (WINDOWED = 1)
      param := "-window"
    If (OPENGL = 1)
      param := "" param " -opengl"
    If (SWTNL = 1)
      param := "" param " -swtnl"

    Run, %windir%\regedit.exe /s "%war3path%\pvpgn.reg" ; прописываем пвпгн гейтвеи
    GoSub, load_banlist
    Process, Exist, war3.exe ; проверить существование процесса
    If ErrorLevel = 0 ; если Warcraft не запущен, то...
      {
         ; запускаем пвпгн варкрафт лаунчер
        Run, %war3path%\w3l.exe %param%, %war3path%\
      }
Return  

load_banlist:
    GuiControlGet, runbanlist
    If (runbanlist = 1)
    {
        Process, Exist, WC3Banlist.exe ; проверить существование процесса banlist'a
        If ErrorLevel = 0 ; если Banlist не запущен, то...
        {
            IfExist, %war3path%\WC3Banlist\WC3Banlist.exe
            {
                Run, %war3path%\WC3Banlist\WC3Banlist.exe             ; запускаем banlist, его папка находится в папке варкрафта и называется WC3Banlist
                WinWait, ahk_class TWC3Banlist_Main, ,10              ; ждем пока он прогрузится (максимум 10 сек) Если банлист не используем, надо улучшить проверку чтобы не ждать 10 сек
                WinActivate, ahk_class TWC3Banlist_Main               ; повторная проверка на то что банлист прогрузился
                WinWaitActive, ahk_class TWC3Banlist_Main, ,10        ; (10 сек)
            }
        }
    }
Return

TrayInit:
    Menu, TRAY, Add, 
    Menu, TRAY, Add, Настройки, ShowGui1
    Menu, TRAY, Default, Настройки
Return

timer_Warcraft:
  ifWinActive, ahk_class Warcraft III ; если варик активен
  {
    if (wasalttabed = 1) ; Дополнительная и очень эффективная проверка в чате или играем
    {
      wasalttabed := 0
      ; Определяем раскладку
      WinGet, WID, ID, A
      WT := DllCall("GetWindowThreadProcessId", "UInt", WID, "UInt", 0)
      LID := DllCall("GetKeyboardLayout", "UInt", WT)
      Russian := LID = 68748313 ? 1 : 0
      ; Если раскладка - Русская
      if Russian 
      {
          if (showhp1 = 1)
            Send, {х Down}
          if (showhp2 = 1)
            Send, {ъ Down}
      }
      else
      {
          if (showhp1 = 1)
            Send, {[ Down}
          if (showhp2 = 1)
            Send, {] Down}
      }
    }
  }
  else
  {
    wasalttabed := 1
  }
Return ; end of timer_Warcraft 

; =============================================================  
; ======================== ini SECTION ========================  
; =============================================================  

ReadConfig:
    Gui, 1:Submit, NoHide
    ;showhp1 = 1
    ;showhp2 = 1
    IniRead, showhp1, %A_ScriptDir%\kahk.ini, Options, showhp1
    IniRead, showhp2, %A_ScriptDir%\kahk.ini, Options, showhp2
    IniRead, hkoff, %A_ScriptDir%\kahk.ini, Options, hkoff
    IniRead, hkpvpgn, %A_ScriptDir%\kahk.ini, Options, hkpvpgn
    IniRead, usexmouse1, %A_ScriptDir%\kahk.ini, Options, usexmouse1
    IniRead, keyxmouse1, %A_ScriptDir%\kahk.ini, Options, keyxmouse1
    IniRead, usexmouse2, %A_ScriptDir%\kahk.ini, Options, usexmouse2
    IniRead, keyxmouse2, %A_ScriptDir%\kahk.ini, Options, keyxmouse2
    IniRead, usescrollup, %A_ScriptDir%\kahk.ini, Options, usescrollup
    IniRead, keyscrollup, %A_ScriptDir%\kahk.ini, Options, keyscrollup
    IniRead, usescrolldown, %A_ScriptDir%\kahk.ini, Options, usescrolldown
    IniRead, keyscrolldown, %A_ScriptDir%\kahk.ini, Options, keyscrolldown
    IniRead, usemouse3, %A_ScriptDir%\kahk.ini, Options, usemouse3
    IniRead, keymouse3, %A_ScriptDir%\kahk.ini, Options, keymouse3
    IniRead, autorun, %A_ScriptDir%\kahk.ini, Options, autorun
    IniRead, runbanlist, %A_ScriptDir%\kahk.ini, Options, runbanlist
    IniRead, WINDOWED, %A_ScriptDir%\kahk.ini, Options, WINDOWED
    IniRead, OPENGL, %A_ScriptDir%\kahk.ini, Options, OPENGL
    IniRead, SWTNL, %A_ScriptDir%\kahk.ini, Options, SWTNL
Return

CheckErrorsAndLoadDefaults:
  if showhp1 = ERROR
    showhp1 := 1
  if showhp2 = ERROR
    showhp2 := 1
  if hkoff = ERROR
    hkoff := "^!S"
  if hkpvpgn = ERROR
    hkpvpgn := "^!W"
  if usexmouse1 = ERROR
    usexmouse1 := 1
  if keyxmouse1 = ERROR
    keyxmouse1 := "Numpad4"
  if usexmouse2 = ERROR
    usexmouse2 := 1
  if keyxmouse2 = ERROR
    keyxmouse2 := "Numpad7"
  if usescrollup = ERROR
    usescrollup := 1
  if keyscrollup = ERROR
    keyscrollup := "Numpad5"
  if usescrolldown = ERROR
    usescrolldown := 1
  if keyscrolldown = ERROR
    keyscrolldown := "Numpad2"
  if usemouse3 = ERROR
    usemouse3 := 1
  if keymouse3 = ERROR
    keymouse3 := "Numpad8"
  if autorun = ERROR
    autorun := 1
  if runbanlist = ERROR
    runbanlist := 1
  if WINDOWED = ERROR
    WINDOWED := 0
  if OPENGL = ERROR
    OPENGL := 0
  if SWTNL = ERROR
    SWTNL := 0
Return

SaveConfig:
    Gui, 1:Submit, NoHide
    IniWrite, %showhp1%, %A_ScriptDir%\kahk.ini, Options, showhp1
    IniWrite, %showhp2%, %A_ScriptDir%\kahk.ini, Options, showhp2
    IniWrite, %hkoff%, %A_ScriptDir%\kahk.ini, Options, hkoff
    IniWrite, %hkpvpgn%, %A_ScriptDir%\kahk.ini, Options, hkpvpgn
    IniWrite, %usexmouse1%, %A_ScriptDir%\kahk.ini, Options, usexmouse1
    IniWrite, %keyxmouse1%, %A_ScriptDir%\kahk.ini, Options, keyxmouse1
    IniWrite, %usexmouse2%, %A_ScriptDir%\kahk.ini, Options, usexmouse2
    IniWrite, %keyxmouse2%, %A_ScriptDir%\kahk.ini, Options, keyxmouse2
    IniWrite, %usescrollup%, %A_ScriptDir%\kahk.ini, Options, usescrollup
    IniWrite, %keyscrollup%, %A_ScriptDir%\kahk.ini, Options, keyscrollup
    IniWrite, %usescrolldown%, %A_ScriptDir%\kahk.ini, Options, usescrolldown
    IniWrite, %keyscrolldown%, %A_ScriptDir%\kahk.ini, Options, keyscrolldown
    IniWrite, %usemouse3%, %A_ScriptDir%\kahk.ini, Options, usemouse3
    IniWrite, %keymouse3%, %A_ScriptDir%\kahk.ini, Options, keymouse3
    IniWrite, %autorun%, %A_ScriptDir%\kahk.ini, Options, autorun
    IniWrite, %runbanlist%, %A_ScriptDir%\kahk.ini, Options, runbanlist
    IniWrite, %WINDOWED%, %A_ScriptDir%\kahk.ini, Options, WINDOWED
    IniWrite, %OPENGL%, %A_ScriptDir%\kahk.ini, Options, OPENGL
    IniWrite, %SWTNL%, %A_ScriptDir%\kahk.ini, Options, SWTNL
    GoSub, SetHotkeys
Return

; =============================================================  
; ======================== Gui SECTION ========================  
; =============================================================  

GenerateGui1:
  Gui, 1:Add, GroupBox, x6 y7 w310 h50 , Показывать здоровье
  Gui, 1:Add, CheckBox, x16 y27 w140 h20 vshowhp1 gshowhp1label, союзников
  Gui, 1:Add, CheckBox, x166 y27 w140 h20 vshowhp2 gshowhp2label, врагов
  Gui, 1:Add, CheckBox, x6 y67 w310 h20 vautorun gautorunlabel, Автозапуск программы
  Gui, 1:Add, CheckBox, x6 y97 w310 h20 vrunbanlist, Запускать банлист
  Gui, 1:Add, CheckBox, x6 y127 w200 h20 vusexmouse1 gSetHotkeys, Использовать X mouse button 1
  Gui, 1:Add, Hotkey, x216 y127 w100 h20 vkeyxmouse1 gSetHotkeys, 
  Gui, 1:Add, CheckBox, x6 y157 w200 h20 vusexmouse2 gSetHotkeys, Использовать X mouse button 2
  Gui, 1:Add, Hotkey, x216 y157 w100 h20 vkeyxmouse2 gSetHotkeys, 
  Gui, 1:Add, CheckBox, x6 y187 w200 h20 vusescrollup gSetHotkeys, Использовать колесо вверх
  Gui, 1:Add, Hotkey, x216 y187 w100 h20 vkeyscrollup gSetHotkeys, 
  Gui, 1:Add, CheckBox, x6 y217 w200 h20 vusescrolldown gSetHotkeys, Использовать колесо вниз
  Gui, 1:Add, Hotkey, x216 y217 w100 h20 vkeyscrolldown gSetHotkeys, 
  Gui, 1:Add, CheckBox, x6 y247 w200 h30 vusemouse3 gSetHotkeys, Использовать среднюю кнопку мыши
  Gui, 1:Add, Hotkey, x216 y247 w100 h30 vkeymouse3 gSetHotkeys, 
  Gui, 1:Add, Text, x6 y287 w310 h20 , Клавиша запуска офф. варкрафта: Ctrl+Alt+O
  Gui, 1:Add, Text, x6 y307 w310 h20 , Клавиша запуска не-офф. варкрафта: Ctrl+Alt+P
  Gui, 1:Add, GroupBox, x6 y337 w310 h120 , Ключи запуска:
  Gui, 1:Add, CheckBox, x16 y357 w260 h20 vWINDOWED, Windowed Mode
  Gui, 1:Add, CheckBox, x16 y387 w260 h20 vOPENGL, OpenGL Video Mode
  Gui, 1:Add, CheckBox, x16 y417 w260 h20 vSWTNL, Software Transform and Lighting Video Mode
  Gui, 1:Add, Button, x6 y467 w310 h20 gCheckCorrectly, Проверить пути
  Gui, 1:Add, Button, x6 y487 w310 h20 gGenerateRegTFT, Сгенерировать файл реестра под оффициалку
  Gui, 1:Add, Button, x6 y507 w310 h20 gGenerateRegPVPGN, Сгенерировать файл реестра под ПВПГН
  Gui, 1:Add, Button, x6 y537 w80 h30 gSaveConfig, Сохранить
  Gui, 1:Add, Button, x96 y537 w150 h30 gHideGui1, Свернуть
  Gui, 1:Add, Button, x256 y537 w60 h30 gExitSub, Закрыть
  Gui, 1:Show, x181 y111 h579 w329, Kiber's autohotkey script for Warcraft 3
Return

GenerateGui2:
  Gui, 2:Add, Button, x46 y7 w230 h20 gCheckCorrectly, Обновить
  Gui, 2:Add, Text, x6 y37 w310 h30 vTextBanlistCheck, 
  Gui, 2:Add, Text, x6 y77 w310 h30 vTextTFTCheck, 
  Gui, 2:Add, Text, x6 y117 w310 h30 vTextPVPGNCheck, 
  Gui, 2:Add, Text, x6 y157 w310 h30 vTextRegTFTCheck, 
  Gui, 2:Add, Text, x6 y197 w310 h30 vTextRegPVPGNCheck, 
  Gui, 2:Add, Button, x6 y237 w310 h30 gHideGui2, Закрыть
  Gui, 2:Show, x131 y91 h278 w328, Результат проверки путей
Return

; refreshes Gui. Kiber is a noob, and he does not know other methods
RefreshGui1:
  GuiControl, 1: , showhp1, %showhp1%
  GuiControl, 1: , showhp2, %showhp2%
  GuiControl, 1: , hkoff, %hkoff%
  GuiControl, 1: , hkpvpgn, %hkpvpgn%
  GuiControl, 1: , usexmouse1, %usexmouse1%
  GuiControl, 1: , keyxmouse1, %keyxmouse1%
  GuiControl, 1: , usexmouse2, %usexmouse2%
  GuiControl, 1: , keyxmouse2, %keyxmouse2%
  GuiControl, 1: , usescrollup, %usescrollup%
  GuiControl, 1: , keyscrollup, %keyscrollup%
  GuiControl, 1: , usescrolldown, %usescrolldown%
  GuiControl, 1: , keyscrolldown, %keyscrolldown%
  GuiControl, 1: , usemouse3, %usemouse3%
  GuiControl, 1: , keymouse3, %keymouse3%
  GuiControl, 1: , autorun, %autorun%
  GuiControl, 1: , runbanlist, %runbanlist%
  GuiControl, 1: , WINDOWED, %WINDOWED%
  GuiControl, 1: , OPENGL, %OPENGL%
  GuiControl, 1: , SWTNL, %SWTNL%
  Gui, 1:Submit, NoHide
Return

RefreshGui2:
  GuiControl, 2: , TextBanlistCheck, %TextBanlistCheck%
  GuiControl, 2: , TextTFTCheck, %TextTFTCheck%
  GuiControl, 2: , TextPVPGNCheck, %TextPVPGNCheck%
  GuiControl, 2: , TextRegTFTCheck, %TextRegTFTCheck%
  GuiControl, 2: , TextRegPVPGNCheck, %TextRegPVPGNCheck%
  Gui, 2:Submit, NoHide
Return

ShowGui1:
  Gui, 1:Show
Return

ShowGui2:
  Gui, 2:Show
Return

HideGui1:
  Gui, 1:Hide
Return

HideGui2:
  Gui, 2:Hide
Return

GuiClose:
  Gui, 1:Hide
  Gui, 2:Hide
Return

; =============================================================  
; ======================== Main  SECTION ======================  
; =============================================================  

SetHotkeys:
  GuiControlGet, usexmouse1
  GuiControlGet, usexmouse2
  GuiControlGet, usemouse3
  GuiControlGet, usescrollup
  GuiControlGet, usescrolldown
  GuiControlGet, showhp1
  GuiControlGet, showhp2

  #IfWinActive, ahk_class Warcraft III

    XButton1::
      if (usexmouse1 = 1)
      {
        Send {%keyxmouse1%}
      }
      else
      {
        Send {XButton1}
      }
    Return

    XButton2::
      if (usexmouse2 = 1)
      {
        Send {%keyxmouse2%}
      }
      else
      {
        Send {XButton2}
      }
    Return

    MButton::
      if (usemouse3 = 1)
      {
        Send {%keymouse3%}
      }
      else
      {
        Send {MButton}
      }
    Return

    WheelUp::
      if (usescrollup = 1)
      {
        Send {%keyscrollup%}
      }
      else
      {
        Send {WheelUp}
      }
    Return

    WheelDown::
      if (usescrolldown = 1)
      {
        Send {%keyscrolldown%}
      }
      else
      {
        Send {WheelDown}
      }
    Return

  if (showhp1 = 1)
    *[::
        WinGet, WID, ID, A ; Определяем раскладку
        WT := DllCall("GetWindowThreadProcessId", "UInt", WID, "UInt", 0)
        LID := DllCall("GetKeyboardLayout", "UInt", WT)
        Russian := LID = 68748313 ? 1 : 0
        if Russian ; Если раскладка - Русская
          { 
          Send, {х Up}
          GetKeyState, state, Shift
          if state = D
                Send, +{х Down}
          else
                Send, {х Down}
          }
        else
          {
          Send, {[ Up}
          GetKeyState, state, Shift
          if state = D
                Send, +{[ Down}
          else
                Send, {[ Down}
          }
    return
    
  if (showhp2 = 1)
    *]::
        WinGet, WID, ID, A
        WT := DllCall("GetWindowThreadProcessId", "UInt", WID, "UInt", 0)
        LID := DllCall("GetKeyboardLayout", "UInt", WT)
        Russian := LID = 68748313 ? 1 : 0
        if Russian
          { 
          Send, {ъ Up}
          GetKeyState, state, Shift
          if state = D
                Send, +{ъ Down}
            else
                Send, {ъ Down}
          }
        else
          {
          Send, {] Up}
          GetKeyState, state, Shift
          if state = D
                Send, +{] Down}
            else
                Send, {] Down}
          }
    return
    
  Return
Return

CheckCorrectly:
  TextBanlistCheck := "Путь к банлисту найден"
  TextTFTCheck := "Путь к Frozen Throne.exe найден"
  TextPVPGNCheck := "Путь к w3l.exe найден"
  TextRegTFTCheck := "Файл реестра off.reg найден"
  TextRegPVPGNCheck := "Файл реестра pvpgn.reg найден"  
  GuiControl, 2: -c +cGreen, TextBanlistCheck,
  GuiControl, 2: -c +cGreen, TextTFTCheck,
  GuiControl, 2: -c +cGreen, TextPVPGNCheck,
  GuiControl, 2: -c +cGreen, TextRegTFTCheck,
  GuiControl, 2: -c +cGreen, TextRegPVPGNCheck,

  IfNotExist, %war3path%\WC3Banlist\WC3Banlist.exe
  {
    TextBanlistCheck := "Не обнаружен Банлист. Папка банлиста должна находиться в папке варкрафта (" war3path ") и называться WC3Banlist" 
    GuiControl, 2: +cRed, TextBanlistCheck,
  }
  IfNotExist, %war3path%+\Frozen Throne.exe
  {
    TextTFTCheck := "Не обнаружен Frozen Throne.exe по адресу (" war3path "). Возможно, требуется переустановить игру" 
    GuiControl, 2: +cRed, TextTFTCheck,
  }
  IfNotExist, %war3path%\w3l.exe
  {
    TextPVPGNCheck := "Не обнаружен PVPGN-лаунчер w3l.exe по адресу (" war3path "). Вероятно, он вам не нужен."  
    GuiControl, 2: +cRed, TextPVPGNCheck,
  
  }
  IfNotExist, %war3path%\off.reg
  {
    TextRegTFTCheck := "Не обнаружен файл реестра off.reg по адресу (" war3path "). Вероятно, он вам не нужен."  
    GuiControl, 2: +cRed, TextRegTFTCheck,
  }
  IfNotExist, %war3path%\pvpgn.reg
  {
    TextRegPVPGNCheck := "Не обнаружен файл реестра pvpgn.reg по адресу (" war3path "). Вероятно, он вам не нужен."
    GuiControl, 2: +cRed, TextRegPVPGNCheck,
  }

  GoSub, RefreshGui2
  GoSub, ShowGui2
Return


GenerateRegTFT:
  Run, reg export "HKCU\Software\Blizzard Entertainment\Warcraft III" %war3path%\off.reg
  MsgBox, 0,, Файл сгенерирован
  GoSub, CheckCorrectly
Return

GenerateRegPVPGN:
  Run, reg export "HKCU\Software\Blizzard Entertainment\Warcraft III" %war3path%\pvpgn.reg
  MsgBox, 0,, Файл сгенерирован
  GoSub, CheckCorrectly
Return

showhp1label:
 Gosub, SetHotkeys
Return

showhp2label:
 Gosub, SetHotkeys
Return

autorunlabel:
  GuiControlGet, autorun
    if (autorun = 1)
    {
    RegWrite, REG_SZ, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Run, KAHK, %A_ScriptFullPath%
  }
  else
  {
    RegDelete, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Run, KAHK
  }
Return
    
ExitSub:
;  MsgBox, 4,, Сохранить настройки?
;  IfMsgBox Yes
    GoSub, SaveConfig
ExitApp ; Единственная возможность убийства для скрипта OnExit - использовать ExitApp

Во вложении поста - скомпилированный вариант.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

4

Re: AutoHotkey: Warcraft III

v. 1.02:
- исправлена ошибка с параметром автозапуска
- при автозапуске скрипт будет автоматически сворачиваться в трей

; Тема на форуме http://forum.script-coding.com/viewtopic.php?pid=11988
; Обсуждение http://forum.script-coding.com/viewtopic.php?id=435

#SingleInstance force        ;force a single instance
                            ;запретить запуск нескольких копий программы
#HotkeyInterval 0        ;disable the warning dialog if a key is held down
                        ;устанавливает частоту активации горячих клавиш
#InstallKeybdHook        ;Forces the unconditional installation of the keyboard hook 
                        ;Безусловно устанавливает обработчик клавиатурных прерываний
#InstallMouseHook        ;
                        ;Безусловно устанавливает обработчик прерываний для мыши
#UseHook On            ;might increase responsiveness of hotkeys
                    ;заставляет обработчик прерываний использовать все горячие клавиши
#MaxThreads 20            ;use 20 (the max) instead of 10 threads
                        ;Задает максимальное количество одновременно исполняемых потоков
SetBatchLines, -1        ;makes the script run at max speed
                        ;Определяет, как быстро будет выполняться скрипт (влияет на коэффициент загрузки центрального процессора)
SetKeyDelay , -1, -1        ;faster response (might be better with -1, 0)
                            ;Задает задержку после каждого нажатия клавиши, посланного командой Send или ControlSend.

;======== Изменяет иконку в трее на иконку варкрафта ========
regread, war, HKEY_CURRENT_USER, Software\Blizzard Entertainment\Warcraft III, Program ; читаем из реестра путь до варкрафта
regread, war3path, HKEY_CURRENT_USER, Software\Blizzard Entertainment\Warcraft III, InstallPathX ; эта переменная будет использоваться дальше
menu, tray, Icon, %War%, 1, 1 ; меняем иконку

GoSub, GenerateGui1
;GoSub, HideGui1
GoSub, GenerateGui2
GoSub, CheckCorrectly
GoSub, HideGui2
GoSub, ReadConfig
GoSub, CheckErrorsAndLoadDefaults
GoSub, RefreshGui1
GoSub, SetHotkeys
GoSub, TrayInit
GoSub, autorunlabel
GoSub, CheckParameters
wasalttabed := 1 ; 0 - нужные клавиши ("[" и "]") зажаты, 1 - в альттабе
SetTimer, timer_Warcraft, 500 ; 500 мс = 0.5 секунды


; =====================     global Hotkeys          ============================
^!o:: ; ctrl+alt+o - OFF
    ; определяем параметры запуска
    GuiControlGet, WINDOWED
    GuiControlGet, OPENGL
    GuiControlGet, SWTNL
    param = ""
    If (WINDOWED = 1)
      param := "-window"
    If (OPENGL = 1)
      param := "" param " -opengl"
    If (SWTNL = 1)
      param := "" param " -swtnl"

    Run, %windir%\regedit.exe /s "%war3path%\off.reg" ; прописываем офф гейтвеи
    GoSub, load_banlist
    Process, Exist, war3.exe ; проверить существование процесса
    If ErrorLevel = 0 ; если Warcraft не запущен, то...
      {
        ; запускаем оффициальный варкрафт
        Run, %war3path%\Frozen Throne.exe %param%
      }
Return 

^!p:: ; ctrl+alt+p - PVPGN
    ; определяем параметры запуска
    GuiControlGet, WINDOWED
    GuiControlGet, OPENGL
    GuiControlGet, SWTNL
    param = ""
    If (WINDOWED = 1)
      param := "-window"
    If (OPENGL = 1)
      param := "" param " -opengl"
    If (SWTNL = 1)
      param := "" param " -swtnl"

    Run, %windir%\regedit.exe /s "%war3path%\pvpgn.reg" ; прописываем пвпгн гейтвеи
    GoSub, load_banlist
    Process, Exist, war3.exe ; проверить существование процесса
    If ErrorLevel = 0 ; если Warcraft не запущен, то...
      {
         ; запускаем пвпгн варкрафт лаунчер
        Run, %war3path%\w3l.exe %param%, %war3path%\
      }
Return  

load_banlist:
    GuiControlGet, runbanlist
    If (runbanlist = 1)
    {
        Process, Exist, WC3Banlist.exe ; проверить существование процесса banlist'a
        If ErrorLevel = 0 ; если Banlist не запущен, то...
        {
            IfExist, %war3path%\WC3Banlist\WC3Banlist.exe
            {
                Run, %war3path%\WC3Banlist\WC3Banlist.exe             ; запускаем banlist, его папка находится в папке варкрафта и называется WC3Banlist
                WinWait, ahk_class TWC3Banlist_Main, ,10              ; ждем пока он прогрузится (максимум 10 сек) Если банлист не используем, надо улучшить проверку чтобы не ждать 10 сек
                WinActivate, ahk_class TWC3Banlist_Main               ; повторная проверка на то что банлист прогрузился
                WinWaitActive, ahk_class TWC3Banlist_Main, ,10        ; (10 сек)
            }
        }
    }
Return

TrayInit:
    Menu, TRAY, Add, 
    Menu, TRAY, Add, Настройки, ShowGui1
    Menu, TRAY, Default, Настройки
Return

timer_Warcraft:
  ifWinActive, ahk_class Warcraft III ; если варик активен
  {
    if (wasalttabed = 1) ; Дополнительная и очень эффективная проверка в чате или играем
    {
      wasalttabed := 0
      ; Определяем раскладку
      WinGet, WID, ID, A
      WT := DllCall("GetWindowThreadProcessId", "UInt", WID, "UInt", 0)
      LID := DllCall("GetKeyboardLayout", "UInt", WT)
      Russian := LID = 68748313 ? 1 : 0
      ; Если раскладка - Русская
      if Russian 
      {
          if (showhp1 = 1)
            Send, {х Down}
          if (showhp2 = 1)
            Send, {ъ Down}
      }
      else
      {
          if (showhp1 = 1)
            Send, {[ Down}
          if (showhp2 = 1)
            Send, {] Down}
      }
    }
  }
  else
  {
    wasalttabed := 1
  }
Return ; end of timer_Warcraft 

; =============================================================  
; ======================== ini SECTION ========================  
; =============================================================  

ReadConfig:
    Gui, 1:Submit, NoHide
    ;showhp1 = 1
    ;showhp2 = 1
    IniRead, showhp1, %A_ScriptDir%\kahk.ini, Options, showhp1
    IniRead, showhp2, %A_ScriptDir%\kahk.ini, Options, showhp2
    IniRead, hkoff, %A_ScriptDir%\kahk.ini, Options, hkoff
    IniRead, hkpvpgn, %A_ScriptDir%\kahk.ini, Options, hkpvpgn
    IniRead, usexmouse1, %A_ScriptDir%\kahk.ini, Options, usexmouse1
    IniRead, keyxmouse1, %A_ScriptDir%\kahk.ini, Options, keyxmouse1
    IniRead, usexmouse2, %A_ScriptDir%\kahk.ini, Options, usexmouse2
    IniRead, keyxmouse2, %A_ScriptDir%\kahk.ini, Options, keyxmouse2
    IniRead, usescrollup, %A_ScriptDir%\kahk.ini, Options, usescrollup
    IniRead, keyscrollup, %A_ScriptDir%\kahk.ini, Options, keyscrollup
    IniRead, usescrolldown, %A_ScriptDir%\kahk.ini, Options, usescrolldown
    IniRead, keyscrolldown, %A_ScriptDir%\kahk.ini, Options, keyscrolldown
    IniRead, usemouse3, %A_ScriptDir%\kahk.ini, Options, usemouse3
    IniRead, keymouse3, %A_ScriptDir%\kahk.ini, Options, keymouse3
    IniRead, autorun, %A_ScriptDir%\kahk.ini, Options, autorun
    IniRead, runbanlist, %A_ScriptDir%\kahk.ini, Options, runbanlist
    IniRead, WINDOWED, %A_ScriptDir%\kahk.ini, Options, WINDOWED
    IniRead, OPENGL, %A_ScriptDir%\kahk.ini, Options, OPENGL
    IniRead, SWTNL, %A_ScriptDir%\kahk.ini, Options, SWTNL
Return

CheckErrorsAndLoadDefaults:
  if showhp1 = ERROR
    showhp1 := 1
  if showhp2 = ERROR
    showhp2 := 1
  if hkoff = ERROR
    hkoff := "^!S"
  if hkpvpgn = ERROR
    hkpvpgn := "^!W"
  if usexmouse1 = ERROR
    usexmouse1 := 1
  if keyxmouse1 = ERROR
    keyxmouse1 := "Numpad4"
  if usexmouse2 = ERROR
    usexmouse2 := 1
  if keyxmouse2 = ERROR
    keyxmouse2 := "Numpad7"
  if usescrollup = ERROR
    usescrollup := 1
  if keyscrollup = ERROR
    keyscrollup := "Numpad5"
  if usescrolldown = ERROR
    usescrolldown := 1
  if keyscrolldown = ERROR
    keyscrolldown := "Numpad2"
  if usemouse3 = ERROR
    usemouse3 := 1
  if keymouse3 = ERROR
    keymouse3 := "Numpad8"
  if autorun = ERROR
    autorun := 1
  if runbanlist = ERROR
    runbanlist := 1
  if WINDOWED = ERROR
    WINDOWED := 0
  if OPENGL = ERROR
    OPENGL := 0
  if SWTNL = ERROR
    SWTNL := 0
Return

SaveConfig:
    Gui, 1:Submit, NoHide
    IniWrite, %showhp1%, %A_ScriptDir%\kahk.ini, Options, showhp1
    IniWrite, %showhp2%, %A_ScriptDir%\kahk.ini, Options, showhp2
    IniWrite, %hkoff%, %A_ScriptDir%\kahk.ini, Options, hkoff
    IniWrite, %hkpvpgn%, %A_ScriptDir%\kahk.ini, Options, hkpvpgn
    IniWrite, %usexmouse1%, %A_ScriptDir%\kahk.ini, Options, usexmouse1
    IniWrite, %keyxmouse1%, %A_ScriptDir%\kahk.ini, Options, keyxmouse1
    IniWrite, %usexmouse2%, %A_ScriptDir%\kahk.ini, Options, usexmouse2
    IniWrite, %keyxmouse2%, %A_ScriptDir%\kahk.ini, Options, keyxmouse2
    IniWrite, %usescrollup%, %A_ScriptDir%\kahk.ini, Options, usescrollup
    IniWrite, %keyscrollup%, %A_ScriptDir%\kahk.ini, Options, keyscrollup
    IniWrite, %usescrolldown%, %A_ScriptDir%\kahk.ini, Options, usescrolldown
    IniWrite, %keyscrolldown%, %A_ScriptDir%\kahk.ini, Options, keyscrolldown
    IniWrite, %usemouse3%, %A_ScriptDir%\kahk.ini, Options, usemouse3
    IniWrite, %keymouse3%, %A_ScriptDir%\kahk.ini, Options, keymouse3
    IniWrite, %autorun%, %A_ScriptDir%\kahk.ini, Options, autorun
    IniWrite, %runbanlist%, %A_ScriptDir%\kahk.ini, Options, runbanlist
    IniWrite, %WINDOWED%, %A_ScriptDir%\kahk.ini, Options, WINDOWED
    IniWrite, %OPENGL%, %A_ScriptDir%\kahk.ini, Options, OPENGL
    IniWrite, %SWTNL%, %A_ScriptDir%\kahk.ini, Options, SWTNL
    GoSub, SetHotkeys
    GoSub, autorunlabel
Return

; =============================================================  
; ======================== Gui SECTION ========================  
; =============================================================  

GenerateGui1:
  Gui, 1:Add, GroupBox, x6 y7 w310 h50 , Показывать здоровье
  Gui, 1:Add, CheckBox, x16 y27 w140 h20 vshowhp1 gshowhp1label, союзников
  Gui, 1:Add, CheckBox, x166 y27 w140 h20 vshowhp2 gshowhp2label, врагов
  Gui, 1:Add, CheckBox, x6 y67 w310 h20 vautorun gautorunlabel, Автозапуск программы
  Gui, 1:Add, CheckBox, x6 y97 w310 h20 vrunbanlist, Запускать банлист
  Gui, 1:Add, CheckBox, x6 y127 w200 h20 vusexmouse1 gSetHotkeys, Использовать X mouse button 1
  Gui, 1:Add, Hotkey, x216 y127 w100 h20 vkeyxmouse1 gSetHotkeys, 
  Gui, 1:Add, CheckBox, x6 y157 w200 h20 vusexmouse2 gSetHotkeys, Использовать X mouse button 2
  Gui, 1:Add, Hotkey, x216 y157 w100 h20 vkeyxmouse2 gSetHotkeys, 
  Gui, 1:Add, CheckBox, x6 y187 w200 h20 vusescrollup gSetHotkeys, Использовать колесо вверх
  Gui, 1:Add, Hotkey, x216 y187 w100 h20 vkeyscrollup gSetHotkeys, 
  Gui, 1:Add, CheckBox, x6 y217 w200 h20 vusescrolldown gSetHotkeys, Использовать колесо вниз
  Gui, 1:Add, Hotkey, x216 y217 w100 h20 vkeyscrolldown gSetHotkeys, 
  Gui, 1:Add, CheckBox, x6 y247 w200 h30 vusemouse3 gSetHotkeys, Использовать среднюю кнопку мыши
  Gui, 1:Add, Hotkey, x216 y247 w100 h30 vkeymouse3 gSetHotkeys, 
  Gui, 1:Add, Text, x6 y287 w310 h20 , Клавиша запуска офф. варкрафта: Ctrl+Alt+O
  Gui, 1:Add, Text, x6 y307 w310 h20 , Клавиша запуска не-офф. варкрафта: Ctrl+Alt+P
  Gui, 1:Add, GroupBox, x6 y337 w310 h120 , Ключи запуска:
  Gui, 1:Add, CheckBox, x16 y357 w260 h20 vWINDOWED, Windowed Mode
  Gui, 1:Add, CheckBox, x16 y387 w260 h20 vOPENGL, OpenGL Video Mode
  Gui, 1:Add, CheckBox, x16 y417 w260 h20 vSWTNL, Software Transform and Lighting Video Mode
  Gui, 1:Add, Button, x6 y467 w310 h20 gCheckCorrectly, Проверить пути
  Gui, 1:Add, Button, x6 y487 w310 h20 gGenerateRegTFT, Сгенерировать файл реестра под оффициалку
  Gui, 1:Add, Button, x6 y507 w310 h20 gGenerateRegPVPGN, Сгенерировать файл реестра под ПВПГН
  Gui, 1:Add, Button, x6 y537 w80 h30 gSaveConfig, Сохранить
  Gui, 1:Add, Button, x96 y537 w150 h30 gHideGui1, Свернуть
  Gui, 1:Add, Button, x256 y537 w60 h30 gExitSub, Закрыть
  Gui, 1:Show, x181 y111 h579 w329, Kiber's autohotkey script for Warcraft 3
Return

GenerateGui2:
  Gui, 2:Add, Button, x46 y7 w230 h20 gCheckCorrectly, Обновить
  Gui, 2:Add, Text, x6 y37 w310 h30 vTextBanlistCheck, 
  Gui, 2:Add, Text, x6 y77 w310 h30 vTextTFTCheck, 
  Gui, 2:Add, Text, x6 y117 w310 h30 vTextPVPGNCheck, 
  Gui, 2:Add, Text, x6 y157 w310 h30 vTextRegTFTCheck, 
  Gui, 2:Add, Text, x6 y197 w310 h30 vTextRegPVPGNCheck, 
  Gui, 2:Add, Button, x6 y237 w310 h30 gHideGui2, Закрыть
  Gui, 2:Show, x131 y91 h278 w328, Результат проверки путей
Return

; refreshes Gui. Kiber is a noob, and he does not know other methods
RefreshGui1:
  GuiControl, 1: , showhp1, %showhp1%
  GuiControl, 1: , showhp2, %showhp2%
  GuiControl, 1: , hkoff, %hkoff%
  GuiControl, 1: , hkpvpgn, %hkpvpgn%
  GuiControl, 1: , usexmouse1, %usexmouse1%
  GuiControl, 1: , keyxmouse1, %keyxmouse1%
  GuiControl, 1: , usexmouse2, %usexmouse2%
  GuiControl, 1: , keyxmouse2, %keyxmouse2%
  GuiControl, 1: , usescrollup, %usescrollup%
  GuiControl, 1: , keyscrollup, %keyscrollup%
  GuiControl, 1: , usescrolldown, %usescrolldown%
  GuiControl, 1: , keyscrolldown, %keyscrolldown%
  GuiControl, 1: , usemouse3, %usemouse3%
  GuiControl, 1: , keymouse3, %keymouse3%
  GuiControl, 1: , autorun, %autorun%
  GuiControl, 1: , runbanlist, %runbanlist%
  GuiControl, 1: , WINDOWED, %WINDOWED%
  GuiControl, 1: , OPENGL, %OPENGL%
  GuiControl, 1: , SWTNL, %SWTNL%
  Gui, 1:Submit, NoHide
Return

RefreshGui2:
  GuiControl, 2: , TextBanlistCheck, %TextBanlistCheck%
  GuiControl, 2: , TextTFTCheck, %TextTFTCheck%
  GuiControl, 2: , TextPVPGNCheck, %TextPVPGNCheck%
  GuiControl, 2: , TextRegTFTCheck, %TextRegTFTCheck%
  GuiControl, 2: , TextRegPVPGNCheck, %TextRegPVPGNCheck%
  Gui, 2:Submit, NoHide
Return

ShowGui1:
  Gui, 1:Show
Return

ShowGui2:
  Gui, 2:Show
Return

HideGui1:
  Gui, 1:Hide
Return

HideGui2:
  Gui, 2:Hide
Return

GuiClose:
  Gui, 1:Hide
  Gui, 2:Hide
Return

; =============================================================  
; ======================== Main  SECTION ======================  
; =============================================================  

SetHotkeys:
  GuiControlGet, usexmouse1
  GuiControlGet, usexmouse2
  GuiControlGet, usemouse3
  GuiControlGet, usescrollup
  GuiControlGet, usescrolldown
  GuiControlGet, showhp1
  GuiControlGet, showhp2

  #IfWinActive, ahk_class Warcraft III

    XButton1::
      if (usexmouse1 = 1)
      {
        Send {%keyxmouse1%}
      }
      else
      {
        Send {XButton1}
      }
    Return

    XButton2::
      if (usexmouse2 = 1)
      {
        Send {%keyxmouse2%}
      }
      else
      {
        Send {XButton2}
      }
    Return

    MButton::
      if (usemouse3 = 1)
      {
        Send {%keymouse3%}
      }
      else
      {
        Send {MButton}
      }
    Return

    WheelUp::
      if (usescrollup = 1)
      {
        Send {%keyscrollup%}
      }
      else
      {
        Send {WheelUp}
      }
    Return

    WheelDown::
      if (usescrolldown = 1)
      {
        Send {%keyscrolldown%}
      }
      else
      {
        Send {WheelDown}
      }
    Return

  if (showhp1 = 1)
    *[::
        WinGet, WID, ID, A ; Определяем раскладку
        WT := DllCall("GetWindowThreadProcessId", "UInt", WID, "UInt", 0)
        LID := DllCall("GetKeyboardLayout", "UInt", WT)
        Russian := LID = 68748313 ? 1 : 0
        if Russian ; Если раскладка - Русская
          { 
          Send, {х Up}
          GetKeyState, state, Shift
          if state = D
                Send, +{х Down}
          else
                Send, {х Down}
          }
        else
          {
          Send, {[ Up}
          GetKeyState, state, Shift
          if state = D
                Send, +{[ Down}
          else
                Send, {[ Down}
          }
    return
    
  if (showhp2 = 1)
    *]::
        WinGet, WID, ID, A
        WT := DllCall("GetWindowThreadProcessId", "UInt", WID, "UInt", 0)
        LID := DllCall("GetKeyboardLayout", "UInt", WT)
        Russian := LID = 68748313 ? 1 : 0
        if Russian
          { 
          Send, {ъ Up}
          GetKeyState, state, Shift
          if state = D
                Send, +{ъ Down}
            else
                Send, {ъ Down}
          }
        else
          {
          Send, {] Up}
          GetKeyState, state, Shift
          if state = D
                Send, +{] Down}
            else
                Send, {] Down}
          }
    return
    
  Return
Return

CheckCorrectly:
  TextBanlistCheck := "Путь к банлисту найден"
  TextTFTCheck := "Путь к Frozen Throne.exe найден"
  TextPVPGNCheck := "Путь к w3l.exe найден"
  TextRegTFTCheck := "Файл реестра off.reg найден"
  TextRegPVPGNCheck := "Файл реестра pvpgn.reg найден"  
  GuiControl, 2: -c +cGreen, TextBanlistCheck,
  GuiControl, 2: -c +cGreen, TextTFTCheck,
  GuiControl, 2: -c +cGreen, TextPVPGNCheck,
  GuiControl, 2: -c +cGreen, TextRegTFTCheck,
  GuiControl, 2: -c +cGreen, TextRegPVPGNCheck,

  IfNotExist, %war3path%\WC3Banlist\WC3Banlist.exe
  {
    TextBanlistCheck := "Не обнаружен Банлист. Папка банлиста должна находиться в папке варкрафта (" war3path ") и называться WC3Banlist" 
    GuiControl, 2: +cRed, TextBanlistCheck,
  }
  IfNotExist, %war3path%+\Frozen Throne.exe
  {
    TextTFTCheck := "Не обнаружен Frozen Throne.exe по адресу (" war3path "). Возможно, требуется переустановить игру" 
    GuiControl, 2: +cRed, TextTFTCheck,
  }
  IfNotExist, %war3path%\w3l.exe
  {
    TextPVPGNCheck := "Не обнаружен PVPGN-лаунчер w3l.exe по адресу (" war3path "). Вероятно, он вам не нужен."  
    GuiControl, 2: +cRed, TextPVPGNCheck,
  
  }
  IfNotExist, %war3path%\off.reg
  {
    TextRegTFTCheck := "Не обнаружен файл реестра off.reg по адресу (" war3path "). Вероятно, он вам не нужен."  
    GuiControl, 2: +cRed, TextRegTFTCheck,
  }
  IfNotExist, %war3path%\pvpgn.reg
  {
    TextRegPVPGNCheck := "Не обнаружен файл реестра pvpgn.reg по адресу (" war3path "). Вероятно, он вам не нужен."
    GuiControl, 2: +cRed, TextRegPVPGNCheck,
  }

  GoSub, RefreshGui2
  GoSub, ShowGui2
Return


GenerateRegTFT:
  Run, reg export "HKCU\Software\Blizzard Entertainment\Warcraft III" %war3path%\off.reg
  MsgBox, 0,, Файл сгенерирован
  GoSub, CheckCorrectly
Return

GenerateRegPVPGN:
  Run, reg export "HKCU\Software\Blizzard Entertainment\Warcraft III" %war3path%\pvpgn.reg
  MsgBox, 0,, Файл сгенерирован
  GoSub, CheckCorrectly
Return

showhp1label:
 Gosub, SetHotkeys
Return

showhp2label:
 Gosub, SetHotkeys
Return

autorunlabel:
  GuiControlGet, autorun
    if (autorun = 1)
    {
    RegWrite, REG_SZ, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Run, KAHK, %A_ScriptFullPath% /hide
  }
  else
  {
    RegDelete, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Run, KAHK
  }
Return

CheckParameters:
  Loop %0%  ; For each parameter (or file dropped onto a script):
  {
    Param := %A_Index%
    if Param = /hide
    {
      GoSub, HideGui1
      GoSub, HideGui2
    }
      
  }
Return
    
ExitSub:
;  MsgBox, 4,, Сохранить настройки?
;  IfMsgBox Yes
    GoSub, SaveConfig
ExitApp ; Единственная возможность убийства для скрипта OnExit - использовать ExitApp

Во вложении поста - скомпилированный вариант.

5 (изменено: Kiber, 2008-07-21 22:19:36)

Re: AutoHotkey: Warcraft III

v. 1.03b:
Это тестовый релиз, прошло много изменений, протестить все меня просто ломает.
- Исправлено множество ошибок с некорректным забиндиванием клавиш и их отжатий.
  Теперь сам хоткей надо указывать через кнопку "опр.", а модификаторы (ctrl,
  alt, shift) можно выставить при помощи соответствующих галочек.
- Изменен интерфейс, добавлены закладки
- Немного изменено чтение/сохранение параметорв в ini-файл, после обновления проверьте настройки.

; Тема на форуме http://forum.script-coding.com/viewtopic.php?pid=11988
; Обсуждение http://forum.script-coding.com/viewtopic.php?id=435

#SingleInstance force        ;force a single instance
                            ;запретить запуск нескольких копий программы
#HotkeyInterval 0        ;disable the warning dialog if a key is held down
                        ;устанавливает частоту активации горячих клавиш
#InstallKeybdHook        ;Forces the unconditional installation of the keyboard hook 
                        ;Безусловно устанавливает обработчик клавиатурных прерываний
#InstallMouseHook        ;
                        ;Безусловно устанавливает обработчик прерываний для мыши
#UseHook On            ;might increase responsiveness of hotkeys
                    ;заставляет обработчик прерываний использовать все горячие клавиши
#MaxThreads 20            ;use 20 (the max) instead of 10 threads
                        ;Задает максимальное количество одновременно исполняемых потоков
SetBatchLines, -1        ;makes the script run at max speed
                        ;Определяет, как быстро будет выполняться скрипт (влияет на коэффициент загрузки центрального процессора)
SetKeyDelay , -1, -1        ;faster response (might be better with -1, 0)
                            ;Задает задержку после каждого нажатия клавиши, посланного командой Send или ControlSend.

;======== Изменяет иконку в трее на иконку варкрафта ========
regread, war, HKEY_CURRENT_USER, Software\Blizzard Entertainment\Warcraft III, Program ; читаем из реестра путь до варкрафта
regread, war3path, HKEY_CURRENT_USER, Software\Blizzard Entertainment\Warcraft III, InstallPathX ; эта переменная будет использоваться дальше
menu, tray, Icon, %War%, 1, 1 ; меняем иконку

GoSub, GenerateGui1RUS
;GoSub, HideGui1
GoSub, ReadConfig
GoSub, CheckErrorsAndLoadDefaults
GoSub, RefreshGui1
GoSub, SetHotkeys
GoSub, TrayInit
GoSub, autorunlabel
GoSub, CheckParameters
GoSub, CheckCorrectly
GuiControl, 1: Choose, TabGHP, |1
wasalttabed := 1 ; 0 - нужные клавиши ("[" и "]") зажаты, 1 - в альттабе
SetTimer, timer_Warcraft, 500 ; 500 мс = 0.5 секунды


; =====================     global Hotkeys          ============================
^!o:: ; ctrl+alt+o - OFF
        ; определяем параметры запуска
    GuiControlGet, WINDOWED
    GuiControlGet, OPENGL
    GuiControlGet, SWTNL
    param = ""
    If (WINDOWED = 1)
      param := "-window"
    If (OPENGL = 1)
      param := "" param " -opengl"
    If (SWTNL = 1)
      param := "" param " -swtnl"
    
        ; прописываем оф гейтвеи
    Run, %windir%\regedit.exe /s "%war3path%\off.reg" 
    GoSub, load_banlist
        ; проверить существование процесса
    Process, Exist, war3.exe
        ; если Warcraft не запущен, то...
    If ErrorLevel = 0 
      {
        ; запускаем официальный варкрафт
        Run, %war3path%\Frozen Throne.exe %param%
      }
Return 

^!p:: ; ctrl+alt+p - PVPGN
    ; определяем параметры запуска
    GuiControlGet, WINDOWED
    GuiControlGet, OPENGL
    GuiControlGet, SWTNL
    param = ""
    If (WINDOWED = 1)
      param := "-window"
    If (OPENGL = 1)
      param := "" param " -opengl"
    If (SWTNL = 1)
      param := "" param " -swtnl"
        ; прописываем пвпгн гейтвеи
    Run, %windir%\regedit.exe /s "%war3path%\pvpgn.reg"
    GoSub, load_banlist
        ; проверить существование процесса
    Process, Exist, war3.exe
    If ErrorLevel = 0 ; если Warcraft не запущен, то...
      {
            ; запускаем пвпгн варкрафт лаунчер
        Run, %war3path%\w3l.exe %param%, %war3path%\
      }
Return  

load_banlist:
    GuiControlGet, runbanlist
    If (runbanlist = 1)
    {
        Process, Exist, WC3Banlist.exe ; проверить существование процесса banlist'a
        If ErrorLevel = 0 ; если Banlist не запущен, то...
        {
            IfExist, %war3path%\WC3Banlist\WC3Banlist.exe
            {
                    ; запускаем banlist, его папка находится в папке варкрафта и называется WC3Banlist
                Run, %war3path%\WC3Banlist\WC3Banlist.exe
                    ; ждем пока он прогрузится (максимум 10 сек) Если банлист не используем, надо улучшить проверку чтобы не ждать 10 сек
                WinWait, ahk_class TWC3Banlist_Main, ,10
                    ; повторная проверка на то что банлист прогрузился
                WinActivate, ahk_class TWC3Banlist_Main
                    ; (10 сек)
                WinWaitActive, ahk_class TWC3Banlist_Main, ,10
            }
        }
    }
Return

TrayInit:
    Menu, TRAY, Add, 
    Menu, TRAY, Add, Настройки, ShowGui1
    Menu, TRAY, Default, Настройки
Return

timer_Warcraft:
      ; если варик активен
  ifWinActive, ahk_class Warcraft III
  {
      ; Дополнительная и очень эффективная проверка в чате или играем
  if (wasalttabed = 1)
    {
      wasalttabed := 0
        ; Определяем раскладку
      WinGet, WID, ID, A
      WT := DllCall("GetWindowThreadProcessId", "UInt", WID, "UInt", 0)
      LID := DllCall("GetKeyboardLayout", "UInt", WT)
      Russian := LID = 68748313 ? 1 : 0
        ; Если раскладка - Русская
      if Russian 
      {
          if (showhp1 = 1)
            Send, {х Down}
          if (showhp2 = 1)
            Send, {ъ Down}
      }
      else
      {
          if (showhp1 = 1)
            Send, {[ Down}
          if (showhp2 = 1)
            Send, {] Down}
      }
    }
  }
  else
  {
    wasalttabed := 1
  }
Return ; end of timer_Warcraft 

; =============================================================  
; ======================== ini SECTION ========================  
; =============================================================  

ReadConfig:
    Gui, 1:Submit, NoHide
    ;showhp1 = 1
    ;showhp2 = 1
    IniRead, showhp1, %A_ScriptDir%\kahk.ini, General, showhp1
    IniRead, showhp2, %A_ScriptDir%\kahk.ini, General, showhp2

    IniRead, autorun, %A_ScriptDir%\kahk.ini, General, autorun
    IniRead, runbanlist, %A_ScriptDir%\kahk.ini, General, runbanlist

    IniRead, WINDOWED, %A_ScriptDir%\kahk.ini, General, WINDOWED
    IniRead, OPENGL, %A_ScriptDir%\kahk.ini, General, OPENGL
    IniRead, SWTNL, %A_ScriptDir%\kahk.ini, General, SWTNL

    IniRead, usexmouse1, %A_ScriptDir%\kahk.ini, Binds, usexmouse1
    IniRead, usexmouse1A, %A_ScriptDir%\kahk.ini, Binds, usexmouse1A
    IniRead, usexmouse1C, %A_ScriptDir%\kahk.ini, Binds, usexmouse1C
    IniRead, usexmouse1S, %A_ScriptDir%\kahk.ini, Binds, usexmouse1S

    IniRead, usexmouse2, %A_ScriptDir%\kahk.ini, Binds, usexmouse2
    IniRead, usexmouse2A, %A_ScriptDir%\kahk.ini, Binds, usexmouse2A
    IniRead, usexmouse2C, %A_ScriptDir%\kahk.ini, Binds, usexmouse2C
    IniRead, usexmouse2S, %A_ScriptDir%\kahk.ini, Binds, usexmouse2S

    IniRead, usescrollup, %A_ScriptDir%\kahk.ini, Binds, usescrollup
    IniRead, usescrollupS, %A_ScriptDir%\kahk.ini, Binds, usescrollupS
    IniRead, usescrollupA, %A_ScriptDir%\kahk.ini, Binds, usescrollupA
    IniRead, usescrollupC, %A_ScriptDir%\kahk.ini, Binds, usescrollupC

    IniRead, usescrolldown, %A_ScriptDir%\kahk.ini, Binds, usescrolldown
    IniRead, usescrolldownS, %A_ScriptDir%\kahk.ini, Binds, usescrolldownS
    IniRead, usescrolldownA, %A_ScriptDir%\kahk.ini, Binds, usescrolldownA
    IniRead, usescrolldownC, %A_ScriptDir%\kahk.ini, Binds, usescrolldownC

    IniRead, usemouse3, %A_ScriptDir%\kahk.ini, Binds, usemouse3
    IniRead, usemouse3S, %A_ScriptDir%\kahk.ini, Binds, usemouse3S
    IniRead, usemouse3A, %A_ScriptDir%\kahk.ini, Binds, usemouse3A
    IniRead, usemouse3C, %A_ScriptDir%\kahk.ini, Binds, usemouse3C

    IniRead, keyxmouse1, %A_ScriptDir%\kahk.ini, Binds, keyxmouse1
    IniRead, keyxmouse2, %A_ScriptDir%\kahk.ini, Binds, keyxmouse2
    IniRead, keyscrollup, %A_ScriptDir%\kahk.ini, Binds, keyscrollup
    IniRead, keyscrolldown, %A_ScriptDir%\kahk.ini, Binds, keyscrolldown
    IniRead, keymouse3, %A_ScriptDir%\kahk.ini, Binds, keymouse3

    IniRead, hkoff, %A_ScriptDir%\kahk.ini, Options, hkoff
    IniRead, hkpvpgn, %A_ScriptDir%\kahk.ini, Options, hkpvpgn

Return

CheckErrorsAndLoadDefaults:
  if showhp1 = ERROR
    showhp1 := 1
  if showhp2 = ERROR
    showhp2 := 1
  if hkoff = ERROR
    hkoff := "^!S"
  if hkpvpgn = ERROR
    hkpvpgn := "^!W"

  if usexmouse1 = ERROR
    usexmouse1 := 1
  if usexmouse1A = ERROR
    usexmouse1A := 0
  if usexmouse1C = ERROR
    usexmouse1C := 0
  if usexmouse1S = ERROR
    usexmouse1S := 0

  if usexmouse2 = ERROR
    usexmouse2 := 1
  if usexmouse2A = ERROR
    usexmouse2A := 0
  if usexmouse2C = ERROR
    usexmouse2C := 0
  if usexmouse2S = ERROR
    usexmouse2S := 0

  if usescrollup = ERROR
    usescrollup := 1
  if usescrollupS = ERROR
    usescrollupS := 0
  if usescrollupA = ERROR
    usescrollupA := 0
  if usescrollupC = ERROR
    usescrollupC := 0

  if usescrolldown = ERROR
    usescrolldown := 1
  if usescrolldownS = ERROR
    usescrolldownS := 0
  if usescrolldownA = ERROR
    usescrolldownA := 0
  if usescrolldownC = ERROR
    usescrolldownC := 0

  if usemouse3 = ERROR
    usemouse3 := 1
  if usemouse3S = ERROR
    usemouse3S := 0
  if usemouse3A = ERROR
    usemouse3A := 0
  if usemouse3C = ERROR
    usemouse3C := 0

  if keyxmouse1 = ERROR
    keyxmouse1 := "Numpad4"
  if keyxmouse2 = ERROR
    keyxmouse2 := "Numpad7"
  if keyscrollup = ERROR
    keyscrollup := "Numpad5"
  if keyscrolldown = ERROR
    keyscrolldown := "Numpad2"
  if keymouse3 = ERROR
    keymouse3 := "Numpad8"

  if autorun = ERROR
    autorun := 1
  if runbanlist = ERROR
    runbanlist := 1
  if WINDOWED = ERROR
    WINDOWED := 0
  if OPENGL = ERROR
    OPENGL := 0
  if SWTNL = ERROR
    SWTNL := 0
Return

SaveConfig:
    Gui, 1:Submit, NoHide
    IniWrite, %showhp1%, %A_ScriptDir%\kahk.ini, General, showhp1
    IniWrite, %showhp2%, %A_ScriptDir%\kahk.ini, General, showhp2

    IniWrite, %autorun%, %A_ScriptDir%\kahk.ini, General, autorun
    IniWrite, %runbanlist%, %A_ScriptDir%\kahk.ini, General, runbanlist

    IniWrite, %WINDOWED%, %A_ScriptDir%\kahk.ini, General, WINDOWED
    IniWrite, %OPENGL%, %A_ScriptDir%\kahk.ini, General, OPENGL
    IniWrite, %SWTNL%, %A_ScriptDir%\kahk.ini, General, SWTNL

    IniWrite, %usexmouse1%, %A_ScriptDir%\kahk.ini, Binds, usexmouse1
    IniWrite, %usexmouse1A%, %A_ScriptDir%\kahk.ini, Binds, usexmouse1A
    IniWrite, %usexmouse1C%, %A_ScriptDir%\kahk.ini, Binds, usexmouse1C
    IniWrite, %usexmouse1S%, %A_ScriptDir%\kahk.ini, Binds, usexmouse1S

    IniWrite, %usexmouse2%, %A_ScriptDir%\kahk.ini, Binds, usexmouse2
    IniWrite, %usexmouse2A%, %A_ScriptDir%\kahk.ini, Binds, usexmouse2A
    IniWrite, %usexmouse2C%, %A_ScriptDir%\kahk.ini, Binds, usexmouse2C
    IniWrite, %usexmouse2S%, %A_ScriptDir%\kahk.ini, Binds, usexmouse2S

    IniWrite, %usescrollup%, %A_ScriptDir%\kahk.ini, Binds, usescrollup
    IniWrite, %usescrollupS%, %A_ScriptDir%\kahk.ini, Binds, usescrollupS
    IniWrite, %usescrollupA%, %A_ScriptDir%\kahk.ini, Binds, usescrollupA
    IniWrite, %usescrollupC%, %A_ScriptDir%\kahk.ini, Binds, usescrollupC

    IniWrite, %usescrolldown%, %A_ScriptDir%\kahk.ini, Binds, usescrolldown
    IniWrite, %usescrolldownS%, %A_ScriptDir%\kahk.ini, Binds, usescrolldownS
    IniWrite, %usescrolldownA%, %A_ScriptDir%\kahk.ini, Binds, usescrolldownA
    IniWrite, %usescrolldownC%, %A_ScriptDir%\kahk.ini, Binds, usescrolldownC

    IniWrite, %usemouse3%, %A_ScriptDir%\kahk.ini, Binds, usemouse3
    IniWrite, %usemouse3S%, %A_ScriptDir%\kahk.ini, Binds, usemouse3S
    IniWrite, %usemouse3A%, %A_ScriptDir%\kahk.ini, Binds, usemouse3A
    IniWrite, %usemouse3C%, %A_ScriptDir%\kahk.ini, Binds, usemouse3C

    IniWrite, %keyxmouse1%, %A_ScriptDir%\kahk.ini, Binds, keyxmouse1
    IniWrite, %keyxmouse2%, %A_ScriptDir%\kahk.ini, Binds, keyxmouse2
    IniWrite, %keyscrollup%, %A_ScriptDir%\kahk.ini, Binds, keyscrollup
    IniWrite, %keyscrolldown%, %A_ScriptDir%\kahk.ini, Binds, keyscrolldown
    IniWrite, %keymouse3%, %A_ScriptDir%\kahk.ini, Binds, keymouse3

    IniWrite, %hkoff%, %A_ScriptDir%\kahk.ini, Options, hkoff
    IniWrite, %hkpvpgn%, %A_ScriptDir%\kahk.ini, Options, hkpvpgn
    GoSub, SetHotkeys
    GoSub, autorunlabel
Return

; =============================================================  
; ======================== Gui SECTION ========================  
; =============================================================  

GenerateGui1RUS:
  Gui, 1:Add, Button, x6 y347 w80 h30 gSaveConfig, Сохранить
  Gui, 1:Add, Button, x96 y347 w150 h30 gHideGui1, Свернуть
  Gui, 1:Add, Button, x256 y347 w60 h30 gExitSub, Закрыть
  Gui, 1:Add, Tab, x0 y0 w330 h390 vTabGHP, Основные|Бинды|Пути
  Gui, 1:Tab, Основные
  Gui, 1:Add, GroupBox, x6 y27 w310 h50 , Показывать здоровье
  Gui, 1:Add, CheckBox, x16 y47 w140 h20 vshowhp1 gshowhp1label, союзников
  Gui, 1:Add, CheckBox, x166 y47 w140 h20 vshowhp2 gshowhp2label, врагов
  Gui, 1:Add, CheckBox, x6 y87 w310 h20 vautorun gautorunlabel, Автозапуск программы
  Gui, 1:Add, CheckBox, x6 y117 w310 h20 vrunbanlist, Запускать банлист
  Gui, 1:Add, GroupBox, x6 y147 w310 h120 , Ключи запуска:
  Gui, 1:Add, CheckBox, x16 y167 w260 h20 vWINDOWED, Windowed Mode
  Gui, 1:Add, CheckBox, x16 y197 w260 h20 vOPENGL, OpenGL Video Mode
  Gui, 1:Add, CheckBox, x16 y227 w260 h20 vSWTNL, Software Transform and Lighting Video Mode
  Gui, 1:Add, Button, x6 y277 w310 h20 gCheckCorrectly, Проверить пути
  Gui, 1:Add, Button, x6 y297 w310 h20 gGenerateRegTFT, Сгенерировать файл реестра под официалку
  Gui, 1:Add, Button, x6 y317 w310 h20 gGenerateRegPVPGN, Сгенерировать файл реестра под ПВПГН
  Gui, 1:Tab, Бинды
  Gui, 1:Add, GroupBox, x117 y27 w30 h167 +Center, alt
  Gui, 1:Add, GroupBox, x147 y27 w30 h167 +Center, shift
  Gui, 1:Add, GroupBox, x177 y27 w30 h167 +Center, ctrl
  Gui, 1:Add, CheckBox, x6 y47 w110 h20 vusexmouse1 gSetHotkeys, X mouse button 1
  Gui, 1:Add, CheckBox, x156 y47 w15 h20 vusexmouse1S gSetHotkeys,
  Gui, 1:Add, CheckBox, x186 y47 w15 h20 vusexmouse1C gSetHotkeys,
  Gui, 1:Add, CheckBox, x126 y47 w15 h20 vusexmouse1A gSetHotkeys,
  Gui, 1:Add, Text, x216 y47 w60 h20 vkeyxmouse1 gSetHotkeys, 
  Gui, 1:Add, Button, x286 y47 w40 h20 gSetXMouse1, опр.
  Gui, 1:Add, CheckBox, x6 y77 w110 h20 vusexmouse2 gSetHotkeys, X mouse button 2
  Gui, 1:Add, CheckBox, x156 y77 w15 h20 vusexmouse2S gSetHotkeys,
  Gui, 1:Add, CheckBox, x186 y77 w15 h20 vusexmouse2C gSetHotkeys,
  Gui, 1:Add, CheckBox, x126 y77 w15 h20 vusexmouse2A gSetHotkeys,
  Gui, 1:Add, Text, x216 y77 w60 h20 vkeyxmouse2 gSetHotkeys, 
  Gui, 1:Add, Button, x286 y77 w40 h20 gSetXMouse2, опр.
  Gui, 1:Add, CheckBox, x6 y107 w110 h20 vusescrollup gSetHotkeys, Колесо вверх
  Gui, 1:Add, CheckBox, x156 y107 w15 h20 vusescrollupS gSetHotkeys,
  Gui, 1:Add, CheckBox, x186 y107 w15 h20 vusescrollupC gSetHotkeys,
  Gui, 1:Add, CheckBox, x126 y107 w15 h20 vusescrollupA gSetHotkeys,
  Gui, 1:Add, Text, x216 y107 w60 h20 vkeyscrollup gSetHotkeys, 
  Gui, 1:Add, Button, x286 y107 w40 h20 gSetScrollUp, опр.
  Gui, 1:Add, CheckBox, x6 y137 w110 h20 vusescrolldown gSetHotkeys, Колесо вниз
  Gui, 1:Add, CheckBox, x156 y137 w15 h20 vusescrolldownS gSetHotkeys,
  Gui, 1:Add, CheckBox, x186 y137 w15 h20 vusescrolldownC gSetHotkeys,
  Gui, 1:Add, CheckBox, x126 y137 w15 h20 vusescrolldownA gSetHotkeys,
  Gui, 1:Add, Text, x216 y137 w60 h20 vkeyscrolldown gSetHotkeys, 
  Gui, 1:Add, Button, x286 y137 w40 h20 gSetScrollDown, опр.
  Gui, 1:Add, CheckBox, x6 y167 w110 h20 vusemouse3 gSetHotkeys, Mid mouse button
  Gui, 1:Add, CheckBox, x156 y167 w15 h20 vusemouse3S gSetHotkeys,
  Gui, 1:Add, CheckBox, x186 y167 w15 h20 vusemouse3C gSetHotkeys,
  Gui, 1:Add, CheckBox, x126 y167 w15 h20 vusemouse3A gSetHotkeys,
  Gui, 1:Add, Text, x216 y167 w60 h20 vkeymouse3 gSetHotkeys, 
  Gui, 1:Add, Button, x286 y167 w40 h20 gSetMouse3, опр.
  Gui, 1:Add, Text, x6 y207 w310 h20 , Клавиша запуска оф. варкрафта: Ctrl+Alt+O
  Gui, 1:Add, Text, x6 y227 w310 h20 , Клавиша запуска не-оф. варкрафта: Ctrl+Alt+P
  Gui, 1:Tab, Пути
  Gui, 1:Add, Button, x46 y27 w230 h20 gCheckCorrectly, Обновить
  Gui, 1:Add, Text, x6 y57 w310 h30 vTextBanlistCheck, 
  Gui, 1:Add, Text, x6 y97 w310 h30 vTextTFTCheck, 
  Gui, 1:Add, Text, x6 y137 w310 h30 vTextPVPGNCheck, 
  Gui, 1:Add, Text, x6 y177 w310 h30 vTextRegTFTCheck, 
  Gui, 1:Add, Text, x6 y217 w310 h30 vTextRegPVPGNCheck, 
  Gui, 1:Show, x181 y111 h390 w330, Kiber's autohotkey script for Warcraft 3
Return

; refreshes Gui. Kiber is a noob, and he does not know other methods
RefreshGui1:
  GuiControl, 1: , showhp1, %showhp1%
  GuiControl, 1: , showhp2, %showhp2%
  GuiControl, 1: , hkoff, %hkoff%
  GuiControl, 1: , hkpvpgn, %hkpvpgn%
  GuiControl, 1: , autorun, %autorun%
  GuiControl, 1: , runbanlist, %runbanlist%
  GuiControl, 1: , WINDOWED, %WINDOWED%
  GuiControl, 1: , OPENGL, %OPENGL%
  GuiControl, 1: , SWTNL, %SWTNL%
  GuiControl, 1: , TextBanlistCheck, %TextBanlistCheck%
  GuiControl, 1: , TextTFTCheck, %TextTFTCheck%
  GuiControl, 1: , TextPVPGNCheck, %TextPVPGNCheck%
  GuiControl, 1: , TextRegTFTCheck, %TextRegTFTCheck%
  GuiControl, 1: , TextRegPVPGNCheck, %TextRegPVPGNCheck%
  GoSub, RefreshGui1XMouse1
  GoSub, RefreshGui1XMouse2
  GoSub, RefreshGui1ScrollUP
  GoSub, RefreshGui1ScrollDown
  GoSub, RefreshGui1Mouse3
  Gui, 1:Submit, NoHide
Return

RefreshGui1XMouse1:
  GuiControl, 1: , usexmouse1, %usexmouse1%
  GuiControl, 1: , usexmouse1A, %usexmouse1A%
  GuiControl, 1: , usexmouse1C, %usexmouse1C%
  GuiControl, 1: , usexmouse1S, %usexmouse1S%
  GuiControl, 1: , keyxmouse1, %keyxmouse1%
Return

RefreshGui1XMouse2:
  GuiControl, 1: , usexmouse2, %usexmouse2%
  GuiControl, 1: , usexmouse2A, %usexmouse2A%
  GuiControl, 1: , usexmouse2C, %usexmouse2C%
  GuiControl, 1: , usexmouse2S, %usexmouse2S%
  GuiControl, 1: , keyxmouse2, %keyxmouse2%
Return

RefreshGui1ScrollUP:
  GuiControl, 1: , usescrollup, %usescrollup%
  GuiControl, 1: , usescrollupS, %usescrollupS%
  GuiControl, 1: , usescrollupA, %usescrollupA%
  GuiControl, 1: , usescrollupC, %usescrollupC%
  GuiControl, 1: , keyscrollup, %keyscrollup%
Return

RefreshGui1ScrollDown:
  GuiControl, 1: , usescrolldown, %usescrolldown%
  GuiControl, 1: , usescrolldownS, %usescrolldownS%
  GuiControl, 1: , usescrolldownA, %usescrolldownA%
  GuiControl, 1: , usescrolldownC, %usescrolldownC%
  GuiControl, 1: , keyscrolldown, %keyscrolldown%
Return

RefreshGui1Mouse3:
  GuiControl, 1: , usemouse3, %usemouse3%
  GuiControl, 1: , usemouse3S, %usemouse3S%
  GuiControl, 1: , usemouse3A, %usemouse3A%
  GuiControl, 1: , usemouse3C, %usemouse3C%
  GuiControl, 1: , keymouse3, %keymouse3%
Return


ShowGui1:
  Gui, 1:Show
Return

GuiClose:
GuiEscape:
HideGui1:
  Gui, 1:Hide
Return

SetXMouse1:
  tmpHotkey = keyxmouse1
  tmpHotkeyS = usexmouse1S
  tmpHotkeyC = usexmouse1C
  tmpHotkeyA = usexmouse1A
  GoSub, ChangeHotKey
Return

SetXMouse2:
  tmpHotkey = keyxmouse2
  tmpHotkeyS = usexmouse2S
  tmpHotkeyC = usexmouse2C
  tmpHotkeyA = usexmouse2A
  GoSub, ChangeHotKey
Return

SetScrollUp:
  tmpHotkey = keyscrollup
  tmpHotkeyS = usescrollupS
  tmpHotkeyC = usescrollupC
  tmpHotkeyA = usescrollupA
  GoSub, ChangeHotKey
Return

SetScrollDown:
  tmpHotkey = keyscrolldown
  tmpHotkeyS = usescrolldownS
  tmpHotkeyC = usescrolldownC
  tmpHotkeyA = usescrolldownA
  GoSub, ChangeHotKey
Return

SetMouse3:
  tmpHotkey = keymouse3
  tmpHotkeyS = usemouse3S
  tmpHotkeyC = usemouse3C
  tmpHotkeyA = usemouse3A
  GoSub, ChangeHotKey
Return

ChangeHotKey:
  Gui, 1:Hide
  Gui, 2:Add, Hotkey, x6 y7 w130 h20 vtmpNeedToBeParsed, 
  Gui, 2:Add, Button, x6 y27 w130 h30 gChangeHotkeyClose, Готово
  Gui, 2:Show, h63 w142, Enter hotkey
Return

ChangeHotkeyClose:
; ^ = ctrl + = shift ! = alt
; очередность: shift, ctrl, alt
  GuiControlGet, tmpNeedToBeParsed
  IfInString, tmpNeedToBeParsed, +
  {
    %tmpHotkeyS% = 1
    GuiControl, 1: , %tmpHotkeyS%, 1
  }
  else
  {
    %tmpHotkeyS% = 0
    GuiControl, 1: , %tmpHotkeyS%, 0
  }

  IfInString, tmpNeedToBeParsed, ^
  {
    %tmpHotkeyC% = 1
    GuiControl, 1: , %tmpHotkeyC%, 1
  }
  else
  {
    %tmpHotkeyC% = 0
    GuiControl, 1: , %tmpHotkeyC%, 0
  }

  IfInString, tmpNeedToBeParsed, !
  {
    %tmpHotkeyA% = 1
    GuiControl, 1: , %tmpHotkeyA%, 1
  }
  else
  {
    %tmpHotkeyA% = 0
    GuiControl, 1: , %tmpHotkeyA%, 0
  }

  num := 1+%tmpHotkeyS%+%tmpHotkeyC%+%tmpHotkeyA%
  %tmpHotkey% := SubStr(tmpNeedToBeParsed, num)
  TMP := SubStr(tmpNeedToBeParsed, num)
  GuiControl, 1: , %tmpHotkey%, %TMP%

  Gui, 1:Submit, NoHide
  Gui, 1:Show
  GuiControl, 1: Choose, TabGHP, |2
  GoSub, SetHotkeys
  Gui, 2:Destroy
Return

; =============================================================  
; ======================== Main  SECTION ====================== 
; =============================================================  

SetHotkeys:
  Gui, 1:Submit, NoHide
  
  StringLower, keyxmouse1, keyxmouse1
  StringLower, keyxmouse2, keyxmouse2
  StringLower, keyscrollup, keyscrollup
  StringLower, keyscrolldown, keyscrolldown
  StringLower, keymouse3, keymouse3

  keyxmouse1ToPush := "{" keyxmouse1 "}"
  if (usexmouse1A = 1)
    keyxmouse1ToPush := "{Alt Down}" keyxmouse1ToPush "{Alt Up}"
  if (usexmouse1C = 1)
    keyxmouse1ToPush := "{Control Down}" keyxmouse1ToPush "{Control Up}"
  if (usexmouse1S = 1)
    keyxmouse1ToPush := "{Shift Down}" keyxmouse1ToPush "{Shift Up}"

  keyxmouse2ToPush := "{" keyxmouse2 "}"
  if (usexmouse2A = 1)
    keyxmouse2ToPush := "{Alt Down}" keyxmouse2ToPush "{Alt Up}"
  if (usexmouse2C = 1)
    keyxmouse2ToPush := "{Control Down}" keyxmouse2ToPush "{Control Up}"
  if (usexmouse2S = 1)
    keyxmouse2ToPush := "{Shift Down}" keyxmouse2ToPush "{Shift Up}"

  keyscrollupToPush := "{" keyscrollup "}"
  if (usescrollupA = 1)
    keyscrollupToPush := "{Alt Down}" keyscrollupToPush "{Alt Up}"
  if (usescrollupC = 1)
    keyscrollupToPush := "{Control Down}" keyscrollupToPush "{Control Up}"
  if (usescrollupS = 1)
    keyscrollupToPush := "{Shift Down}" keyscrollupToPush "{Shift Up}"

  keyscrolldownToPush := "{" keyscrolldown "}"
  if (usescrolldownA = 1)
    keyscrolldownToPush := "{Alt Down}" keyscrolldownToPush "{Alt Up}"
  if (usescrolldownC = 1)
    keyscrolldownToPush := "{Control Down}" keyscrolldownToPush "{Control Up}"
  if (usescrolldownS = 1)
    keyscrolldownToPush := "{Shift Down}" keyscrolldownToPush "{Shift Up}"

  keymouse3ToPush := "{" keymouse3 "}"
  if (usemouse3A = 1)
    keymouse3ToPush := "{Alt Down}" keymouse3ToPush "{Alt Up}"
  if (usemouse3C = 1)
    keymouse3ToPush := "{Control Down}" keymouse3ToPush "{Control Up}"
  if (usemouse3S = 1)
    keymouse3ToPush := "{Shift Down}" keymouse3ToPush "{Shift Up}"
    
;  MsgBox, %keyxmouse1ToPush%
;  MsgBox, %keyxmouse2ToPush%
;  MsgBox, %keyscrollupToPush%
;  MsgBox, %keyscrolldownToPush%
;  MsgBox, %keymouse3ToPush%


  #IfWinActive, ahk_class Warcraft III
  {
    XButton1::
      if (usexmouse1 = 1)
      {
        Send %keyxmouse1ToPush%
      }
      else
      {
        Send {XButton1}
      }
    Return

    XButton2::
      if (usexmouse2 = 1)
      {
        Send %keyxmouse2ToPush%
      }
      else
      {
        Send {XButton2}
      }
    Return

    MButton::
      if (usemouse3 = 1)
      {
        Send %keymouse3ToPush%
      }
      else
      {
        Send {MButton}
      }
    Return

    WheelUp::
      if (usescrollup = 1)
      {
        Send %keyscrollupToPush%
      }
      else
      {
        Send {WheelUp}
      }
    Return

    WheelDown::
      if (usescrolldown = 1)
      {
        Send %keyscrolldownToPush%
      }
      else
      {
        Send {WheelDown}
      }
    Return

    if (showhp1 = 1)
    {
      *[::
              ; Определяем раскладку
          WinGet, WID, ID, A
          WT := DllCall("GetWindowThreadProcessId", "UInt", WID, "UInt", 0)
          LID := DllCall("GetKeyboardLayout", "UInt", WT)
          Russian := LID = 68748313 ? 1 : 0
              ; Если раскладка - Русская
          if Russian
            { 
            Send, {х Up}
            GetKeyState, state, Shift
            if state = D
                  Send, +{х Down}
            else
                  Send, {х Down}
            }
          else
            {
            Send, {[ Up}
            GetKeyState, state, Shift
            if state = D
                  Send, +{[ Down}
            else
                  Send, {[ Down}
            }
      Return
    }
      
    if (showhp2 = 1)
    {
      *]::
          WinGet, WID, ID, A
          WT := DllCall("GetWindowThreadProcessId", "UInt", WID, "UInt", 0)
          LID := DllCall("GetKeyboardLayout", "UInt", WT)
          Russian := LID = 68748313 ? 1 : 0
          if Russian
            { 
            Send, {ъ Up}
            GetKeyState, state, Shift
            if state = D
                  Send, +{ъ Down}
              else
                  Send, {ъ Down}
            }
          else
            {
            Send, {] Up}
            GetKeyState, state, Shift
            if state = D
                  Send, +{] Down}
              else
                  Send, {] Down}
            }
      Return
    }
  }
Return

CheckCorrectly:
  TextBanlistCheck := "Путь к банлисту найден"
  TextTFTCheck := "Путь к Frozen Throne.exe найден"
  TextPVPGNCheck := "Путь к w3l.exe найден"
  TextRegTFTCheck := "Файл реестра off.reg найден"
  TextRegPVPGNCheck := "Файл реестра pvpgn.reg найден"  
  GuiControl, 1: -c +cGreen, TextBanlistCheck,
  GuiControl, 1: -c +cGreen, TextTFTCheck,
  GuiControl, 1: -c +cGreen, TextPVPGNCheck,
  GuiControl, 1: -c +cGreen, TextRegTFTCheck,
  GuiControl, 1: -c +cGreen, TextRegPVPGNCheck,

  IfNotExist, %war3path%\WC3Banlist\WC3Banlist.exe
  {
    TextBanlistCheck := "Не обнаружен Банлист. Папка банлиста должна находиться в папке варкрафта (" war3path ") и называться WC3Banlist" 
    GuiControl, 1: +cRed, TextBanlistCheck,
  }
  IfNotExist, %war3path%+\Frozen Throne.exe
  {
    TextTFTCheck := "Не обнаружен Frozen Throne.exe по адресу (" war3path "). Возможно, требуется переустановить игру" 
    GuiControl, 1: +cRed, TextTFTCheck,
  }
  IfNotExist, %war3path%\w3l.exe
  {
    TextPVPGNCheck := "Не обнаружен PVPGN-лаунчер w3l.exe по адресу (" war3path "). Вероятно, он вам не нужен."  
    GuiControl, 1: +cRed, TextPVPGNCheck,
  
  }
  IfNotExist, %war3path%\off.reg
  {
    TextRegTFTCheck := "Не обнаружен файл реестра off.reg по адресу (" war3path "). Вероятно, он вам не нужен."  
    GuiControl, 1: +cRed, TextRegTFTCheck,
  }
  IfNotExist, %war3path%\pvpgn.reg
  {
    TextRegPVPGNCheck := "Не обнаружен файл реестра pvpgn.reg по адресу (" war3path "). Вероятно, он вам не нужен."
    GuiControl, 1: +cRed, TextRegPVPGNCheck,
  }

  GoSub, RefreshGui1
  GoSub, ShowGui1
  GuiControl, 1: Choose, TabGHP, |3
Return


GenerateRegTFT:
  Run, reg export "HKCU\Software\Blizzard Entertainment\Warcraft III" %war3path%\off.reg
  MsgBox, 0,, Файл сгенерирован
  GoSub, CheckCorrectly
Return

GenerateRegPVPGN:
  Run, reg export "HKCU\Software\Blizzard Entertainment\Warcraft III" %war3path%\pvpgn.reg
  MsgBox, 0,, Файл сгенерирован
  GoSub, CheckCorrectly
Return

showhp1label:
 Gosub, SetHotkeys
Return

showhp2label:
 Gosub, SetHotkeys
Return

autorunlabel:
  GuiControlGet, autorun
    if (autorun = 1)
    {
    RegWrite, REG_SZ, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Run, KAHK, %A_ScriptFullPath% /hide
  }
  else
  {
    RegDelete, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Run, KAHK
  }
Return

CheckParameters:
  Loop %0%
  {
      ; For each parameter (or file dropped onto a script):
    Param := %A_Index%
    if Param = /hide
    {
      GoSub, HideGui1
    }
      
  }
Return
    
ExitSub:
;  MsgBox, 4,, Сохранить настройки?
;  IfMsgBox Yes
    GoSub, SaveConfig
ExitApp ; Единственная возможность убийства для скрипта OnExit - использовать ExitApp

Во вложении поста - скомпилированный вариант.

Post's attachments

kahk_1.03b.zip 198.34 kb, 535 downloads since 2008-07-21 

You don't have the permssions to download the attachments of this post.

6

Re: AutoHotkey: Warcraft III

1.03c:
- исправлена вновь возникшая ошибка со сворачиванием в трей при автозагрузке.
- немного изменен принцип отжатия клавиш.

7

Re: AutoHotkey: Warcraft III

1.03d:
- исправлена ошибка с иконкой
- теперь иконка для программы включена в комплект

; Тема на форуме http://forum.script-coding.com/viewtopic.php?pid=11988
; Обсуждение http://forum.script-coding.com/viewtopic.php?id=435

#SingleInstance force        ;force a single instance
                            ;запретить запуск нескольких копий программы
#HotkeyInterval 0        ;disable the warning dialog if a key is held down
                        ;устанавливает частоту активации горячих клавиш
#InstallKeybdHook        ;Forces the unconditional installation of the keyboard hook 
                        ;Безусловно устанавливает обработчик клавиатурных прерываний
#InstallMouseHook        ;
                        ;Безусловно устанавливает обработчик прерываний для мыши
#UseHook On            ;might increase responsiveness of hotkeys
                    ;заставляет обработчик прерываний использовать все горячие клавиши
#MaxThreads 20            ;use 20 (the max) instead of 10 threads
                        ;Задает максимальное количество одновременно исполняемых потоков
SetBatchLines, -1        ;makes the script run at max speed
                        ;Определяет, как быстро будет выполняться скрипт (влияет на коэффициент загрузки центрального процессора)
SetKeyDelay , -1, -1        ;faster response (might be better with -1, 0)
                            ;Задает задержку после каждого нажатия клавиши, посланного командой Send или ControlSend.

;======== Изменяет иконку в трее на иконку варкрафта ========
regread, war, HKEY_CURRENT_USER, Software\Blizzard Entertainment\Warcraft III, Program ; читаем из реестра путь до варкрафта
regread, war3path, HKEY_CURRENT_USER, Software\Blizzard Entertainment\Warcraft III, InstallPathX ; эта переменная будет использоваться дальше
;menu, tray, Icon, %War%, 1, 1 ; меняем иконку

GoSub, GenerateGui1RUS
;GoSub, HideGui1
GoSub, ReadConfig
GoSub, CheckErrorsAndLoadDefaults
GoSub, RefreshGui1
GoSub, SetHotkeys
GoSub, TrayInit
GoSub, autorunlabel
GoSub, CheckCorrectly
GuiControl, 1: Choose, TabGHP, |1
GoSub, CheckParameters
wasalttabed := 1 ; 0 - нужные клавиши ("[" и "]") зажаты, 1 - в альттабе
SetTimer, timer_Warcraft, 500 ; 500 мс = 0.5 секунды


; =====================     global Hotkeys          ============================
^!o:: ; ctrl+alt+o - OFF
        ; определяем параметры запуска
    GuiControlGet, WINDOWED
    GuiControlGet, OPENGL
    GuiControlGet, SWTNL
    param = ""
    If (WINDOWED = 1)
      param := "-window"
    If (OPENGL = 1)
      param := "" param " -opengl"
    If (SWTNL = 1)
      param := "" param " -swtnl"
    
        ; прописываем оф гейтвеи
    Run, %windir%\regedit.exe /s "%war3path%\off.reg" 
    GoSub, load_banlist
        ; проверить существование процесса
    Process, Exist, war3.exe
        ; если Warcraft не запущен, то...
    If ErrorLevel = 0 
      {
        ; запускаем официальный варкрафт
        Run, %war3path%\Frozen Throne.exe %param%
      }
Return 

^!p:: ; ctrl+alt+p - PVPGN
    ; определяем параметры запуска
    GuiControlGet, WINDOWED
    GuiControlGet, OPENGL
    GuiControlGet, SWTNL
    param = ""
    If (WINDOWED = 1)
      param := "-window"
    If (OPENGL = 1)
      param := "" param " -opengl"
    If (SWTNL = 1)
      param := "" param " -swtnl"
        ; прописываем пвпгн гейтвеи
    Run, %windir%\regedit.exe /s "%war3path%\pvpgn.reg"
    GoSub, load_banlist
        ; проверить существование процесса
    Process, Exist, war3.exe
    If ErrorLevel = 0 ; если Warcraft не запущен, то...
      {
            ; запускаем пвпгн варкрафт лаунчер
        Run, %war3path%\w3l.exe %param%, %war3path%\
      }
Return  

load_banlist:
    GuiControlGet, runbanlist
    If (runbanlist = 1)
    {
        Process, Exist, WC3Banlist.exe ; проверить существование процесса banlist'a
        If ErrorLevel = 0 ; если Banlist не запущен, то...
        {
            IfExist, %war3path%\WC3Banlist\WC3Banlist.exe
            {
                    ; запускаем banlist, его папка находится в папке варкрафта и называется WC3Banlist
                Run, %war3path%\WC3Banlist\WC3Banlist.exe
                    ; ждем пока он прогрузится (максимум 10 сек) Если банлист не используем, надо улучшить проверку чтобы не ждать 10 сек
                WinWait, ahk_class TWC3Banlist_Main, ,10
                    ; повторная проверка на то что банлист прогрузился
                WinActivate, ahk_class TWC3Banlist_Main
                    ; (10 сек)
                WinWaitActive, ahk_class TWC3Banlist_Main, ,10
            }
        }
    }
Return

TrayInit:
    Menu, TRAY, Add, 
    Menu, TRAY, Add, Настройки, ShowGui1
    Menu, TRAY, Default, Настройки
Return

timer_Warcraft:
      ; если варик активен
  ifWinActive, ahk_class Warcraft III
  {
      ; Дополнительная и очень эффективная проверка в чате или играем
  if (wasalttabed = 1)
    {
      wasalttabed := 0
        ; Определяем раскладку
      WinGet, WID, ID, A
      WT := DllCall("GetWindowThreadProcessId", "UInt", WID, "UInt", 0)
      LID := DllCall("GetKeyboardLayout", "UInt", WT)
      Russian := LID = 68748313 ? 1 : 0
        ; Если раскладка - Русская
      if Russian 
      {
          if (showhp1 = 1)
            Send, {х Down}
          if (showhp2 = 1)
            Send, {ъ Down}
      }
      else
      {
          if (showhp1 = 1)
            Send, {[ Down}
          if (showhp2 = 1)
            Send, {] Down}
      }
    }
  }
  else
  {
    wasalttabed := 1
  }
Return ; end of timer_Warcraft 

; =============================================================  
; ======================== ini SECTION ========================  
; =============================================================  

ReadConfig:
    Gui, 1:Submit, NoHide
    ;showhp1 = 1
    ;showhp2 = 1
    IniRead, showhp1, %A_ScriptDir%\kahk.ini, General, showhp1
    IniRead, showhp2, %A_ScriptDir%\kahk.ini, General, showhp2

    IniRead, autorun, %A_ScriptDir%\kahk.ini, General, autorun
    IniRead, runbanlist, %A_ScriptDir%\kahk.ini, General, runbanlist

    IniRead, WINDOWED, %A_ScriptDir%\kahk.ini, General, WINDOWED
    IniRead, OPENGL, %A_ScriptDir%\kahk.ini, General, OPENGL
    IniRead, SWTNL, %A_ScriptDir%\kahk.ini, General, SWTNL

    IniRead, usexmouse1, %A_ScriptDir%\kahk.ini, Binds, usexmouse1
    IniRead, usexmouse1A, %A_ScriptDir%\kahk.ini, Binds, usexmouse1A
    IniRead, usexmouse1C, %A_ScriptDir%\kahk.ini, Binds, usexmouse1C
    IniRead, usexmouse1S, %A_ScriptDir%\kahk.ini, Binds, usexmouse1S

    IniRead, usexmouse2, %A_ScriptDir%\kahk.ini, Binds, usexmouse2
    IniRead, usexmouse2A, %A_ScriptDir%\kahk.ini, Binds, usexmouse2A
    IniRead, usexmouse2C, %A_ScriptDir%\kahk.ini, Binds, usexmouse2C
    IniRead, usexmouse2S, %A_ScriptDir%\kahk.ini, Binds, usexmouse2S

    IniRead, usescrollup, %A_ScriptDir%\kahk.ini, Binds, usescrollup
    IniRead, usescrollupS, %A_ScriptDir%\kahk.ini, Binds, usescrollupS
    IniRead, usescrollupA, %A_ScriptDir%\kahk.ini, Binds, usescrollupA
    IniRead, usescrollupC, %A_ScriptDir%\kahk.ini, Binds, usescrollupC

    IniRead, usescrolldown, %A_ScriptDir%\kahk.ini, Binds, usescrolldown
    IniRead, usescrolldownS, %A_ScriptDir%\kahk.ini, Binds, usescrolldownS
    IniRead, usescrolldownA, %A_ScriptDir%\kahk.ini, Binds, usescrolldownA
    IniRead, usescrolldownC, %A_ScriptDir%\kahk.ini, Binds, usescrolldownC

    IniRead, usemouse3, %A_ScriptDir%\kahk.ini, Binds, usemouse3
    IniRead, usemouse3S, %A_ScriptDir%\kahk.ini, Binds, usemouse3S
    IniRead, usemouse3A, %A_ScriptDir%\kahk.ini, Binds, usemouse3A
    IniRead, usemouse3C, %A_ScriptDir%\kahk.ini, Binds, usemouse3C

    IniRead, keyxmouse1, %A_ScriptDir%\kahk.ini, Binds, keyxmouse1
    IniRead, keyxmouse2, %A_ScriptDir%\kahk.ini, Binds, keyxmouse2
    IniRead, keyscrollup, %A_ScriptDir%\kahk.ini, Binds, keyscrollup
    IniRead, keyscrolldown, %A_ScriptDir%\kahk.ini, Binds, keyscrolldown
    IniRead, keymouse3, %A_ScriptDir%\kahk.ini, Binds, keymouse3

    IniRead, hkoff, %A_ScriptDir%\kahk.ini, Options, hkoff
    IniRead, hkpvpgn, %A_ScriptDir%\kahk.ini, Options, hkpvpgn

Return

CheckErrorsAndLoadDefaults:
  if showhp1 = ERROR
    showhp1 := 1
  if showhp2 = ERROR
    showhp2 := 1
  if hkoff = ERROR
    hkoff := "^!S"
  if hkpvpgn = ERROR
    hkpvpgn := "^!W"

  if usexmouse1 = ERROR
    usexmouse1 := 1
  if usexmouse1A = ERROR
    usexmouse1A := 0
  if usexmouse1C = ERROR
    usexmouse1C := 0
  if usexmouse1S = ERROR
    usexmouse1S := 0

  if usexmouse2 = ERROR
    usexmouse2 := 1
  if usexmouse2A = ERROR
    usexmouse2A := 0
  if usexmouse2C = ERROR
    usexmouse2C := 0
  if usexmouse2S = ERROR
    usexmouse2S := 0

  if usescrollup = ERROR
    usescrollup := 1
  if usescrollupS = ERROR
    usescrollupS := 0
  if usescrollupA = ERROR
    usescrollupA := 0
  if usescrollupC = ERROR
    usescrollupC := 0

  if usescrolldown = ERROR
    usescrolldown := 1
  if usescrolldownS = ERROR
    usescrolldownS := 0
  if usescrolldownA = ERROR
    usescrolldownA := 0
  if usescrolldownC = ERROR
    usescrolldownC := 0

  if usemouse3 = ERROR
    usemouse3 := 1
  if usemouse3S = ERROR
    usemouse3S := 0
  if usemouse3A = ERROR
    usemouse3A := 0
  if usemouse3C = ERROR
    usemouse3C := 0

  if keyxmouse1 = ERROR
    keyxmouse1 := "Numpad4"
  if keyxmouse2 = ERROR
    keyxmouse2 := "Numpad7"
  if keyscrollup = ERROR
    keyscrollup := "Numpad5"
  if keyscrolldown = ERROR
    keyscrolldown := "Numpad2"
  if keymouse3 = ERROR
    keymouse3 := "Numpad8"

  if autorun = ERROR
    autorun := 1
  if runbanlist = ERROR
    runbanlist := 1
  if WINDOWED = ERROR
    WINDOWED := 0
  if OPENGL = ERROR
    OPENGL := 0
  if SWTNL = ERROR
    SWTNL := 0
Return

SaveConfig:
    Gui, 1:Submit, NoHide
    IniWrite, %showhp1%, %A_ScriptDir%\kahk.ini, General, showhp1
    IniWrite, %showhp2%, %A_ScriptDir%\kahk.ini, General, showhp2

    IniWrite, %autorun%, %A_ScriptDir%\kahk.ini, General, autorun
    IniWrite, %runbanlist%, %A_ScriptDir%\kahk.ini, General, runbanlist

    IniWrite, %WINDOWED%, %A_ScriptDir%\kahk.ini, General, WINDOWED
    IniWrite, %OPENGL%, %A_ScriptDir%\kahk.ini, General, OPENGL
    IniWrite, %SWTNL%, %A_ScriptDir%\kahk.ini, General, SWTNL

    IniWrite, %usexmouse1%, %A_ScriptDir%\kahk.ini, Binds, usexmouse1
    IniWrite, %usexmouse1A%, %A_ScriptDir%\kahk.ini, Binds, usexmouse1A
    IniWrite, %usexmouse1C%, %A_ScriptDir%\kahk.ini, Binds, usexmouse1C
    IniWrite, %usexmouse1S%, %A_ScriptDir%\kahk.ini, Binds, usexmouse1S

    IniWrite, %usexmouse2%, %A_ScriptDir%\kahk.ini, Binds, usexmouse2
    IniWrite, %usexmouse2A%, %A_ScriptDir%\kahk.ini, Binds, usexmouse2A
    IniWrite, %usexmouse2C%, %A_ScriptDir%\kahk.ini, Binds, usexmouse2C
    IniWrite, %usexmouse2S%, %A_ScriptDir%\kahk.ini, Binds, usexmouse2S

    IniWrite, %usescrollup%, %A_ScriptDir%\kahk.ini, Binds, usescrollup
    IniWrite, %usescrollupS%, %A_ScriptDir%\kahk.ini, Binds, usescrollupS
    IniWrite, %usescrollupA%, %A_ScriptDir%\kahk.ini, Binds, usescrollupA
    IniWrite, %usescrollupC%, %A_ScriptDir%\kahk.ini, Binds, usescrollupC

    IniWrite, %usescrolldown%, %A_ScriptDir%\kahk.ini, Binds, usescrolldown
    IniWrite, %usescrolldownS%, %A_ScriptDir%\kahk.ini, Binds, usescrolldownS
    IniWrite, %usescrolldownA%, %A_ScriptDir%\kahk.ini, Binds, usescrolldownA
    IniWrite, %usescrolldownC%, %A_ScriptDir%\kahk.ini, Binds, usescrolldownC

    IniWrite, %usemouse3%, %A_ScriptDir%\kahk.ini, Binds, usemouse3
    IniWrite, %usemouse3S%, %A_ScriptDir%\kahk.ini, Binds, usemouse3S
    IniWrite, %usemouse3A%, %A_ScriptDir%\kahk.ini, Binds, usemouse3A
    IniWrite, %usemouse3C%, %A_ScriptDir%\kahk.ini, Binds, usemouse3C

    IniWrite, %keyxmouse1%, %A_ScriptDir%\kahk.ini, Binds, keyxmouse1
    IniWrite, %keyxmouse2%, %A_ScriptDir%\kahk.ini, Binds, keyxmouse2
    IniWrite, %keyscrollup%, %A_ScriptDir%\kahk.ini, Binds, keyscrollup
    IniWrite, %keyscrolldown%, %A_ScriptDir%\kahk.ini, Binds, keyscrolldown
    IniWrite, %keymouse3%, %A_ScriptDir%\kahk.ini, Binds, keymouse3

    IniWrite, %hkoff%, %A_ScriptDir%\kahk.ini, Options, hkoff
    IniWrite, %hkpvpgn%, %A_ScriptDir%\kahk.ini, Options, hkpvpgn
    GoSub, SetHotkeys
    GoSub, autorunlabel
Return

; =============================================================  
; ======================== Gui SECTION ========================  
; =============================================================  

GenerateGui1RUS:
  Gui, 1:Add, Button, x6 y347 w80 h30 gSaveConfig, Сохранить
  Gui, 1:Add, Button, x96 y347 w150 h30 gHideGui1, Свернуть
  Gui, 1:Add, Button, x256 y347 w60 h30 gExitSub, Закрыть
  Gui, 1:Add, Tab, x0 y0 w330 h390 vTabGHP, Основные|Бинды|Пути
  Gui, 1:Tab, Основные
  Gui, 1:Add, GroupBox, x6 y27 w310 h50 , Показывать здоровье
  Gui, 1:Add, CheckBox, x16 y47 w140 h20 vshowhp1 gshowhp1label, союзников
  Gui, 1:Add, CheckBox, x166 y47 w140 h20 vshowhp2 gshowhp2label, врагов
  Gui, 1:Add, CheckBox, x6 y87 w310 h20 vautorun gautorunlabel, Автозапуск программы
  Gui, 1:Add, CheckBox, x6 y117 w310 h20 vrunbanlist, Запускать банлист
  Gui, 1:Add, GroupBox, x6 y147 w310 h120 , Ключи запуска:
  Gui, 1:Add, CheckBox, x16 y167 w260 h20 vWINDOWED, Windowed Mode
  Gui, 1:Add, CheckBox, x16 y197 w260 h20 vOPENGL, OpenGL Video Mode
  Gui, 1:Add, CheckBox, x16 y227 w260 h20 vSWTNL, Software Transform and Lighting Video Mode
  Gui, 1:Add, Button, x6 y277 w310 h20 gCheckCorrectly, Проверить пути
  Gui, 1:Add, Button, x6 y297 w310 h20 gGenerateRegTFT, Сгенерировать файл реестра под официалку
  Gui, 1:Add, Button, x6 y317 w310 h20 gGenerateRegPVPGN, Сгенерировать файл реестра под ПВПГН
  Gui, 1:Tab, Бинды
  Gui, 1:Add, GroupBox, x117 y27 w30 h167 +Center, alt
  Gui, 1:Add, GroupBox, x147 y27 w30 h167 +Center, shift
  Gui, 1:Add, GroupBox, x177 y27 w30 h167 +Center, ctrl
  Gui, 1:Add, CheckBox, x6 y47 w110 h20 vusexmouse1 gSetHotkeys, X mouse button 1
  Gui, 1:Add, CheckBox, x156 y47 w15 h20 vusexmouse1S gSetHotkeys,
  Gui, 1:Add, CheckBox, x186 y47 w15 h20 vusexmouse1C gSetHotkeys,
  Gui, 1:Add, CheckBox, x126 y47 w15 h20 vusexmouse1A gSetHotkeys,
  Gui, 1:Add, Text, x216 y47 w60 h20 vkeyxmouse1 gSetHotkeys, 
  Gui, 1:Add, Button, x286 y47 w40 h20 gSetXMouse1, опр.
  Gui, 1:Add, CheckBox, x6 y77 w110 h20 vusexmouse2 gSetHotkeys, X mouse button 2
  Gui, 1:Add, CheckBox, x156 y77 w15 h20 vusexmouse2S gSetHotkeys,
  Gui, 1:Add, CheckBox, x186 y77 w15 h20 vusexmouse2C gSetHotkeys,
  Gui, 1:Add, CheckBox, x126 y77 w15 h20 vusexmouse2A gSetHotkeys,
  Gui, 1:Add, Text, x216 y77 w60 h20 vkeyxmouse2 gSetHotkeys, 
  Gui, 1:Add, Button, x286 y77 w40 h20 gSetXMouse2, опр.
  Gui, 1:Add, CheckBox, x6 y107 w110 h20 vusescrollup gSetHotkeys, Колесо вверх
  Gui, 1:Add, CheckBox, x156 y107 w15 h20 vusescrollupS gSetHotkeys,
  Gui, 1:Add, CheckBox, x186 y107 w15 h20 vusescrollupC gSetHotkeys,
  Gui, 1:Add, CheckBox, x126 y107 w15 h20 vusescrollupA gSetHotkeys,
  Gui, 1:Add, Text, x216 y107 w60 h20 vkeyscrollup gSetHotkeys, 
  Gui, 1:Add, Button, x286 y107 w40 h20 gSetScrollUp, опр.
  Gui, 1:Add, CheckBox, x6 y137 w110 h20 vusescrolldown gSetHotkeys, Колесо вниз
  Gui, 1:Add, CheckBox, x156 y137 w15 h20 vusescrolldownS gSetHotkeys,
  Gui, 1:Add, CheckBox, x186 y137 w15 h20 vusescrolldownC gSetHotkeys,
  Gui, 1:Add, CheckBox, x126 y137 w15 h20 vusescrolldownA gSetHotkeys,
  Gui, 1:Add, Text, x216 y137 w60 h20 vkeyscrolldown gSetHotkeys, 
  Gui, 1:Add, Button, x286 y137 w40 h20 gSetScrollDown, опр.
  Gui, 1:Add, CheckBox, x6 y167 w110 h20 vusemouse3 gSetHotkeys, Mid mouse button
  Gui, 1:Add, CheckBox, x156 y167 w15 h20 vusemouse3S gSetHotkeys,
  Gui, 1:Add, CheckBox, x186 y167 w15 h20 vusemouse3C gSetHotkeys,
  Gui, 1:Add, CheckBox, x126 y167 w15 h20 vusemouse3A gSetHotkeys,
  Gui, 1:Add, Text, x216 y167 w60 h20 vkeymouse3 gSetHotkeys, 
  Gui, 1:Add, Button, x286 y167 w40 h20 gSetMouse3, опр.
  Gui, 1:Add, Text, x6 y207 w310 h20 , Клавиша запуска оф. варкрафта: Ctrl+Alt+O
  Gui, 1:Add, Text, x6 y227 w310 h20 , Клавиша запуска не-оф. варкрафта: Ctrl+Alt+P
  Gui, 1:Tab, Пути
  Gui, 1:Add, Button, x46 y27 w230 h20 gCheckCorrectly, Обновить
  Gui, 1:Add, Text, x6 y57 w310 h30 vTextBanlistCheck, 
  Gui, 1:Add, Text, x6 y97 w310 h30 vTextTFTCheck, 
  Gui, 1:Add, Text, x6 y137 w310 h30 vTextPVPGNCheck, 
  Gui, 1:Add, Text, x6 y177 w310 h30 vTextRegTFTCheck, 
  Gui, 1:Add, Text, x6 y217 w310 h30 vTextRegPVPGNCheck, 
  Gui, 1:Show, x181 y111 h390 w330, Kiber's autohotkey script for Warcraft 3
Return

; refreshes Gui. Kiber is a noob, and he does not know other methods
RefreshGui1:
  GuiControl, 1: , showhp1, %showhp1%
  GuiControl, 1: , showhp2, %showhp2%
  GuiControl, 1: , hkoff, %hkoff%
  GuiControl, 1: , hkpvpgn, %hkpvpgn%
  GuiControl, 1: , autorun, %autorun%
  GuiControl, 1: , runbanlist, %runbanlist%
  GuiControl, 1: , WINDOWED, %WINDOWED%
  GuiControl, 1: , OPENGL, %OPENGL%
  GuiControl, 1: , SWTNL, %SWTNL%
  GuiControl, 1: , TextBanlistCheck, %TextBanlistCheck%
  GuiControl, 1: , TextTFTCheck, %TextTFTCheck%
  GuiControl, 1: , TextPVPGNCheck, %TextPVPGNCheck%
  GuiControl, 1: , TextRegTFTCheck, %TextRegTFTCheck%
  GuiControl, 1: , TextRegPVPGNCheck, %TextRegPVPGNCheck%
  GoSub, RefreshGui1XMouse1
  GoSub, RefreshGui1XMouse2
  GoSub, RefreshGui1ScrollUP
  GoSub, RefreshGui1ScrollDown
  GoSub, RefreshGui1Mouse3
  Gui, 1:Submit, NoHide
Return

RefreshGui1XMouse1:
  GuiControl, 1: , usexmouse1, %usexmouse1%
  GuiControl, 1: , usexmouse1A, %usexmouse1A%
  GuiControl, 1: , usexmouse1C, %usexmouse1C%
  GuiControl, 1: , usexmouse1S, %usexmouse1S%
  GuiControl, 1: , keyxmouse1, %keyxmouse1%
Return

RefreshGui1XMouse2:
  GuiControl, 1: , usexmouse2, %usexmouse2%
  GuiControl, 1: , usexmouse2A, %usexmouse2A%
  GuiControl, 1: , usexmouse2C, %usexmouse2C%
  GuiControl, 1: , usexmouse2S, %usexmouse2S%
  GuiControl, 1: , keyxmouse2, %keyxmouse2%
Return

RefreshGui1ScrollUP:
  GuiControl, 1: , usescrollup, %usescrollup%
  GuiControl, 1: , usescrollupS, %usescrollupS%
  GuiControl, 1: , usescrollupA, %usescrollupA%
  GuiControl, 1: , usescrollupC, %usescrollupC%
  GuiControl, 1: , keyscrollup, %keyscrollup%
Return

RefreshGui1ScrollDown:
  GuiControl, 1: , usescrolldown, %usescrolldown%
  GuiControl, 1: , usescrolldownS, %usescrolldownS%
  GuiControl, 1: , usescrolldownA, %usescrolldownA%
  GuiControl, 1: , usescrolldownC, %usescrolldownC%
  GuiControl, 1: , keyscrolldown, %keyscrolldown%
Return

RefreshGui1Mouse3:
  GuiControl, 1: , usemouse3, %usemouse3%
  GuiControl, 1: , usemouse3S, %usemouse3S%
  GuiControl, 1: , usemouse3A, %usemouse3A%
  GuiControl, 1: , usemouse3C, %usemouse3C%
  GuiControl, 1: , keymouse3, %keymouse3%
Return


ShowGui1:
  Gui, 1:Show
Return

GuiClose:
  Gui, 1:Hide
Return

GuiEscape:
  Gui, 1:Hide
Return

HideGui1:
  Gui, 1:Hide
Return

SetXMouse1:
  tmpHotkey = keyxmouse1
  tmpHotkeyS = usexmouse1S
  tmpHotkeyC = usexmouse1C
  tmpHotkeyA = usexmouse1A
  GoSub, ChangeHotKey
Return

SetXMouse2:
  tmpHotkey = keyxmouse2
  tmpHotkeyS = usexmouse2S
  tmpHotkeyC = usexmouse2C
  tmpHotkeyA = usexmouse2A
  GoSub, ChangeHotKey
Return

SetScrollUp:
  tmpHotkey = keyscrollup
  tmpHotkeyS = usescrollupS
  tmpHotkeyC = usescrollupC
  tmpHotkeyA = usescrollupA
  GoSub, ChangeHotKey
Return

SetScrollDown:
  tmpHotkey = keyscrolldown
  tmpHotkeyS = usescrolldownS
  tmpHotkeyC = usescrolldownC
  tmpHotkeyA = usescrolldownA
  GoSub, ChangeHotKey
Return

SetMouse3:
  tmpHotkey = keymouse3
  tmpHotkeyS = usemouse3S
  tmpHotkeyC = usemouse3C
  tmpHotkeyA = usemouse3A
  GoSub, ChangeHotKey
Return

ChangeHotKey:
  Gui, 1:Hide
  Gui, 2:Add, Hotkey, x6 y7 w130 h20 vtmpNeedToBeParsed, 
  Gui, 2:Add, Button, x6 y27 w130 h30 gChangeHotkeyClose, Готово
  Gui, 2:Show, h63 w142, Enter hotkey
Return

ChangeHotkeyClose:
; ^ = ctrl + = shift ! = alt
; очередность: shift, ctrl, alt
  GuiControlGet, tmpNeedToBeParsed
  IfInString, tmpNeedToBeParsed, +
  {
    %tmpHotkeyS% = 1
    GuiControl, 1: , %tmpHotkeyS%, 1
  }
  else
  {
    %tmpHotkeyS% = 0
    GuiControl, 1: , %tmpHotkeyS%, 0
  }

  IfInString, tmpNeedToBeParsed, ^
  {
    %tmpHotkeyC% = 1
    GuiControl, 1: , %tmpHotkeyC%, 1
  }
  else
  {
    %tmpHotkeyC% = 0
    GuiControl, 1: , %tmpHotkeyC%, 0
  }

  IfInString, tmpNeedToBeParsed, !
  {
    %tmpHotkeyA% = 1
    GuiControl, 1: , %tmpHotkeyA%, 1
  }
  else
  {
    %tmpHotkeyA% = 0
    GuiControl, 1: , %tmpHotkeyA%, 0
  }

  num := 1+%tmpHotkeyS%+%tmpHotkeyC%+%tmpHotkeyA%
  %tmpHotkey% := SubStr(tmpNeedToBeParsed, num)
  TMP := SubStr(tmpNeedToBeParsed, num)
  GuiControl, 1: , %tmpHotkey%, %TMP%

  Gui, 1:Submit, NoHide
  Gui, 1:Show
  GuiControl, 1: Choose, TabGHP, |2
  GoSub, SetHotkeys
  Gui, 2:Destroy
Return

; =============================================================  
; ======================== Main  SECTION ====================== 
; =============================================================  

SetHotkeys:
  Gui, 1:Submit, NoHide
  
  StringLower, keyxmouse1, keyxmouse1
  StringLower, keyxmouse2, keyxmouse2
  StringLower, keyscrollup, keyscrollup
  StringLower, keyscrolldown, keyscrolldown
  StringLower, keymouse3, keymouse3

  keyxmouse1ToPush := "{" keyxmouse1 "}"
  if (usexmouse1A = 1)
    keyxmouse1ToPush := "{Alt Down}" keyxmouse1ToPush "{Alt Up}"
  if (usexmouse1C = 1)
    keyxmouse1ToPush := "{Control Down}" keyxmouse1ToPush "{Control Up}"
  if (usexmouse1S = 1)
    keyxmouse1ToPush := "{Shift Down}" keyxmouse1ToPush "{Shift Up}"

  keyxmouse2ToPush := "{" keyxmouse2 "}"
  if (usexmouse2A = 1)
    keyxmouse2ToPush := "{Alt Down}" keyxmouse2ToPush "{Alt Up}"
  if (usexmouse2C = 1)
    keyxmouse2ToPush := "{Control Down}" keyxmouse2ToPush "{Control Up}"
  if (usexmouse2S = 1)
    keyxmouse2ToPush := "{Shift Down}" keyxmouse2ToPush "{Shift Up}"

  keyscrollupToPush := "{" keyscrollup "}"
  if (usescrollupA = 1)
    keyscrollupToPush := "{Alt Down}" keyscrollupToPush "{Alt Up}"
  if (usescrollupC = 1)
    keyscrollupToPush := "{Control Down}" keyscrollupToPush "{Control Up}"
  if (usescrollupS = 1)
    keyscrollupToPush := "{Shift Down}" keyscrollupToPush "{Shift Up}"

  keyscrolldownToPush := "{" keyscrolldown "}"
  if (usescrolldownA = 1)
    keyscrolldownToPush := "{Alt Down}" keyscrolldownToPush "{Alt Up}"
  if (usescrolldownC = 1)
    keyscrolldownToPush := "{Control Down}" keyscrolldownToPush "{Control Up}"
  if (usescrolldownS = 1)
    keyscrolldownToPush := "{Shift Down}" keyscrolldownToPush "{Shift Up}"

  keymouse3ToPush := "{" keymouse3 "}"
  if (usemouse3A = 1)
    keymouse3ToPush := "{Alt Down}" keymouse3ToPush "{Alt Up}"
  if (usemouse3C = 1)
    keymouse3ToPush := "{Control Down}" keymouse3ToPush "{Control Up}"
  if (usemouse3S = 1)
    keymouse3ToPush := "{Shift Down}" keymouse3ToPush "{Shift Up}"
    
;  MsgBox, %keyxmouse1ToPush%
;  MsgBox, %keyxmouse2ToPush%
;  MsgBox, %keyscrollupToPush%
;  MsgBox, %keyscrolldownToPush%
;  MsgBox, %keymouse3ToPush%


  #IfWinActive, ahk_class Warcraft III
  {
    XButton1::
      if (usexmouse1 = 1)
      {
        SendPlay {Blind}%keyxmouse1ToPush%
      }
      else
      {
        Send {XButton1}
      }
    Return

    XButton2::
      if (usexmouse2 = 1)
      {
        SendPlay {Blind}%keyxmouse2ToPush%
      }
      else
      {
        Send {XButton2}
      }
    Return

    MButton::
      if (usemouse3 = 1)
      {
        SendPlay {Blind}%keymouse3ToPush%
      }
      else
      {
        Send {MButton}
      }
    Return

    WheelUp::
      if (usescrollup = 1)
      {
        SendPlay {Blind}%keyscrollupToPush%
      }
      else
      {
        Send {WheelUp}
      }
    Return

    WheelDown::
      if (usescrolldown = 1)
      {
        SendPlay {Blind}%keyscrolldownToPush%
      }
      else
      {
        Send {WheelDown}
      }
    Return

    if (showhp1 = 1)
    {
      *[::
              ; Определяем раскладку
          WinGet, WID, ID, A
          WT := DllCall("GetWindowThreadProcessId", "UInt", WID, "UInt", 0)
          LID := DllCall("GetKeyboardLayout", "UInt", WT)
          Russian := LID = 68748313 ? 1 : 0
              ; Если раскладка - Русская
          if Russian
            { 
            Send, {х Up}
            GetKeyState, state, Shift
            if state = D
                  Send, +{х Down}
            else
                  Send, {х Down}
            }
          else
            {
            Send, {[ Up}
            GetKeyState, state, Shift
            if state = D
                  Send, +{[ Down}
            else
                  Send, {[ Down}
            }
      Return
    }
      
    if (showhp2 = 1)
    {
      *]::
          WinGet, WID, ID, A
          WT := DllCall("GetWindowThreadProcessId", "UInt", WID, "UInt", 0)
          LID := DllCall("GetKeyboardLayout", "UInt", WT)
          Russian := LID = 68748313 ? 1 : 0
          if Russian
            { 
            Send, {ъ Up}
            GetKeyState, state, Shift
            if state = D
                  Send, +{ъ Down}
              else
                  Send, {ъ Down}
            }
          else
            {
            Send, {] Up}
            GetKeyState, state, Shift
            if state = D
                  Send, +{] Down}
              else
                  Send, {] Down}
            }
      Return
    }
  }
Return

CheckCorrectly:
  TextBanlistCheck := "Путь к банлисту найден"
  TextTFTCheck := "Путь к Frozen Throne.exe найден"
  TextPVPGNCheck := "Путь к w3l.exe найден"
  TextRegTFTCheck := "Файл реестра off.reg найден"
  TextRegPVPGNCheck := "Файл реестра pvpgn.reg найден"  
  GuiControl, 1: -c +cGreen, TextBanlistCheck,
  GuiControl, 1: -c +cGreen, TextTFTCheck,
  GuiControl, 1: -c +cGreen, TextPVPGNCheck,
  GuiControl, 1: -c +cGreen, TextRegTFTCheck,
  GuiControl, 1: -c +cGreen, TextRegPVPGNCheck,

  IfNotExist, %war3path%\WC3Banlist\WC3Banlist.exe
  {
    TextBanlistCheck := "Не обнаружен Банлист. Папка банлиста должна находиться в папке варкрафта (" war3path ") и называться WC3Banlist" 
    GuiControl, 1: +cRed, TextBanlistCheck,
  }
  IfNotExist, %war3path%+\Frozen Throne.exe
  {
    TextTFTCheck := "Не обнаружен Frozen Throne.exe по адресу (" war3path "). Возможно, требуется переустановить игру" 
    GuiControl, 1: +cRed, TextTFTCheck,
  }
  IfNotExist, %war3path%\w3l.exe
  {
    TextPVPGNCheck := "Не обнаружен PVPGN-лаунчер w3l.exe по адресу (" war3path "). Вероятно, он вам не нужен."  
    GuiControl, 1: +cRed, TextPVPGNCheck,
  
  }
  IfNotExist, %war3path%\off.reg
  {
    TextRegTFTCheck := "Не обнаружен файл реестра off.reg по адресу (" war3path "). Вероятно, он вам не нужен."  
    GuiControl, 1: +cRed, TextRegTFTCheck,
  }
  IfNotExist, %war3path%\pvpgn.reg
  {
    TextRegPVPGNCheck := "Не обнаружен файл реестра pvpgn.reg по адресу (" war3path "). Вероятно, он вам не нужен."
    GuiControl, 1: +cRed, TextRegPVPGNCheck,
  }

  GoSub, RefreshGui1
  GoSub, ShowGui1
  GuiControl, 1: Choose, TabGHP, |3
Return


GenerateRegTFT:
  Run, reg export "HKCU\Software\Blizzard Entertainment\Warcraft III" %war3path%\off.reg
  MsgBox, 0,, Файл сгенерирован
  GoSub, CheckCorrectly
Return

GenerateRegPVPGN:
  Run, reg export "HKCU\Software\Blizzard Entertainment\Warcraft III" %war3path%\pvpgn.reg
  MsgBox, 0,, Файл сгенерирован
  GoSub, CheckCorrectly
Return

showhp1label:
 Gosub, SetHotkeys
Return

showhp2label:
 Gosub, SetHotkeys
Return

autorunlabel:
  GuiControlGet, autorun
    if (autorun = 1)
    {
    RegWrite, REG_SZ, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Run, KAHK, %A_ScriptFullPath% /hide
  }
  else
  {
    RegDelete, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Run, KAHK
  }
Return

CheckParameters:
  Loop %0%
  {
      ; For each parameter (or file dropped onto a script):
    Param := %A_Index%
    if Param = /hide
    {
      GoSub, HideGui1
    }
      
  }
Return
    
ExitSub:
;  MsgBox, 4,, Сохранить настройки?
;  IfMsgBox Yes
    GoSub, SaveConfig
ExitApp ; Единственная возможность убийства для скрипта OnExit - использовать ExitApp

Страничка проекта: http://manch.naxx.ru/viewtopic.php?f=2&t=3

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.