<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Скрипт для зацикливания клавиш]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=13400&amp;type=atom" />
	<updated>2018-01-26T16:56:10Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=13400</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Скрипт для зацикливания клавиш]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=123397#p123397" />
			<content type="html"><![CDATA[<p><a href="https://autohotkey.com/docs/Functions.htm">Функция</a>, <a href="https://autohotkey.com/docs/Objects.htm#Usage">массив</a> и <a href="https://autohotkey.com/docs/objects/Functor.htm">объект-функция</a>.</p>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2018-01-26T16:56:10Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=123397#p123397</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Скрипт для зацикливания клавиш]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=123395#p123395" />
			<content type="html"><![CDATA[<p><strong>stealzy</strong>, помогите разобраться пожалуйста.<br /></p><div class="quotebox"><blockquote><p>HotkeyBindTimerSend(&quot;F2&quot;, &quot;;-]{Space}&quot;, 500)</p></blockquote></div><p>Как я понял это переменная, но почему она имеет такую запись? Почему и что в скобках?<br /></p><div class="quotebox"><blockquote><p>aExistBinds.Delete(hotkey)</p></blockquote></div><p>и<br /></p><div class="quotebox"><blockquote><p>fnSendKeys := Func(&quot;Send&quot;).Bind(sendKeys, winTitle)</p></blockquote></div><p>Что это всё?</p>]]></content>
			<author>
				<name><![CDATA[Gutalin]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=39002</uri>
			</author>
			<updated>2018-01-26T16:23:59Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=123395#p123395</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Скрипт для зацикливания клавиш]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=123318#p123318" />
			<content type="html"><![CDATA[<p><strong>stealzy</strong>, тогда нужна будет ещё одна кнопка, запускающая скрипт с начала. Спасибо за совет.</p>]]></content>
			<author>
				<name><![CDATA[Gutalin]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=39002</uri>
			</author>
			<updated>2018-01-23T13:22:38Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=123318#p123318</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Скрипт для зацикливания клавиш]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=123317#p123317" />
			<content type="html"><![CDATA[<p>Поставить таймер на отправку неких клавиш можно так:<br /></p><div class="codebox"><pre><code>CreateBindSend(&quot;bu&quot;, 1000)
Sleep 10000

CreateBindSend(sendKeys, period) {
	fnSendKeys := Func(&quot;Send&quot;).Bind(sendKeys)
	SetTimer % fnSendKeys, % period
}

Send(keys) {
	Send % keys
}</code></pre></div><p>Если делать с возможностью отключения таймера и установки горячих клавиш код становится сложнее, потому что надо сохранять состояния и проверять их.<br /></p><div class="codebox"><pre><code>HotkeyBindTimerSend(&quot;F2&quot;, &quot;;-]{Space}&quot;, 500)
Sleep 7000
HotkeyBindTimerSend(&quot;F2&quot;) ; выкл
Sleep 7000
HotkeyBindTimerSend(&quot;F3&quot;, &quot;:o{Space}&quot;, 1000)
Return

HotkeyBindTimerSend(hotkey, sendKeys:=&quot;&quot;, period:=0, winTitle:=&quot;&quot;) {
	static aExistBinds := {}

	If aExistBinds.HasKey(hotkey)
	{
		fnSendKeysHotkey := aExistBinds[hotkey].fnSendKeys
		Hotkey % hotkey, Off
		fnToggleHotkey := aExistBinds[hotkey].fnToggle
		fnToggleHotkey.Call(&quot;Delete&quot;)
		SetTimer % fnSendKeysHotkey, Delete

		aExistBinds.Delete(hotkey)		
	}

	If (sendKeys != &quot;&quot; And period)
	{
		fnSendKeys := Func(&quot;Send&quot;).Bind(sendKeys, winTitle)
		SetTimer % fnSendKeys, % period
		SetTimer % fnSendKeys, Off ; таймер должен начать работать только по ГК, поэтому сразу отключаем
		fnToggle := Func(&quot;ToggleSendTimer&quot;).Bind(fnSendKeys)
		Hotkey IfWinActive, % winTitle
		Hotkey % hotkey, % fnToggle, On

		aExistBinds[hotkey] := {fnSendKeys: fnSendKeys, fnToggle: fnToggle}
	}
}

ToggleSendTimer(fnSendKeys, deleteTimerRecord := false) { ;
	; SetTimer % fnSendKeys, Toggle ; если бы таймер можно было переключить, достаточно было бы одной этой строки
	static aStateOftimer := {} ; здесь будем хранить состояния таймеров

	If !aStateOftimer.HasKey(fnSendKeys)
		aStateOftimer[fnSendKeys] := false ; начальное состояние таймера

	If deleteTimerRecord
		Return aStateOftimer.Delete(fnSendKeys)

	If ( aStateOftimer[fnSendKeys]  :=  Not aStateOftimer[fnSendKeys] )
	{
		fnSendKeys.Call() ; чтобы не ждать %period% после включения таймера
		SetTimer % fnSendKeys, On
	}
	Else
		SetTimer % fnSendKeys, Off
}

Send(keys, winTitle) {
	If !winTitle OR WinActive(winTitle)
		Send % keys
}

Esc::ExitApp</code></pre></div>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2018-01-23T13:08:49Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=123317#p123317</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Скрипт для зацикливания клавиш]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=123307#p123307" />
			<content type="html"><![CDATA[<p><strong>svoboden</strong>, если кто не хочет изучать AHK, а просто зациклить пару клавиш... Правда моя программа очень, очень узко раскрывает функционал AHK, но для единичного дела подойдёт.</p>]]></content>
			<author>
				<name><![CDATA[Gutalin]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=39002</uri>
			</author>
			<updated>2018-01-22T20:31:57Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=123307#p123307</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Скрипт для зацикливания клавиш]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=123306#p123306" />
			<content type="html"><![CDATA[<p>Забыли Readme.txt еще написать. <img src="//forum.script-coding.com/img/smilies/roll.png" width="15" height="15" /> А если серьезно, то для новичка, наверное, будет полезна данная высокоинтеллектуально развитая программа.</p>]]></content>
			<author>
				<name><![CDATA[svoboden]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=34280</uri>
			</author>
			<updated>2018-01-22T20:28:06Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=123306#p123306</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Скрипт для зацикливания клавиш]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=123303#p123303" />
			<content type="html"><![CDATA[<p>Предлагаю вашему вниманию мой скрипт.<br />Прошу сообщать о всевозможных багах и ошибках в данную тему (или мне на почту). <br />Скрипт способен зациклить клавишу(и) или сочетания клавиш в активном окне.<br />Чтобы начать работу:<br />1)Снимите блокировку ввода, нажав на замочек;<br />2)В поле &quot;Горячая клавиша&quot; введите клавишу(и) для зацикливания;<br />(Для определения Левой Кнопки Мыши необходимо: зажать правую кнопку -&gt; зажать левую кнопку -&gt; отпустить правую кнопку или, удерживая левую кнопку, щёлкнуть правой. Двойной клик по строке ввода клавиш сбрасывает определённые в нём данные.)<br />3)В поле &quot;Задержка&quot; выберете в выпадающем списке выберете единицу времени, а в поле ввода - количество времени, через которое будет нажиматься клавиша.<br />Старт: F2.<br />Стоп(Сброс): F3 (Таймер скрипта будет запускаться заново).<br />Закрыть программу: Esc.</p><p>В прикреплённом архиве содержится скомпилированный скрипт и 2 картинки замка для не скомпилированного кода (картинки скопировать в %A_Temp%\Биндик\).</p><p>Если вы работаете с ahk файлом:<br />1)Создайте папку;<br />2)Переместите в неё ahk файл данного скрипта;<br />3)Поместите туда же&nbsp; <a href="http://forum.script-coding.com/viewtopic.php?pid=72549#p72549">библиотеку для Hotkey от serzh82saratov</a> версии&nbsp; 2.06 под названием Hotkey.ahk ;</p><p>В скомпилированной версии (exe файл) данной процедуры проводить не нужно!</p><p>ini файл хранит в себе настройки программы и&nbsp; находится в директории(папке) со скриптом. Чтобы настройки не сбросились его лучше не удалять!</p><p>Код:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;V1.8</div><div class="fancy_spoiler"><div class="codebox"><pre><code>

#NoEnv
#SingleInstance Force
#NoTrayIcon

FileInstall, D:\unlock.png, %A_Temp%\Биндик\unlock.png 
FileInstall, D:\lock.png, %A_Temp%\Биндик\lock.png ;  Вшиваем картинки в exe

#include %A_ScriptDir%/Hotkey.ahk ;  Подключаем библиотеку Hotkey

SaveFile = %A_ScriptDir%/info.ini 
Hotkey_IniPath(SaveFile)
Hotkey_IniSection(&quot;Keys&quot;)
Hotkey_Arr(&quot;KillFocus&quot;, true) ;  см. библиотеку Hotkey
GoSub Restore

{ ;  Считывание данных из ini файла
IniRead, MyHotkey1, %SaveFile%, Keys, MyHotkey1
b1 := WhatKey(MyHotkey1)
IniRead, MyHotkey2, %SaveFile%, Keys, MyHotkey2
b2 := WhatKey(MyHotkey2)
IniRead, BToggle, %SaveFile%, Keys, BToggle
IniRead, BStop, %SaveFile%, Keys, BStop
IniRead, BExit, %SaveFile%, Keys, BExit
IniRead, Ind, %SaveFile%, Settings, Ind
IniRead, Num1, %SaveFile%, Time, Num1
IniRead, Delay1, %SaveFile%, Time, Delay1
IniRead, Num2, %SaveFile%, Time, Num2
IniRead, Delay2, %SaveFile%, Time, Delay2
IniRead, NameWin, %SaveFile%, Settings, NameWin
If NameWin is space
	NameWin := &quot;Во всех окнах&quot;
IniRead, size, %SaveFile%, Settings, IndSize
IfNotExist, %A_Temp%\Биндик
	FileCreateDir, %A_Temp%\Биндик
}

{ ;  Main
Gui, +hwndhGui
Menu, HelpMenu, Add, Настройки, Settings
Menu, HelpMenu, Add, Связь с разработчиком, Link
Menu, HelpMenu, Add, О программе, MenuHandler
Menu, MyMenuBar, Add, Помощь, :HelpMenu
Gui, Menu, MyMenuBar
Gui, font, cRed s8
Gui, Add, Text, Center x0 y-2 h15 w220 hwndWindowCheck,
Gui, font, cRed s15
if NameWin != Во всех окнах
	GuiControl, Text, %WindowCheck%, Установленно определённое окно
Gui, Add, Text, Center x10 y10 w210 h25 vSt, Скрипт остановлен
Gui, Add, Picture, x220 y0 w22 h39 vState1 gLock, %A_Temp%\Биндик\unlock.png
Gui, Add, Picture, x220 y0 w22 h39 vState0 gLock, %A_Temp%\Биндик\lock.png
Gui, font
Gui, Add, GroupBox, x10 y40 w240 h63, #1
Gui, Add, Text, xp+10 yp+15, Горячая клавиша:
Hotkey_Add(&quot;Center x140 yp-3 w100 h15 -ReadOnly&quot;, &quot;MyHotkey1&quot;, &quot;KMLDRJNG1&quot;, Hotkey_Read(&quot;MyHotkey1&quot;), &quot;Save&quot;)
Gui, Add, Text, x20 yp+27, Задержка                 :
Gui, Add, DropDownList, xp+55 yp-3 w45 vDelay1 gDropDownList1 AltSubmit Choose%Delay1%, мс.|сек.|мин.
Gui, Add, Edit, Number Center x140 yp+1 w100 h20 vNum1 hwndhEdit1 gEdit1,
GuiControl, , Num1, %Num1%
Gui, Add, GroupBox, x10 yp+30 w240 h63, #2
Gui, Add, Text, x20 yp+15, Горячая клавиша:
Hotkey_Add(&quot;Center x140 yp-3 w100 h15 -ReadOnly&quot;, &quot;MyHotkey2&quot;, &quot;KMLDRJNG1&quot;, Hotkey_Read(&quot;MyHotkey2&quot;), &quot;Save&quot;)
Gui, Add, Text, x20 yp+27, Задержка                 :
Gui, Add, DropDownList, xp+55 yp-3 w45 vDelay2 gDropDownList2 AltSubmit Choose%Delay2%, мс.|сек.|мин.
Gui, Add, Edit, Center number x140 yp+1 w100 h20 vNum2 hwndhEdit2 gEdit2
GuiControl, , Num2, %Num2%
Gui, font, cBlack
ControlFocus, , % &quot;ahk_id&quot; Hotkey_Arr(&quot;Focus&quot;)[hGui] 
T := &quot;off&quot;
l := &quot;unlock&quot;
GoSub Lock
Gui, Show, Restore  w260 h175, Биндик

GoSub Ind
WinActivate, Биндик

SwitchHotKeys(&quot;on&quot;) ;  Включаем Хоткеи

}return

Restore: ;  Проверяет есть ли ini файл в дериктории скрипта. Если его нет, оно его создаёт.
{
	IfNotExist, %SaveFile%
	{
		IniWrite, %A_Space%, %SaveFile%, Keys, MyHotkey1
		IniWrite, %A_Space%, %SaveFile%, Keys, MyHotkey2
		IniWrite, vk71, %SaveFile%, Keys, BToggle
		IniWrite, vk72, %SaveFile%, Keys, BStop
		IniWrite, Esc, %SaveFile%, Keys, BExit
		IniWrite, 0, %SaveFile%, Time, Num1
		IniWrite, 2, %SaveFile%, Time, Delay1
		IniWrite, 0, %SaveFile%, Time, Num2
		IniWrite, 2, %SaveFile%, Time, Delay2
		IniWrite, 1, %SaveFile%, Settings, Ind
		IniWrite, %A_Space%, %SaveFile%, Settings, NameWin
		IniWrite, 10, %SaveFile%, Settings, IndSize
	}
}return

DropDownList1:
{
	GuiControlGet, Delay1, , Delay1
	IniWrite, %Delay1%, %SaveFile%, Time, Delay1
	goto Edit1
}return


DropDownList2:
{
	GuiControlGet, Delay2, , Delay2
	IniWrite, %Delay2%, %SaveFile%, Time, Delay2
	goto Edit2
}return


Edit1:
{
	GuiControlGet, Num1, , Num1
	if (Num1 = &quot;&quot; || 0)
		SendMessage, EM_SETCUEBANNER := 0x1501, 0, &quot;0&quot;, , ahk_id %hEdit1%
	if Delay1 = 1
		Rezz1 := Num1
	if Delay1 = 2
		Rezz1:= Num1*1000
	if Delay1 = 3
		Rezz1 := Num1*60000
	IniWrite, %Num1%, %SaveFile%, Time, Num1
}return

Edit2:
{
	GuiControlGet, Num2, , Num2
	if Num2 is space 
		SendMessage, EM_SETCUEBANNER := 0x1501, 0, &quot;0&quot;, , ahk_id %hEdit2%
	if Delay2 = 1
		Rezz2 := Num2
	if Delay2 = 2
		Rezz2:= Num1*1000
	if Delay2 = 3
		Rezz2 := Num2*60000
	IniWrite, %Num2%, %SaveFile%, Time, Num2
}return

Save(Name) { ;  см. библиотеку Hotkey 
	HotKey := Hotkey_Write(Name)
}

Ind: ;  Окно индикатора скрипта 
{
	Gui, Settings: Submit, NoHide
	IniWrite, %Ind%, %SaveFile%, Settings, Ind
	IniWrite, %size%, %SaveFile%, Settings, IndSize
	If (Ind = 1){
		Gui, Indicator: New, -Caption +ToolWindow +AlwaysOnTop +Border
		If (T = &quot;off&quot;)
			Gui,Indicator: Color, Red
		If (T = &quot;on&quot;)
			Gui, Indicator: Color, Blue
		Gui, Indicator: Show, Restore x0 y0 w%size% h%size%, Биндик - Индикатор
		GuiControl, Settings: Enable, size
		GuiControl, Settings: Enable, InfoIndSize
		GuiControl, Settings: Enable, Размер индикатора:
		Guicontrol, Settings:, InfoIndSize, %size%
		WinActivate, Биндик - Настройки
	}
	else{
		Gui, Indicator: Destroy
		GuiControl, Settings: Disabled, size
		GuiControl, Settings: Disabled, InfoIndSize
		GuiControl, Settings: Disabled, Размер индикатора:
	}
}return

Lock: ; Блокировка ввода
{
	if (T = &quot;on&quot;) ; Остановить скрипт при разблокировке замочка
		gosub, Stop
	if (l = &quot;lock&quot;){ ; Если заблокировано
		GuiControl, Hide, State0
		for name in Hotkey_Arr(&quot;AllHotkeys&quot;) 
			Hotkey_Disable(Name, 0) 
		GuiControl, -Disabled, Num1
		if Num1 = 0
			GuiControl, , Num1, 
		GuiControl, -Disabled, Num2
		if Num2 = 0
			GuiControl, , Num2, 
		GuiControl, -Disabled, Delay1
		GuiControl, -Disabled, Delay2
		l := &quot;unlock&quot;
	}else if (l = &quot;unlock&quot;){ ; Если разблокировано
	   GuiControl, Show, State0
		for name in Hotkey_Arr(&quot;AllHotkeys&quot;) 
			Hotkey_Disable(Name) 
		GuiControl, +Disabled, Num1
		if Num1 is space
			GuiControl, , Num1, 0
		GuiControl, +Disabled, Num2
		if Num2 is space
			GuiControl, , Num2, 0
		GuiControl, +Disabled, Delay1
		GuiControl, +Disabled, Delay2
	    l := &quot;lock&quot;
	}
}return

Settings: ; Окно настроек
{
	if (T = &quot;on&quot;) ;  Останавлвиваем скрипт при открытии окна настроек
		GoSub, Stop
	SwitchHotKeys(&quot;off&quot;) ;  Отключаем хоткеи
	Gui, Settings: New
	Gui, Settings: Add, Button, x30 w140 gHelpRestore, Перезаписать ini файл
	Gui, Settings: Add, GroupBox, w180 h90 x10 yp+25, Индикатор:
	Gui, Settings: Add, Checkbox, x20 yp+20 Checked%Ind% vInd gInd, Использовать индикатор?
	Gui, Settings: Add, Text, , Размер индикатора:
	Gui, Settings: Add, Text, w20 xp yp+20 vInfoIndSize, %size%
	Gui, Settings: Add, Slider, altsubmit yp-5 xp+15 w150 gInd vsize TickInterval3 ToolTip range5-20, %size%
	If (Ind = 0){
		GuiControl, Settings: Disabled, size
		GuiControl, Settings: Disabled, InfoIndSize
		GuiControl, Settings: Disabled, Размер индикатора:	
	}
	
	Gui, Settings: Add, Text, x200 y10 h110 0x11
	
	Gui, Settings: Add, GroupBox, w180 h100 y15 x210, Настройка клавиш:
	Gui, Settings: Add, Text, x220 yp+20, Старт:
	Hotkey_Add(&quot;Center x280 yp-3 w100 h20 -ReadOnly&quot;, &quot;BToggle&quot;, &quot;KMLDRJNG1&quot;, Hotkey_Read(&quot;BToggle&quot;), &quot;Save&quot;)
	Gui, Settings: Add, Text, x220 yp+30, Стоп:
	Hotkey_Add(&quot;Center x280 yp-3 w100 h15 -ReadOnly&quot;, &quot;BStop&quot;, &quot;KMLDRJNG1&quot;, Hotkey_Read(&quot;BStop&quot;), &quot;Save&quot;)
	Gui, Settings: Add, Text, x220 yp+23 r2 w60, Закрыть программу:
	Hotkey_Add(&quot;Center x280 yp+5 w100 h15 -ReadOnly&quot;, &quot;BExit&quot;, &quot;KMLDRJNG1&quot;, Hotkey_Read(&quot;BExit&quot;), &quot;Save&quot;)
	
	
	
	Gui, Settings: Add, GroupBox, w380 h215 yp+40 x10, Работает в окне:
	Gui, Settings: Add, Edit, ReadOnly r1 w220 xp+10 yp+17 vNameWin, %NameWin%
	Gui, Settings: Add, Button, gClear xp+230 yp-1, Очистить
	Gui, Settings: Add, Button, gGetInfoAboutWindows xp+70 yp, Обновить
	Gui, Settings: Add, ListView, x20 yp+27 w360 h160 gWindowsListView -Multi, Окна|Процесс
	GetInfoAboutWindows()
	
	Gui, Settings: Show, Restore w400 h350, Биндик - Настройки
	Gui, %hGui%: +Disabled 
}return

Clear: ; Очистка переменной с окном
{
	MsgBox, 4, Внимание!
	, Скрипт будет работать в любом активном окне`nПродолжить?
	IfMsgBox Yes
	{
		IniWrite, %A_Space%, %SaveFile%, Settings, NameWin
		NameWin := &quot;Во всех окнах&quot;
		GuiControl, , NameWin, %NameWin%
		GuiControl, Text, %WindowCheck%,
	}
}return

WindowsListView:
{
	if A_GuiEvent = DoubleClick
	{
		LV_GetText(RowText, A_EventInfo)
		MsgBox, 4, Внимание!
		, Скрипт будет работать только в окне &quot;%RowText%&quot;`nПродолжить?
		IfMsgBox Yes
		{
			NameWin := RowText
			IniWrite, %NameWin%, %SaveFile%, Settings, NameWin
			GuiControl, , NameWin, %NameWin%
			GuiControl, , %WindowCheck%, Установленно определённое окно
		}
	}
}return

GetInfoAboutWindows(){
	LV_Delete()
	WinGet, Windows, List 
	Loop, % Windows
	{
		f := Windows%A_Index%
		WinGetTitle, title, ahk_id %f%
		WinGet, proc, ProcessName, ahk_id %f%
		if title &lt;&gt; Биндик - Настройки
			if title &lt;&gt; Биндик
				if title &lt;&gt; Биндик - Индикатор
					if title &lt;&gt; Program Manager
						if title &lt;&gt;
							LV_Add(&quot;&quot;, title, proc) ;  Оставим пока так
	}
	LV_ModifyCol()
}return

Link: ;  Связь с разработчиком
	Run, http://forum.script-coding.com/viewtopic.php?pid=123303
return

MenuHandler: ;  О программе
{
	MsgBox, , О программе,
(
Спасибо за помощь в разработке форуму forum.script-coding.com`nОтдельное спасибо пользователям:
serzh82saratov
stealzy
teadrinker
---------------------------------------------------------------------------------
Скрипт способен зациклить клавишу(и) или сочетания клавиш в активном окне.
Чтобы начать работу:
1)Снимите блокировку ввода, нажав на замочек;
2)В поле &quot;Горячая клавиша&quot; введите клавишу(и) для зацикливания;
(Левая кнопка мыши, для определения необходимо: зажать правую кнопку - зажать левую кнопку - отпустить правую кнопку или удерживать левую кнопку и щёлкнуть правой)
Двойной клик по строке ввода клавиш сбрасывает определённые в нём данные.)
3)В поле &quot;Задержка&quot; выберете в выпадающем списке выберете единицу времени, а в поле ввода - количество времени, через которое будет нажиматься клавиша.
Старт: F2.
Стоп(Сброс): F3 (Таймер скрипта будет запускаться заново).
Закрыть программу: Esc.
---------------------------------------------------------------------------------
Версия программы - v1.8
)
}return

HelpRestore: ;  MsgBox перезаписи ini файла
{
MsgBox, 4, Внимание!
, Это действие перезапишет файл Info.ini!`nВсе ваши настройки будут сброшены!`nВы хотите продолжить?
IfMsgBox Yes
{
	Filedelete, %SaveFile%
	GoSub Restore
	Reload
}
}return

;T = on работает
;T = off остановлен

Stop:
{
	T := &quot;off&quot;
	SetTimer, Knopka1, off
	SetTimer, Knopka2, off
	Gui, font, cRed s15
	GuiControl, Font, St
	Guicontrol, , St, Скрипт остановлен
	Gui, Indicator: Color, Red
}return

Start:
{	
	if (l = &quot;unlock&quot;) ;  Если разблокировано
		Gosub, lock
	T := &quot;on&quot;
		
	Gui, font, cBlue s15
	Guicontrol, , St, Скрипт работает
	GuiControl, Font, St
	Gui, Indicator: Color, Blue
		
	IniRead, MyHotkey1, %SaveFile%, Keys, MyHotkey1
	b1 := WhatKey(Myhotkey1)
	IniRead, MyHotkey2, %SaveFile%, Keys, MyHotkey2
	b2 := WhatKey(Myhotkey2)
	SetTimer, Loop, -1
	gosub, Knopka1
	gosub, Knopka2 ;  Чтобы при нажатии кнопки %Start% первый символ печатался сразу,а не через прошествие таймера
	Loop:
	{
		SetTimer, Knopka1, %Rezz1%
		SetTimer, Knopka2, %Rezz2%
		return
	}
}return

Knopka1:
{
	If NameWin = Во всех окнах
	{
		IfWinNotActive, Биндик
			SendInput, %b1%
	}else
		IfWinActive, %NameWin%
			SendInput, %b1%
}return

Knopka2:
{
	If NameWin = Во всех окнах
	{
		IfWinNotActive, Биндик
			SendInput, %b2%
	}else
		IfWinActive, % NameWin
			SendInput, %b2%
}return

WhatKey(Name){
	a := &quot;{1 DownTemp}{2 DownTemp}{3 DownTemp}{4 DownTemp}{5 DownTemp}{6 DownTemp}{7 DownTemp}{8 DownTemp}{0}{8 Up}{7 Up}{6 Up}{5 Up}{4 Up}{3 Up}{2 Up}{1 Up}&quot;
	If Instr(Name, &quot;&lt;^&quot;)
		StringReplace, a, a, 1, LCtrl, all
	If Instr(Name, &quot;&gt;^&quot;)
		StringReplace, a, a, 2, RCtrl, all
	If Instr(Name, &quot;&lt;+&quot;)
		StringReplace, a, a, 3, LShift, all
	If Instr(Name, &quot;&gt;+&quot;)
		StringReplace, a, a, 4, RShift, all
	If Instr(Name, &quot;&lt;!&quot;)
		StringReplace, a, a, 5, LAlt, all
	If Instr(Name, &quot;&gt;!&quot;)
		StringReplace, a, a, 6, RAlt, all
	If Instr(Name, &quot;&lt;#&quot;)
		StringReplace, a, a, 7, LWin, all
	If Instr(Name, &quot;&gt;#&quot;)
		StringReplace, a, a, 8, RWin, all
	loop, 16
	{
		a := RegExReplace(a, &quot;U)[1-8].*p&quot;, &quot;&quot;, , 1)
	}
	RegExMatch(Name, &quot;[a-zA-Z0-9_].*&quot;, K)
	StringReplace, a, a, 0, %K%, 1
	return a
}

SwitchHotKeys(str){ ;  вкл/выкл хоткеев
	global BToggle, BStop, BExit
	if (str = &quot;on&quot;){
		Hotkey %BToggle%, Start, on
		Hotkey %BStop%, Stop, on
		Hotkey %BExit%, Exit, on
	}else{
		Hotkey %BToggle%, Start, off
		Hotkey %BStop%, Stop, off
		Hotkey %BExit%, Exit, off
	}
}return

Exit:
	ExitApp

SettingsGuiClose:
	if BToggle = &quot;&quot;
		BToggle := &quot;vk71&quot;
		IniWrite, vk71, %SaveFile%, Keys, BToggle
	if BStop = &quot;&quot;
		BStop := &quot;vk72&quot;
		IniWrite, vk72, %SaveFile%, Keys, BStop
	if BExit = &quot;&quot;
		BExit := &quot;Esc&quot;
		IniWrite, Esc, %SaveFile%, Keys, BExit ; Переменные с горячими клавишами не должны быть пустыми
	SwitchHotKeys(&quot;on&quot;)
	Hotkey_Delete(&quot;BToggle&quot;, Destroy = 1) 
	Hotkey_Delete(&quot;BStop&quot;, Destroy = 1)
	Hotkey_Delete(&quot;BExit&quot;, Destroy = 1) ;  см. библиотеку Hotkey
	Gui, Settings: Destroy
	Gui, %hGui%: -Disabled 
	WinActivate, Биндик
	return

Guiclose:
	ExitApp
</code></pre></div></div></div><p>Ini файл:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="quotebox"><blockquote><p>[Keys]<br />MyHotkey1=<br />MyHotkey2=<br />BToggle=vk71<br />BStop=vk72<br />BExit=Esc<br />[Time]<br />Num1=0<br />Delay1=2<br />Num2=0<br />Delay2=2<br />[Settings]<br />Ind=1<br />NameWin= <br />IndSize=10</p></blockquote></div></div></div><p>Нововведения/Исправления:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><p>v0.1 (08.08.18)<br />- Ini файл создаётся сам, если его нет;<br />- Ini файл можно перезаписать.<br />v0.2 (09.08.18)<br />-Убраны кнопки &quot;+&quot; и &quot;-&quot; для большей стабильности (Всегда отображается возможность выбрать 2 кнопки);<br />-Скрипт сам определяет нажатые кнопки.<br />v0.3 (10.08.18)<br />-Убраны лишние строки из кода;<br />-Использована <a href="http://forum.script-coding.com/viewtopic.php?pid=72549#p72549">библиотека для Hotkey от serzh82saratov</a>;<br />-Убраны кнопки &quot;Сохранить&quot; и &quot;Отмена&quot;. Теперь всё сохраняется во время ввода данных.<br />v0.5 (12.08.18)<br />-Добавлена блокировка ввода (вкл\выкл на замочек);<br />-Улучшение самого кода;<br />-Мелкие улучшения интерфейса.<br />v1.0 (14.08.18)<br />-Доработан скрипт зацикливания для сочетаний клавиш.<br />-Мелкие улучшения интерфейса.<br />v1.2 (16.08.18)<br />-Добавлена возможность ставить на паузу;<br />-Убран значок в трее за ненадобность;<br />-Добавлен индикатор работы скрипта. (Поверх всех окон);<br />-Убрана возможность блокировки ввода во время работы скрипта (после нескольких вкл\выкл скрипта он зависал). <br />v1.3 (17.08.18)<br />-Добавлена возможность вкл\выкл индикатор в меню Помощь&gt;Настройки;<br />-Меню &quot;Сбросить ini файл&quot; перенесено в Помощь&gt;Настройки;<br />-Мелкие улучшения интерфейса.<br />v1.4 (20.08.18)<br />-Исправления в работе скрипта;<br />-Вернулась блокировка ввода;<br />V1.5(01.12.18)<br />-Улучшение ввода значения задержки;<br />-Добавлена возможность настройки зацикливания в определённое окно;<br />-Небольшие изменения интерфейса.<br />V1.6(03.04.19)<br />-Добавлена возможность изменения размера индикатора работы скрипта;<br />-Изменено расположение ini файла (теперь в директории скрипта);<br />-Отказ от интеграции в код простым копированием библиотеки Hotkey.ahk от serzh82saratov. Теперь это работает как и должно подразумеваться;<br />-Отформатирован код с целью улучшить его читаемость (может и до переменных дойду);<br />V1.7(04.04.19)<br />-Исправление багов;<br />-Улучшение интерфейса;<br />v1.8(24.02.2020)<br />-Новый интерфейс настроек;<br />-Добавлена возможность самому задать клавиши Старт/Стоп/Выход из программы;<br />-Добавлена возможность более точно настроить время;<br />-Убрана пауза;</p></div></div><p><a href="https://drive.google.com/file/d/18jUllYOdZstYAy9HgCgaV6GMhmXyOGhR/view?usp=sharing">Скачать Биндик_x32_x64_v1.8+Pic.rar (Google Drive)</a></p>]]></content>
			<author>
				<name><![CDATA[Gutalin]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=39002</uri>
			</author>
			<updated>2018-01-22T20:14:28Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=123303#p123303</id>
		</entry>
</feed>
