Активация скрипта по команде из INI файла

CaJlaT

07.11.2024 14:55
Автор темы
Модератор
2,832
2,624
в общем, мне нужно считывать команду из INI файла, и чтобы при её вводе скрипт активировался...

AutoHotKey:
global FileConfig := % A_MyDocuments "\NeverBind.ini"


IniRead, BindsCount, %FileConfig%, Config, BindsCount
loop % BindsCount
{
    IniRead, BindCmd%A_Index%, %Fileconfig%, Bind%A_Index%, BindCmd%A_Index%
}


:?:/%BindCmd1%::
{
    send {Escape} ;Чтобы чат закрылся
    sleep 200
    IniRead, Count, %FileConfig%, Bind1, Count, 1
    Loop % Count ; Цикл на кол-во строк бинда
    {
        IniRead, Msg%A_Index%, %FileConfig%, Bind1, Msg%A_Index%
        IniRead, Delay%A_Index%, %FileConfig%, Bind1, Delay%A_Index%
        IniRead, Enter%A_Index%, %FileConfig%, Bind1, Enter%A_Index%
        If(Msg%A_Index% >= 0)
        {
            Msg := Msg%A_Index%
            If(Enter%A_Index% == 1)
            {
                send {t}%Msg%{enter}
                sleep % Delay%A_Index%
            }
            If(Enter%A_Index% == 2)
            {
                send {t}%Msg%
                sleep % Delay%A_Index%
            }
        }
    }
}
(Бинд для майнкруфта)
Проблема заключается в том, что допустим в INI команда 123, мы вводим /123 и ничего....
Но когда мы вводим /%BindCmd%, то скрипт идёт дальше
 
Последнее редактирование:

Smer4

Известный
425
51
Могу предложить такой вариант
AutoHotKey:
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
FileRead, info, new.ini
MsgBox, % info
RegExMatch(info, "command = (.*) :", command)

Loop{
    Input, loggs, V,{Enter}
    IfInString, loggs, % command1
    {
        goto, start
    }
    Sleep, 30
}
return
start: ; тут пойдет твой код
MsgBox, 1

Upd

AutoHotKey:
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
FileRead, info, new.ini
MsgBox, % info
RegExMatch(info, "command = (.*) :", command) ; 1ая команда, переменная command1
RegExMatch(info, "command1 = (.*) :", bind) ; 2ая команда, переменная bind1

Loop{
    Input, loggs, V,{Enter} ; считываем до нажатия enter
    IfInString, loggs, % command1 ; если в loggs есть команда из ini
    {
        goto, start ; идем выполнять код из метки start
    }
    IfInString, loggs, % bind1
    {
        goto, bind
    }
    Sleep, 30
}
return
start: ; тут пойдет твой код
MsgBox, 1
return

bind:
MsgBox, 2
return

Код:
command = /start :
command1 = start2 :
 
Последнее редактирование:

CaJlaT

07.11.2024 14:55
Автор темы
Модератор
2,832
2,624
Ещё вопрос. в Ini несколько биндов будет, которые добавляются через gui (и там каждя отдельная переменная под команду, в зависимости от номера бинда).
Как считать ВСЕ команды через твой способ?
т.е пользователь изменяет кол-во биндов
41977
Помоги пожалуйста😟
AutoHotKey:
global, PlayBind := 0

While (i <= BindsCount)
{
    Input, loggs, V,{Enter} ; считываем до нажатия enter
    IfInString, loggs, % BindCmd%A_Index% ; если в loggs есть команда из ini
    {
        PlayBind := %A_Index%
        goto, Bind ; идем выполнять код из метки Bind
    }
    Sleep, 30
    i++
    if (i >= BindsCount)
        i := 0
}
Bind:
{
    send {Escape} 
    sleep 200
    IniRead, Count, %FileConfig%, Bind%PlayBind%, Count, 1
    Loop % Count ; Цикл на кол-во строк бинда
    {
        IniRead, Msg%A_Index%, %FileConfig%, Bind%PlayBind%, Msg%A_Index%
        IniRead, Delay%A_Index%, %FileConfig%, Bind%PlayBind%, Delay%A_Index%
        IniRead, Enter%A_Index%, %FileConfig%, Bind%PlayBind%, Enter%A_Index%
        If(Msg%A_Index% >= 0)
        {
            Msg := Msg%A_Index%
            If(Enter%A_Index% == 1)
            {
                send {t}%Msg%{enter}
                sleep % Delay%A_Index%
            }
            If(Enter%A_Index% == 2)
            {
                send {t}%Msg%
                sleep % Delay%A_Index%
            }
        }
    }
сделал так, не работает
 
Последнее редактирование:

CaJlaT

07.11.2024 14:55
Автор темы
Модератор
2,832
2,624

Smer4

Известный
425
51
еще получилось вот так, но все равно нужно подготавливать метки для команд.
AutoHotKey:
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
FileRead, info, new.ini
i := 0
num := 0

Loop, Parse, info, `.
{
    MsgBox, % A_LoopField
    RegExMatch( A_LoopField, "(.*) : (.*)", out)
    command%i% := out1 ; команда
    marks%i% := out2 ; куда надо перейти, есть command
    i++
    num++ ; сколько всего элементов command, marks
}

i := 0
Loop { ; Цикл в котором будет проверяться есть ли указанная в ini команда в скрипте
    IfInString, command%i%, /wills ; если в массиве есть команда /wills
        goto, marks%i% ; есть есть команда /wills то будет переход на marks0
    IfInString, command%i%, /dark
        goto, marks%i% ; есть есть команда /dark то будет переход на marks1 и т.д
    i++
    if(i > num + 1) ; обнуление i если он вышел за пределы массива.
        i := 0
}
return

marks0:
{
    MsgBox, 1
    return
}

marks1:
{
    MsgBox, 2
    return
}
текст в ini файле
Код:
/will : command . /dark : bind
 
Последнее редактирование:

CaJlaT

07.11.2024 14:55
Автор темы
Модератор
2,832
2,624
еще получилось вот так, но все равно нужно подготавливать метки для команд.
AutoHotKey:
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
FileRead, info, new.ini
i := 0
num := 0

Loop, Parse, info, `.
{
    MsgBox, % A_LoopField
    RegExMatch( A_LoopField, "(.*) : (.*)", out)
    command%i% := out1 ; команда
    marks%i% := out2 ; куда надо перейти, есть command
    i++
    num++ ; сколько всего элементов command, marks
}

i := 0
Loop { ; Цикл в котором будет проверяться есть ли указанная в ini команда в скрипте
    IfInString, command%i%, /wills ; если в массиве есть команда /wills
        goto, marks%i% ; есть есть команда /wills то будет переход на marks0
    IfInString, command%i%, /dark
        goto, marks%i% ; есть есть команда /dark то будет переход на marks1 и т.д
    i++
    if(i > num + 1) ; обнуление i если он вышел за пределы массива.
        i := 0
}
return

marks0:
{
    MsgBox, 1
    return
}

marks1:
{
    MsgBox, 2
    return
}
текст в ini файле
Код:
/will : command . /dark : bind
ты не понял, юзер должен САМ менять команды, и нажатие этих команд должно тетектится и происходить действие, которое указал юзер... (биндер для майнкрафта)
42866
и на данный момент команду сменить нельзя, и т.к тот, кому я писал скрипт сказал 3 основные команды, то они есть в скрипте, а далее /bind4, /bind5 и так до /bind25 (ограничение команд из-за этой проблемы)

AutoHotKey:
:?:/мут::
{
    PlayBind := 3
send {Enter}
    sleep 200
    IniRead, Count, %FileConfig%, Bind%PlayBind%, Count, 1
    Loop % Count
    {
        sleep 100
        IniRead, Msg%A_Index%, %FileConfig%, Bind%PlayBind%, Msg%A_Index%
        IniRead, Delay%A_Index%, %FileConfig%, Bind%PlayBind%, Delay%A_Index%
        IniRead, Enter%A_Index%, %FileConfig%, Bind%PlayBind%, Enter%A_Index%
        If(Msg%A_Index% >= 0)
        {
            Msg := Msg%A_Index%
            If(Enter%A_Index% == 1)
            {
            send {t}
                sleep 100
            send %Msg%{enter}
                sleep % Delay%A_Index%
            }
            If(Enter%A_Index% == 2)
            {
            send {T}
                sleep 100
                send %Msg%
                sleep % Delay%A_Index%
            }
        }
    }
    return
}
:?:/% BindCmd4::
{
    PlayBind := 4
send {Enter}
    sleep 200
    IniRead, Count, %FileConfig%, Bind%PlayBind%, Count, 1
    Loop % Count
    {
        sleep 100
        IniRead, Msg%A_Index%, %FileConfig%, Bind%PlayBind%, Msg%A_Index%
        IniRead, Delay%A_Index%, %FileConfig%, Bind%PlayBind%, Delay%A_Index%
        IniRead, Enter%A_Index%, %FileConfig%, Bind%PlayBind%, Enter%A_Index%
        If(Msg%A_Index% >= 0)
        {
            Msg := Msg%A_Index%
            If(Enter%A_Index% == 1)
            {
            send {t}
                sleep 100
            send %Msg%{enter}
                sleep % Delay%A_Index%
            }
            If(Enter%A_Index% == 2)
            {
            send {T}
                sleep 100
                send %Msg%
                sleep % Delay%A_Index%
            }
        }
    }
    return
}
;
; тут ещё команды....
;
:?:/bind25::
{
    PlayBind := 25
send {Enter}
    sleep 200
    IniRead, Count, %FileConfig%, Bind%PlayBind%, Count, 1
    Loop % Count
    {
        sleep 100
        IniRead, Msg%A_Index%, %FileConfig%, Bind%PlayBind%, Msg%A_Index%
        IniRead, Delay%A_Index%, %FileConfig%, Bind%PlayBind%, Delay%A_Index%
        IniRead, Enter%A_Index%, %FileConfig%, Bind%PlayBind%, Enter%A_Index%
        If(Msg%A_Index% >= 0)
        {
            Msg := Msg%A_Index%
            If(Enter%A_Index% == 1)
            {
            send {t}
                sleep 100
            send %Msg%{enter}
                sleep % Delay%A_Index%
            }
            If(Enter%A_Index% == 2)
            {
            send {T}
                sleep 100
                send %Msg%
                sleep % Delay%A_Index%
            }
        }
    }
    return
}
 

Smer4

Известный
425
51
ты не понял, юзер должен САМ менять команды, и нажатие этих команд должно тетектится и происходить действие, которое указал юзер... (биндер для майнкрафта)
и на данный момент команду сменить нельзя, и т.к тот, кому я писал скрипт сказал 3 основные команды, то они есть в скрипте, а далее /bind4, /bind5 и так до /bind25 (ограничение команд из-за этой проблемы)

AutoHotKey:
:?:/мут::
{
    PlayBind := 3
send {Enter}
    sleep 200
    IniRead, Count, %FileConfig%, Bind%PlayBind%, Count, 1
    Loop % Count
    {
        sleep 100
        IniRead, Msg%A_Index%, %FileConfig%, Bind%PlayBind%, Msg%A_Index%
        IniRead, Delay%A_Index%, %FileConfig%, Bind%PlayBind%, Delay%A_Index%
        IniRead, Enter%A_Index%, %FileConfig%, Bind%PlayBind%, Enter%A_Index%
        If(Msg%A_Index% >= 0)
        {
            Msg := Msg%A_Index%
            If(Enter%A_Index% == 1)
            {
            send {t}
                sleep 100
            send %Msg%{enter}
                sleep % Delay%A_Index%
            }
            If(Enter%A_Index% == 2)
            {
            send {T}
                sleep 100
                send %Msg%
                sleep % Delay%A_Index%
            }
        }
    }
    return
}
:?:/% BindCmd4::
{
    PlayBind := 4
send {Enter}
    sleep 200
    IniRead, Count, %FileConfig%, Bind%PlayBind%, Count, 1
    Loop % Count
    {
        sleep 100
        IniRead, Msg%A_Index%, %FileConfig%, Bind%PlayBind%, Msg%A_Index%
        IniRead, Delay%A_Index%, %FileConfig%, Bind%PlayBind%, Delay%A_Index%
        IniRead, Enter%A_Index%, %FileConfig%, Bind%PlayBind%, Enter%A_Index%
        If(Msg%A_Index% >= 0)
        {
            Msg := Msg%A_Index%
            If(Enter%A_Index% == 1)
            {
            send {t}
                sleep 100
            send %Msg%{enter}
                sleep % Delay%A_Index%
            }
            If(Enter%A_Index% == 2)
            {
            send {T}
                sleep 100
                send %Msg%
                sleep % Delay%A_Index%
            }
        }
    }
    return
}
;
; тут ещё команды....
;
:?:/bind25::
{
    PlayBind := 25
send {Enter}
    sleep 200
    IniRead, Count, %FileConfig%, Bind%PlayBind%, Count, 1
    Loop % Count
    {
        sleep 100
        IniRead, Msg%A_Index%, %FileConfig%, Bind%PlayBind%, Msg%A_Index%
        IniRead, Delay%A_Index%, %FileConfig%, Bind%PlayBind%, Delay%A_Index%
        IniRead, Enter%A_Index%, %FileConfig%, Bind%PlayBind%, Enter%A_Index%
        If(Msg%A_Index% >= 0)
        {
            Msg := Msg%A_Index%
            If(Enter%A_Index% == 1)
            {
            send {t}
                sleep 100
            send %Msg%{enter}
                sleep % Delay%A_Index%
            }
            If(Enter%A_Index% == 2)
            {
            send {T}
                sleep 100
                send %Msg%
                sleep % Delay%A_Index%
            }
        }
    }
    return
}
Тоесть чел ввел команду, а у него что-то в чат выводится и сделать добавление юзером команд и значений?
Еще недоделаный вариант, есть задатки удаление и добавление команд в ini, чтение команд из ini и активация по командам текста. Уже в ломину писать ес честно, но завтра мб попробую доделать. gui инерфейс делать точно не буду
AutoHotKey:
#NoEnv


AddCommand(way ,command, text){  ; путь до ini с командами (включая название ini), команда которую нужно добавить, текст для команды
    if(!FileExist( way) ; если файла не существует -1
        return, -1
    FileRead, txt, % way
    if(txt == "") ; если равно ничему то -1
        return, -1
    FileAppend, `. %command%, %way% ; дополняем ini новой командой
    return, 1 ; ErrorLevel 1, тоесть успешно.
}

DeleteCommand(way, command) ; путь до ini с командами, команда которую надо удалить
{
    if(!FileExist( way) ; если файла не существует -1
        return, -1
    FileRead, txt, % way
    IfNotInString, txt, % command ; ; если нет указанной команды -1
        return, -1
    RegExMatch(txt, "(.*). " command ". (.*)", out) ; отсеиваем ненужную команду
    FileAppend, % out1 " " out2, % way  ; записываем то что осталось
    return, 1 ; ErrorLevel 1, тоесть успешно.
}



fileread, command, commands.ini ; читаем команды
Commands := [] ; создаем массив для рассортировки команд по массиву
i := 0

Loop, parse, command, `. ; сортируем в массив
{
    Commands[i] := A_LoopField
    i++
}
num := i ; Сколько всего элементов в массиве


i := 0
Loop{
    Input, loggs, V,{Enter} ; берем все что нажал пользыватель до нажатия enter
    IfInString, loggs, Commands[i] ; есть ли там комманда из commands[i]
    {
        if(!FileExist(text/%i%.ini)) ; если нету текста для этого бинда
        {
            MsgBox, File not exist
            break
        }
        FileRead, descript, texts/%i%.ini  ; если есть то читаем что там написано
        
        SendInput, % descript ; вводим текст из ini
    }
    i++
    if(i == num + 1) ; если массив закончился обнуляем  i
        i := 0
    Sleep, 30
}
 
Последнее редактирование:

CaJlaT

07.11.2024 14:55
Автор темы
Модератор
2,832
2,624
Тоесть чел ввел команду, а у него что-то в чат выводится и сделать добавление юзером команд и значений?
Еще недоделаный вариант, есть задатки удаление и добавление команд в ini, чтение команд из ini и активация по командам текста. Уже в ломину писать ес честно, но завтра мб попробую доделать. gui инерфейс делать точно не буду
AutoHotKey:
#NoEnv


AddCommand(way ,command, text){  ; путь до ini с командами (включая название ini), команда которую нужно добавить, текст для команды
    if(!FileExist( way) ; если файла не существует -1
        return, -1
    FileRead, txt, % way
    if(txt == "") ; если равно ничему то -1
        return, -1
    FileAppend, `. %command%, %way% ; дополняем ini новой командой
    return, 1 ; ErrorLevel 1, тоесть успешно.
}

DeleteCommand(way, command) ; путь до ini с командами, команда которую надо удалить
{
    if(!FileExist( way) ; если файла не существует -1
        return, -1
    FileRead, txt, % way
    IfNotInString, txt, % command ; ; если нет указанной команды -1
        return, -1
    RegExMatch(txt, "(.*). " command ". (.*)", out) ; отсеиваем ненужную команду
    FileAppend, % out1 " " out2, % way  ; записываем то что осталось
    return, 1 ; ErrorLevel 1, тоесть успешно.
}



fileread, command, commands.ini ; читаем команды
Commands := [] ; создаем массив для рассортировки команд по массиву
i := 0

Loop, parse, command, `. ; сортируем в массив
{
    Commands[i] := A_LoopField
    i++
}
num := i ; Сколько всего элементов в массиве


i := 0
Loop{
    Input, loggs, V,{Enter} ; берем все что нажал пользыватель до нажатия enter
    IfInString, loggs, Commands[i] ; есть ли там комманда из commands[i]
    {
        if(!FileExist(text/%i%.ini)) ; если нету текста для этого бинда
        {
            MsgBox, File not exist
            break
        }
        FileRead, descript, texts/%i%.ini  ; если есть то читаем что там написано
       
        SendInput, % descript ; вводим текст из ini
    }
    i++
    if(i == num + 1) ; если массив закончился обнуляем  i
        i := 0
    Sleep, 30
}
Так дело в том, что не работает только изменение команды и считывание её нажатия, а так биндер готов
 

CaJlaT

07.11.2024 14:55
Автор темы
Модератор
2,832
2,624
Уже в ломину писать ес честно, но завтра мб попробую доделать. gui инерфейс делать точно не буду
почему не работает?
AutoHotKey:
#NoEnv
SendMode Input
#UseHook
#SingleInstance, force
global PlayBind := 0
global i := 0
global BindsForDelete := []
global BindCmd := []
global FileConfig := % A_MyDocuments "\NeverBind.ini"
global num := 0
IniRead, BindsCount, %FileConfig%, Config, BindsCount
Gui, 1:  Font, S8 CDefault Bold, Verdana
Gui, 1: Font, S8 CDefault Bold Italic, Verdana
Gui, 1: Add, Text, x2 y10 w260 h20 , Универсальный биндер для NeverMine
Gui, 1: Add, ListView, x7 y30 w250 h270 vMyListView gMyListView Grid NoSort, Команда|Красткое описание
SetTimer, ReloadList, 300
Gui, 1: Add, Button, x2 y300 w130 h40 gListAdd, Добавить
Gui, 1: Add, Button, x132 y300 w130 h40 gListRemove, Удалить
Gui, 1: Show, , NeverBind
return
HKtoKey(HKey)
{
    StringUpper,    Hkey,    HKey
    StringReplace,    HKey,    HKey,    +,                ` Shift` ,        All
    StringReplace,    HKey,    HKey,    !,                ` Alt` ,        All
    StringReplace,    HKey,    HKey,    ^,                ` Ctrl` ,        All
    StringReplace,    HKey,    HKey,    Numpad0,        ` Num 0` ,        All
    StringReplace,    HKey,    HKey,    Numpad1,        ` Num 1` ,        All
    StringReplace,    HKey,    HKey,    Numpad2,        ` Num 2` ,        All
    StringReplace,    HKey,    HKey,    Numpad3,        ` Num 3` ,        All
    StringReplace,    HKey,    HKey,    Numpad4,        ` Num 4` ,        All
    StringReplace,    HKey,    HKey,    Numpad5,        ` Num 5` ,        All
    StringReplace,    HKey,    HKey,    Numpad6,        ` Num 6` ,        All
    StringReplace,    HKey,    HKey,    Numpad7,        ` Num 7` ,        All
    StringReplace,    HKey,    HKey,    Numpad8,        ` Num 8` ,        All
    StringReplace,    HKey,    HKey,    Numpad9,        ` Num 9` ,        All
    StringReplace,    HKey,    HKey,    NumpadDiv,        ` Num/` ,        All
    StringReplace,    HKey,    HKey,    NumpadDot,        ` Num.` ,        All
    StringReplace,    HKey,    HKey,    NumpadAdd,        ` Num+` ,        All
    StringReplace,    HKey,    HKey,    NumpadSub,        ` Num-` ,        All
    StringReplace,    HKey,    HKey,    NumpadEnter,    ` Num Enter` ,    All
    StringReplace,    HKey,    HKey,    &,                ,                All
    StringReplace,    HKey,    HKey,    ` ` ,            ` ,                All
    SubStr(HKey, 2, -1)
    RegExMatch(HKey, "(\w)")
    return HKey
}
MyListView:
if A_GuiEvent = DoubleClick
{
    if( A_EventInfo == 0 )
    return
    ListViewTarget := A_EventInfo
    goto BindEdit
}
return
BindEdit:
{
    id := ListViewTarget
    IniRead, Count, %FileConfig%, Bind%id%, Count
    Gui, 2: Font, S8 CDefault Bold Italic, Verdana
    Gui, 2: Font, S8 CDefault Bold Italic, Verdana
    Gui, 2: Add, Text, x2 y0 w130 h20 , Описание:
    Gui, 2: Add, Edit, x2 y20 w200 h20 vBindName, % BindName
    Gui, 2: Add, Text, x2 y40  h20 , Команда [Не Меняется!]:
    IniRead, BindCmd, %FileConfig%, Bind%id%, BindCmd
    if(BindCmd == "ERROR")
    BindCmd := ""
    Gui, 2: Add, DropDownList, x-18 y-60 w200 h100 , DropDownList
    Gui, 2: Add, Text, x212 y0 w40 h20 , Строк:
    Gui, 2: Add, Edit, x212 y20 w60 h20 vCount, % Count
    Gui, 2: Add, Edit, x2 y60 w110 h20 vBindCmd, % BindCmd
    Gui, 2: Add, Button, x272 y20 w40 h20 gCountEdit, Изм..
    Gui, 2: Add, Text, xs, Сообщение:`t`t       Задержка Enter
    Loop, % Count
    {
        t := 30*A_Index
        IniRead, Msg%A_Index%, %FileConfig%, Bind%id%, Msg%A_Index%
        If(Msg%A_Index% == "ERROR")
        Msg%A_Index% := ""
        Gui, 2: Add, Edit, xs w168 r1 vMsg%A_Index%, % Msg%A_Index%
        IniRead, Delay%A_Index%, %FileConfig%, Bind%id%, Delay%A_Index%
        if Delay%A_Index% is not number
        Delay%A_Index% := 1000
        Gui, 2: Add, Edit, x+1 yp w70 r1 vDelay%A_Index%, % Delay%A_Index%
        IniRead, Enter%A_Index%, %FileConfig%, Bind%id%, Enter%A_Index%
        num := Enter%A_Index%
        Gui, 2: Add, DropDownList, x+1 yp w70 vEnterText%A_Index% Choose%num%, Enter|Без Enter
    }
    Gui, 2: Add, Button, x2 y+3 w312 gBindSave, Сохранить
    Gui, 2: Show, w313, Edit - %BindName%
    return
}
ListAdd:
{
    IniRead, BindsCount, %FileConfig%, Config, BindsCount
    if(BindsCount >= 25)
    {
        MsgBox, 16, NeverBind, Ошибка!`nНельзя создавать больше 25 биндов!
        return
    }
    BindsCount += 1
    Count := 1
    IniWrite, %BindsCount%, %FileConfig%, Config, BindsCount
    IniWrite, %Count%, %FileConfig%, Bind%BindsCount%, Count
    IniWrite, New Bind, %FileConfig%, Bind%BindsCount%, BindName
    iniWrite, bind%BindsCount%, %FileConfig%, Bind%BindsCount%, BindCmd
    IniRead, BindCmd, %FileCOnfig%, Bind%BindsCount%, BindCmd
    IniRead, BindName, %FileCOnfig%, Bind%BindsCount%, BindName
    LV_Add("", BindCmd, BindName)
    return
}
ListRemove:
{
    if( !LV_GetNext(1) )
    return
    MsgBox, 36, Удаление биндов, Вы действительно хотите удалить выделенные бинды?
    IfMsgBox No
    return
    i := 0
    BindsForDelete := []
    Loop
    {
        i := LV_GetNext(i - 1)
        if not i
        break
        tmpvar := i + A_Index - 1
        BindsForDelete[A_Index] := tmpvar
        LV_Delete(i)
        IniDelete, %FileConfig%, Bind%tmpvar%
    }
    OptimizeBinds(BindsForDelete)
    return
}
OptimizeBinds(Array)
{
    k := 0
    Loop % BindsCount
    {
        i := A_Index
        j := A_Index - k
        if( inArray(Array, i) )
        {
            k++
            continue
        }
        if( k == 0 )
        continue
        IniRead, tmpvar, %FileConfig%, Bind%i%, BindCmd, % ""
        IniWrite, % tmpvar <> "ERROR" ? tmpvar : "", %FileConfig%, Bind%j%, BindCmd
        IniRead, tmpvar, %FileConfig%, Bind%i%, BindName, % ""
        IniWrite, % tmpvar <> "ERROR" ? tmpvar : "", %FileConfig%, Bind%j%, BindName
        IniRead, tmpvar, %FileConfig%, Bind%i%, Count, % ""
        IniWrite, % tmpvar <> "ERROR" ? tmpvar : "", %FileConfig%, Bind%j%, Count
        Loop, % tmpvar
        {
            IniRead, tmpvar, %FileConfig%, Bind%i%, Msg%A_Index%, % ""
            IniWrite, % tmpvar <> "ERROR" ? tmpvar : "", %FileConfig%, Bind%j%, Msg%A_Index%
            IniRead, tmpvar, %FileConfig%, Bind%i%, Enter%A_Index%, % ""
            IniWrite, % tmpvar <> "ERROR" ? tmpvar : "", %FileConfig%, Bind%j%, Enter%A_Index%
            IniRead, tmpvar, %FileConfig%, Bind%i%, Delay%A_Index%, % ""
            IniWrite, % tmpvar <> "ERROR" ? tmpvar : "", %FileConfig%, Bind%j%, Delay%A_Index%
        }
        IniDelete, %FileConfig%, Bind%i%
        GuiControl,, MyProgress, +%p%
    }
    BindsCount -= k
    IniWrite, %BindsCount%, %FileConfig%, config, BindsCount
    return 1
}
inArray(Array, Search)
{
    for Key, Val in Array
    {
        if (Val = Search)
        {
            Return 1
        }
    }
    Return 0
}
CountEdit:
{
    tmpvar := Count
    Gui, 2: Submit, NoHide
    if Count is not integer
    {
        MsgBox, 16, Ошибка, Неверно указано количество строк.
        return
    }
    if(Count < tmpvar)
    Loop, % tmpvar - Count
    {
        i := tmpvar + 1 - A_Index
        IniDelete, %FileConfig%, Bind%ListViewTarget%, Msg%i%
        IniDelete, %FileConfig%, Bind%ListViewTarget%, Enter%i%
        IniDelete, %FileConfig%, Bind%ListViewTarget%, Delay%i%
    }
    IniWrite, % Count, %FileConfig%, Bind%ListViewTarget%, Count
    Gui, 2: Destroy
    goto BindEdit
    return
}
BindSave:
{
    id := ListViewTarget
    Gui, 2: Submit, NoHide
    IniWrite, % Count, %FileConfig%, Bind%id%, Count
    if Count is not number
    Count := 0
    IniWrite, % BindName, %FileConfig%, Bind%id%, BindName
    IniWrite, % BindCmd, %FileConfig%, Bind%id%, BindCmd
    j := 0
    Loop, % Count
    {
        i := A_Index - j
        if !StrLen(Msg%A_Index%)
        {
            j++
            continue
        }
        if(EnterText%A_Index% == "Enter")
        Enter%A_Index% := 1
        else if(EnterText%A_Index% == "Без Enter")
        Enter%A_Index% := 2
        if(Msg%A_Index% contains "{!}")
        {
            Msg%A_Index% := RegExReplace(Msg%A_Index%, "{!}", "!")
        }
        if(Msg%A_Index% contains !)
        {
            Msg%A_Index% := RegExReplace(Msg%A_Index%, "!", "{!}")
        }
        IniWrite, % """" Msg%A_Index% """", %FileConfig%, Bind%id%, Msg%i%
        IniWrite, % Enter%A_Index%, %FileConfig%, Bind%id%, Enter%A_Index%
        tmpvar := ""
        IniWrite, % Delay%A_Index%, %FileConfig%, Bind%id%, Delay%i%
    }
    if( j > 0 )
    {
        IniRead, Count, %FileConfig%, Bind%id%, Count
        IniWrite, % Count - j, %FileConfig%, Bind%id%, Count
    }
    Gui, 2: Destroy
    Gui, 1: -Disabled
    Gui, 1: Show
    SetTimer, ReloadList, 300
    return
}
i := 0
Loop{
    Input, loggs, V,{Enter} ; берем все что нажал пользыватель до нажатия enter
    IfInString, loggs, Commands[i] ; есть ли там комманда из commands[i]
    {
        PlayBind := i
        send {Enter}
        sleep 200
        IniRead, Count, %FileConfig%, Bind%PlayBind%, Count, 1
        Loop % Count
        {
            sleep 100
            IniRead, Msg%A_Index%, %FileConfig%, Bind%PlayBind%, Msg%A_Index%
            IniRead, Delay%A_Index%, %FileConfig%, Bind%PlayBind%, Delay%A_Index%
            IniRead, Enter%A_Index%, %FileConfig%, Bind%PlayBind%, Enter%A_Index%
            If(Msg%A_Index% >= 0)
            {
                Msg := Msg%A_Index%
                If(Enter%A_Index% == 1)
                {
                    send {t}
                    sleep 100
                    send %Msg%{enter}
                    sleep % Delay%A_Index%
                }
                If(Enter%A_Index% == 2)
                {
                    send {T}
                    sleep 100
                    send %Msg%
                    sleep % Delay%A_Index%
                }
            }
        }
        return
    }
    i++
    if(i == BindsCount + 1) ; если массив закончился обнуляем  i
        i := 0
    Sleep, 30
}
ReloadList:
{
    Loop % LV_GetCount()
    {
        LV_Delete(1)
    }
    IniRead BindsCount, %FileConfig%, config, BindsCount, 0
    If(BindsCount <= 0 )
    {
        BindsCount += 1
        Count := 1
        IniWrite, %BindsCount%, %FileConfig%, Config, BindsCount
        IniWrite, %Count%, %FileConfig%, Bind%BindsCount%, Count
        if(BindsCount == 1)
    {
        iniWrite, bind1, %FileConfig%, Bind%BindsCount%, BindCmd
    }
        IniWrite, New Bind, %FileConfig%, Bind%BindsCount%, BindName
        LV_Add("", BindCmd, BindName)
        return
    }
    else
    {
        Loop, % BindsCount
        {
            IniRead, BindName, %FileConfig%, Bind%A_Index%, BindName
            IniRead, BindCmd %FileConfig%, Bind%A_Index%, BindCmd, bind%A_Index%
            LV_Add("", (BindCmd == "ERROR" ? "" : BindCmd), BindName)
        }
    }
    SetTimer ReloadList, Off
    Return
}
GuiClose:
ExitApp
43058

43059
 

Smer4

Известный
425
51
почему не работает?
AutoHotKey:
#NoEnv
SendMode Input
#UseHook
#SingleInstance, force
global PlayBind := 0
global i := 0
global BindsForDelete := []
global BindCmd := []
global FileConfig := % A_MyDocuments "\NeverBind.ini"
global num := 0
IniRead, BindsCount, %FileConfig%, Config, BindsCount
Gui, 1:  Font, S8 CDefault Bold, Verdana
Gui, 1: Font, S8 CDefault Bold Italic, Verdana
Gui, 1: Add, Text, x2 y10 w260 h20 , Универсальный биндер для NeverMine
Gui, 1: Add, ListView, x7 y30 w250 h270 vMyListView gMyListView Grid NoSort, Команда|Красткое описание
SetTimer, ReloadList, 300
Gui, 1: Add, Button, x2 y300 w130 h40 gListAdd, Добавить
Gui, 1: Add, Button, x132 y300 w130 h40 gListRemove, Удалить
Gui, 1: Show, , NeverBind
return
HKtoKey(HKey)
{
    StringUpper,    Hkey,    HKey
    StringReplace,    HKey,    HKey,    +,                ` Shift` ,        All
    StringReplace,    HKey,    HKey,    !,                ` Alt` ,        All
    StringReplace,    HKey,    HKey,    ^,                ` Ctrl` ,        All
    StringReplace,    HKey,    HKey,    Numpad0,        ` Num 0` ,        All
    StringReplace,    HKey,    HKey,    Numpad1,        ` Num 1` ,        All
    StringReplace,    HKey,    HKey,    Numpad2,        ` Num 2` ,        All
    StringReplace,    HKey,    HKey,    Numpad3,        ` Num 3` ,        All
    StringReplace,    HKey,    HKey,    Numpad4,        ` Num 4` ,        All
    StringReplace,    HKey,    HKey,    Numpad5,        ` Num 5` ,        All
    StringReplace,    HKey,    HKey,    Numpad6,        ` Num 6` ,        All
    StringReplace,    HKey,    HKey,    Numpad7,        ` Num 7` ,        All
    StringReplace,    HKey,    HKey,    Numpad8,        ` Num 8` ,        All
    StringReplace,    HKey,    HKey,    Numpad9,        ` Num 9` ,        All
    StringReplace,    HKey,    HKey,    NumpadDiv,        ` Num/` ,        All
    StringReplace,    HKey,    HKey,    NumpadDot,        ` Num.` ,        All
    StringReplace,    HKey,    HKey,    NumpadAdd,        ` Num+` ,        All
    StringReplace,    HKey,    HKey,    NumpadSub,        ` Num-` ,        All
    StringReplace,    HKey,    HKey,    NumpadEnter,    ` Num Enter` ,    All
    StringReplace,    HKey,    HKey,    &,                ,                All
    StringReplace,    HKey,    HKey,    ` ` ,            ` ,                All
    SubStr(HKey, 2, -1)
    RegExMatch(HKey, "(\w)")
    return HKey
}
MyListView:
if A_GuiEvent = DoubleClick
{
    if( A_EventInfo == 0 )
    return
    ListViewTarget := A_EventInfo
    goto BindEdit
}
return
BindEdit:
{
    id := ListViewTarget
    IniRead, Count, %FileConfig%, Bind%id%, Count
    Gui, 2: Font, S8 CDefault Bold Italic, Verdana
    Gui, 2: Font, S8 CDefault Bold Italic, Verdana
    Gui, 2: Add, Text, x2 y0 w130 h20 , Описание:
    Gui, 2: Add, Edit, x2 y20 w200 h20 vBindName, % BindName
    Gui, 2: Add, Text, x2 y40  h20 , Команда [Не Меняется!]:
    IniRead, BindCmd, %FileConfig%, Bind%id%, BindCmd
    if(BindCmd == "ERROR")
    BindCmd := ""
    Gui, 2: Add, DropDownList, x-18 y-60 w200 h100 , DropDownList
    Gui, 2: Add, Text, x212 y0 w40 h20 , Строк:
    Gui, 2: Add, Edit, x212 y20 w60 h20 vCount, % Count
    Gui, 2: Add, Edit, x2 y60 w110 h20 vBindCmd, % BindCmd
    Gui, 2: Add, Button, x272 y20 w40 h20 gCountEdit, Изм..
    Gui, 2: Add, Text, xs, Сообщение:`t`t       Задержка Enter
    Loop, % Count
    {
        t := 30*A_Index
        IniRead, Msg%A_Index%, %FileConfig%, Bind%id%, Msg%A_Index%
        If(Msg%A_Index% == "ERROR")
        Msg%A_Index% := ""
        Gui, 2: Add, Edit, xs w168 r1 vMsg%A_Index%, % Msg%A_Index%
        IniRead, Delay%A_Index%, %FileConfig%, Bind%id%, Delay%A_Index%
        if Delay%A_Index% is not number
        Delay%A_Index% := 1000
        Gui, 2: Add, Edit, x+1 yp w70 r1 vDelay%A_Index%, % Delay%A_Index%
        IniRead, Enter%A_Index%, %FileConfig%, Bind%id%, Enter%A_Index%
        num := Enter%A_Index%
        Gui, 2: Add, DropDownList, x+1 yp w70 vEnterText%A_Index% Choose%num%, Enter|Без Enter
    }
    Gui, 2: Add, Button, x2 y+3 w312 gBindSave, Сохранить
    Gui, 2: Show, w313, Edit - %BindName%
    return
}
ListAdd:
{
    IniRead, BindsCount, %FileConfig%, Config, BindsCount
    if(BindsCount >= 25)
    {
        MsgBox, 16, NeverBind, Ошибка!`nНельзя создавать больше 25 биндов!
        return
    }
    BindsCount += 1
    Count := 1
    IniWrite, %BindsCount%, %FileConfig%, Config, BindsCount
    IniWrite, %Count%, %FileConfig%, Bind%BindsCount%, Count
    IniWrite, New Bind, %FileConfig%, Bind%BindsCount%, BindName
    iniWrite, bind%BindsCount%, %FileConfig%, Bind%BindsCount%, BindCmd
    IniRead, BindCmd, %FileCOnfig%, Bind%BindsCount%, BindCmd
    IniRead, BindName, %FileCOnfig%, Bind%BindsCount%, BindName
    LV_Add("", BindCmd, BindName)
    return
}
ListRemove:
{
    if( !LV_GetNext(1) )
    return
    MsgBox, 36, Удаление биндов, Вы действительно хотите удалить выделенные бинды?
    IfMsgBox No
    return
    i := 0
    BindsForDelete := []
    Loop
    {
        i := LV_GetNext(i - 1)
        if not i
        break
        tmpvar := i + A_Index - 1
        BindsForDelete[A_Index] := tmpvar
        LV_Delete(i)
        IniDelete, %FileConfig%, Bind%tmpvar%
    }
    OptimizeBinds(BindsForDelete)
    return
}
OptimizeBinds(Array)
{
    k := 0
    Loop % BindsCount
    {
        i := A_Index
        j := A_Index - k
        if( inArray(Array, i) )
        {
            k++
            continue
        }
        if( k == 0 )
        continue
        IniRead, tmpvar, %FileConfig%, Bind%i%, BindCmd, % ""
        IniWrite, % tmpvar <> "ERROR" ? tmpvar : "", %FileConfig%, Bind%j%, BindCmd
        IniRead, tmpvar, %FileConfig%, Bind%i%, BindName, % ""
        IniWrite, % tmpvar <> "ERROR" ? tmpvar : "", %FileConfig%, Bind%j%, BindName
        IniRead, tmpvar, %FileConfig%, Bind%i%, Count, % ""
        IniWrite, % tmpvar <> "ERROR" ? tmpvar : "", %FileConfig%, Bind%j%, Count
        Loop, % tmpvar
        {
            IniRead, tmpvar, %FileConfig%, Bind%i%, Msg%A_Index%, % ""
            IniWrite, % tmpvar <> "ERROR" ? tmpvar : "", %FileConfig%, Bind%j%, Msg%A_Index%
            IniRead, tmpvar, %FileConfig%, Bind%i%, Enter%A_Index%, % ""
            IniWrite, % tmpvar <> "ERROR" ? tmpvar : "", %FileConfig%, Bind%j%, Enter%A_Index%
            IniRead, tmpvar, %FileConfig%, Bind%i%, Delay%A_Index%, % ""
            IniWrite, % tmpvar <> "ERROR" ? tmpvar : "", %FileConfig%, Bind%j%, Delay%A_Index%
        }
        IniDelete, %FileConfig%, Bind%i%
        GuiControl,, MyProgress, +%p%
    }
    BindsCount -= k
    IniWrite, %BindsCount%, %FileConfig%, config, BindsCount
    return 1
}
inArray(Array, Search)
{
    for Key, Val in Array
    {
        if (Val = Search)
        {
            Return 1
        }
    }
    Return 0
}
CountEdit:
{
    tmpvar := Count
    Gui, 2: Submit, NoHide
    if Count is not integer
    {
        MsgBox, 16, Ошибка, Неверно указано количество строк.
        return
    }
    if(Count < tmpvar)
    Loop, % tmpvar - Count
    {
        i := tmpvar + 1 - A_Index
        IniDelete, %FileConfig%, Bind%ListViewTarget%, Msg%i%
        IniDelete, %FileConfig%, Bind%ListViewTarget%, Enter%i%
        IniDelete, %FileConfig%, Bind%ListViewTarget%, Delay%i%
    }
    IniWrite, % Count, %FileConfig%, Bind%ListViewTarget%, Count
    Gui, 2: Destroy
    goto BindEdit
    return
}
BindSave:
{
    id := ListViewTarget
    Gui, 2: Submit, NoHide
    IniWrite, % Count, %FileConfig%, Bind%id%, Count
    if Count is not number
    Count := 0
    IniWrite, % BindName, %FileConfig%, Bind%id%, BindName
    IniWrite, % BindCmd, %FileConfig%, Bind%id%, BindCmd
    j := 0
    Loop, % Count
    {
        i := A_Index - j
        if !StrLen(Msg%A_Index%)
        {
            j++
            continue
        }
        if(EnterText%A_Index% == "Enter")
        Enter%A_Index% := 1
        else if(EnterText%A_Index% == "Без Enter")
        Enter%A_Index% := 2
        if(Msg%A_Index% contains "{!}")
        {
            Msg%A_Index% := RegExReplace(Msg%A_Index%, "{!}", "!")
        }
        if(Msg%A_Index% contains !)
        {
            Msg%A_Index% := RegExReplace(Msg%A_Index%, "!", "{!}")
        }
        IniWrite, % """" Msg%A_Index% """", %FileConfig%, Bind%id%, Msg%i%
        IniWrite, % Enter%A_Index%, %FileConfig%, Bind%id%, Enter%A_Index%
        tmpvar := ""
        IniWrite, % Delay%A_Index%, %FileConfig%, Bind%id%, Delay%i%
    }
    if( j > 0 )
    {
        IniRead, Count, %FileConfig%, Bind%id%, Count
        IniWrite, % Count - j, %FileConfig%, Bind%id%, Count
    }
    Gui, 2: Destroy
    Gui, 1: -Disabled
    Gui, 1: Show
    SetTimer, ReloadList, 300
    return
}
i := 0
Loop{
    Input, loggs, V,{Enter} ; берем все что нажал пользыватель до нажатия enter
    IfInString, loggs, Commands[i] ; есть ли там комманда из commands[i]
    {
        PlayBind := i
        send {Enter}
        sleep 200
        IniRead, Count, %FileConfig%, Bind%PlayBind%, Count, 1
        Loop % Count
        {
            sleep 100
            IniRead, Msg%A_Index%, %FileConfig%, Bind%PlayBind%, Msg%A_Index%
            IniRead, Delay%A_Index%, %FileConfig%, Bind%PlayBind%, Delay%A_Index%
            IniRead, Enter%A_Index%, %FileConfig%, Bind%PlayBind%, Enter%A_Index%
            If(Msg%A_Index% >= 0)
            {
                Msg := Msg%A_Index%
                If(Enter%A_Index% == 1)
                {
                    send {t}
                    sleep 100
                    send %Msg%{enter}
                    sleep % Delay%A_Index%
                }
                If(Enter%A_Index% == 2)
                {
                    send {T}
                    sleep 100
                    send %Msg%
                    sleep % Delay%A_Index%
                }
            }
        }
        return
    }
    i++
    if(i == BindsCount + 1) ; если массив закончился обнуляем  i
        i := 0
    Sleep, 30
}
ReloadList:
{
    Loop % LV_GetCount()
    {
        LV_Delete(1)
    }
    IniRead BindsCount, %FileConfig%, config, BindsCount, 0
    If(BindsCount <= 0 )
    {
        BindsCount += 1
        Count := 1
        IniWrite, %BindsCount%, %FileConfig%, Config, BindsCount
        IniWrite, %Count%, %FileConfig%, Bind%BindsCount%, Count
        if(BindsCount == 1)
    {
        iniWrite, bind1, %FileConfig%, Bind%BindsCount%, BindCmd
    }
        IniWrite, New Bind, %FileConfig%, Bind%BindsCount%, BindName
        LV_Add("", BindCmd, BindName)
        return
    }
    else
    {
        Loop, % BindsCount
        {
            IniRead, BindName, %FileConfig%, Bind%A_Index%, BindName
            IniRead, BindCmd %FileConfig%, Bind%A_Index%, BindCmd, bind%A_Index%
            LV_Add("", (BindCmd == "ERROR" ? "" : BindCmd), BindName)
        }
    }
    SetTimer ReloadList, Off
    Return
}
GuiClose:
ExitApp
запятую забыл
Код:
IniRead, BindCmd %FileConfig%, Bind%A_Index%, BindCmd, bind%A_Index%
318 строка.
после BindCmd должна быть запятую