<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Замена gui контролу "Hotkey"]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=8343</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=8343&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Замена gui контролу "Hotkey"».]]></description>
		<lastBuildDate>Sun, 29 Jul 2018 21:14:02 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Замена gui контролу "Hotkey"]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=127550#p127550</link>
			<description><![CDATA[<p>Новая версия.</p><p>Преимущества перед стандартным контролом:<br /></p><ul><li><p>Определяются все клавиши клавиатуры</p></li><li><p>Определяются кнопки мыши и джойстиков</p></li><li><p>Определяется клавиша модификатор &quot;Windows&quot;</p></li><li><p>Модификаторы определяются как левые и правые</p></li><li><p>Определяются двойные хоткеи вида &quot;RControl &amp; RShift&quot;</p></li><li><p>Исключение указанных кнопок во всех или указанных контролах</p></li><li><p>Исключение ввода одинаковых хоткеев между указанными контролами</p></li></ul><p>Все приведённые возможности опциональны.</p><p><span class="postimg"><img src="https://raw.githubusercontent.com/serzh82saratov/Hotkey/master/16535_900.png" alt="https://raw.githubusercontent.com/serzh82saratov/Hotkey/master/16535_900.png" /></span></p><p>----------------------------------------------</p><h5><a href="http://forum.script-coding.com/viewtopic.php?pid=69765#p69765">Тема для обсуждения</a></h5><p>----------------------------------------------</p><h5><a href="https://raw.githubusercontent.com/serzh82saratov/Hotkey/master/Current/Hotkey.ahk">Библиотека Hotkey.ahk</a></h5><p>&nbsp; <br />v2.08&nbsp; &nbsp; &nbsp; &nbsp; 16:33 19.10.2020</p><p>----------------------------------------------</p><p>Основные функции и опции в комментариях примера:<br /></p><div class="codebox"><pre><code>
#NoEnv
#SingleInstance Force
Gui, +AlwaysOnTop

; Сохраняем в библиотеке путь и секцию в ини файле, для удобства использования Hotkey_Read и Hotkey_Write.
Hotkey_IniPath(A_ScriptDir &quot;\Hotkey.ini&quot;)
Hotkey_IniSection(&quot;Hotkeys&quot;)

/*
Создаём контролы, это стандартные контролы Edit, в которые при их фокусе можно будет вводить свои горячие клавиши:

Hotkey_Add(ControlOption, Name, Option = &quot;&quot;, Hotkey = &quot;&quot;, Func = &quot;&quot;, BindString = &quot;&quot;, ByRef Hwnd = &quot;&quot;)

ControlOption - Такие же опции как и для Gui контрола Edit. По умолчанию применяются опции r1 +ReadOnly +Center.
	Далее прописываются общие для всех контролов опции, если Вы их указали в Hotkey_Arr(&quot;ControlOption&quot;),
	далее то что укажите в ControlOption, то есть если Вы где то укажите -Center, то +Center по умолчанию будет отменён.
	ReadOnly выключать не желательно, иначе при некоторых условиях пользователь сможет что то написать.
	В конце поста есть ссылка как изменить цвет фона и текста.
	Если у вас несколько окон, укажите в самом начале имя окна и двоеточие &quot;GuiName:&quot;, или проще перед созданием сделайте
	окно по умолчанию с помощью команды &quot;Gui, GuiName:Default&quot; или &quot;Gui, New&quot;.

Name - Ваше уникальное имя для контрола. Имя не может быть числом.

Option - Опции определяющие определяемые клавиши, и поведение при этом.
	Указываем строку из возможных букв &quot;KMLRJDSWZNG1&quot;, в любой последовательности и регистре:
	если не указано, то - &quot;K&quot;.

	K - Определять клавиши клавиатуры
	M - Кнопки мыши без левой и правой.
	L - Левая кнопка мыши, для определения необходимо: при зажатой левой отпустить правую кнопку.
	R - Правая кнопка мыши, определяется при отпускании кнопки.
	J - Кнопки джойстика, определяются без модификаторов, и без опции W.

	N - 11 Numpad клавиш зависящих от состояния Numlock сохраняются по виртуальному коду. Без неё, как скан код, то есть сработают при любом состоянии Numlock.
		Желательно наличие или отсутствие этой опции во всех контролах внутри группы, так как при разнных опциях есть конфликт их сравнения при повторах.

	D - Определять модификаторы как левые и правые.
	S - Определять только одну нажатую клавишу, то есть без комбинации с модификаторами. С этим параметром опция &quot;D&quot; и &quot;Z&quot; не имеет смысла.
	W - Определять как двойной хоткей вида &quot;RControl &amp; RShift&quot;. С этим параметром опции &quot;D&quot;, &quot;Z&quot; и &quot;S&quot; не имеют смысла. Первой в паре не может быть колёсико мыши и джойстик.
	Z - Можно задать обычный хоткей с модификаторами, или один модификатор.

	Gn - Указываем &quot;G&quot; и сразу за ней номер группы (целое положительное число больше нуля). В контролах из одной группы не могут быть назначены одинаковые ГК.
		При повторе, поле ввода очищается, те контролы в которых назначен аналогичный хоткей, обозначаются миганием.
		Можно получать сообщение в своей функции, о том в каких контролах было совпадение, см. спойлер &quot;Обработка повторов в группах&quot;.
		Для страховки, при закрытии и\или показе окна с уже созданными контролами, можно запускать Hotkey_Group(&quot;CheckAll&quot;) для дополнительной проверки повторов.

	Двойной клик по контролу очищает определённые в нём клавиши.

Hotkey - Указываем хоткей для отображения в контроле, в данном случае читаем из файла.
	Hotkey должен быть вида: &quot;&lt;^vk57&quot;, или &quot;+Space&quot; и.т.п. а не как строка в контроле.
	Учтите, что указав свой хоткей в виде строки он не будет сохранён в ини файл.
	Вы можете после создания контрола использовать Hotkey_Write, или первым символом в хоткее указать &quot;:&quot;,
	в этом случае запись будет произведена в ключ с именем указанным в Name, и только если путь и секция 
	уже сохранены в Hotkey_IniPath и Hotkey_IniSection.
	Также если путь и секция уже сохранены, можно передать Hotkey как символ &quot;*&quot;, в этом случае  он будет
	прочитан с помощью Hotkey_Read с переданным вами именем во втором параметре (т.е. результат будет таким же как в этом примере). 
	Модификаторы указываются в порядке ^+!#.
	Как правильно указать клавишу, см. ссылку &quot;Синтаксис указания хоткеев&quot; в конце поста.

Func - Указываем имя функции которая в первом параметре принимает Name, во втором (необязательном) Hwnd контрола.
	Функция вызывается при вводе хоткея пользователем и после проверки повторов.

BindString - Вы можете сохранить для себя строку привязанную к контролу по его имени.

Hwnd - Вы можете указать имя своей переменной (без кавычек), для сохранения хэндла контрола. Но Вы всегда можете получить хэндл контрола из его имени - Hotkey_ID(имя).
	В этой версии сделано так, что хэндл контрола вам не должен понадобится, все обращения к функциям контролов производятся по имени.
*/

Hotkey_Add(&quot;w300&quot;, &quot;MyHotkey1&quot;, &quot;G1KD&quot;, Hotkey_Read(&quot;MyHotkey1&quot;), &quot;Save&quot;)
Hotkey_Add(&quot;wp y+10&quot;, &quot;MyHotkey2&quot;, &quot;G1KMLRJ&quot;, Hotkey_Read(&quot;MyHotkey2&quot;), &quot;Save&quot;)

; Демо контрол.
Gui, Add, Edit, Center vText wp
Gui, Show
Return

Save(Name) {
    ; Записываем в ини файл. Путь и секция используются из Hotkey_IniPath и Hotkey_IniSection которые указали в начале.
    ; Hotkey_Write возвращает то что записал.
	HotKey := Hotkey_Write(Name)
    ; Просто для демонстрации.
    GuiControl, , Text, % Name &quot; = &quot; HotKey
}

GuiClose() {
    ExitApp
}
</code></pre></div><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Тоже без комментариев, и по короче.</div><div class="fancy_spoiler"><div class="codebox"><pre><code>
#NoEnv
#SingleInstance Force
Gui, +AlwaysOnTop
Hotkey_IniPath(A_ScriptDir &quot;\Hotkey.ini&quot;), Hotkey_IniSection(&quot;Hotkeys&quot;)
Hotkey_Add(&quot;w300&quot;, &quot;MyHotkey1&quot;, &quot;G1KD&quot;, &quot;*&quot;, &quot;Save&quot;)
Hotkey_Add(&quot;wp y+10&quot;, &quot;MyHotkey2&quot;, &quot;G1KMLRJ&quot;, &quot;*&quot;, &quot;Save&quot;)
Gui, Add, Edit, Center vText wp
Gui, Show
Return

Save(Name) { 
    GuiControl, , Text, % Name &quot; = &quot; Hotkey_Write(Name)
}

GuiClose() {
    ExitApp
}
</code></pre></div></div></div><p>----------------------------------------------</p><p>Горячие клавиши установленные вами в вашем скрипте, могут не работать если они установлены не по скан коду, <br />а такие же в библиотеке по скан коду, вообщем см. ссылку &quot;Синтаксис указания хоткеев&quot; в конце поста.</p><p>Если нужно запретить для ввода некоторые клавиши, Вы можете передать их строкой через разделитель |.<br />Вторым параметром можно указать имя контрола, если эти клавиши надо запретить именно в нём, если второй<br />параметр пуст, указанные клавиши будут запрещены во всех контролах.<br />Если введена запрещённая клавиша, хоткей сбрасывается также как при двойном клике по контролу.<br />Как правильно указать кнопки, см. ссылку &quot;Синтаксис указания хоткеев&quot; в конце поста.</p><div class="codebox"><pre><code>Hotkey_BanKey(&quot;LAlt|RAlt&quot;)  ;	Запретить Alt для всех контролов</code></pre></div><p>Прочитать из ини файла. Name - имя ключа в ини файле. Функция возвращает прочтённую строку.</p><div class="codebox"><pre><code>Hotkey_Read(Name, Section = &quot;&quot;, FilePath = &quot;&quot;)</code></pre></div><p>Записать в ини файл. Name - имя контрола, записан будет хоткей извлечённый из Hotkey_Value по переданному имени, <br />в ключ с указанным именем. Функция возвращает записанную строку.</p><div class="codebox"><pre><code>Hotkey_Write(Name, Section = &quot;&quot;, FilePath = &quot;&quot;)</code></pre></div><p>Для удобства можно сохранить путь к ини файлу:<br /></p><div class="codebox"><pre><code>Hotkey_IniPath(Path)</code></pre></div><p>В этом случае при вызове Hotkey_Read или Hotkey_Write можно не указывать третий параметр.<br />Аналогично можно сохранить секцию ини файла, и не указывать второй параметр при чтении и записи.<br /></p><div class="codebox"><pre><code>Hotkey_IniSection(Section)</code></pre></div><p>Вместо Hotkey_Read или Hotkey_Write Вы можете использовать свои методы работы с ини файлом.</p><p>Преобразует строку хоткея для использования с командой Send. Count - количество нажатий. </p><div class="codebox"><pre><code>Hotkey_HKToSend(HK, Count = &quot;&quot;)</code></pre></div><div class="codebox"><pre><code>
MsgBox % Hotkey_HKToSend(&quot;~*$&gt;^&lt;+vk53&quot;) ; ^+{vk53}
MsgBox % Hotkey_HKToSend(&quot;^vk53&quot;) ; ^{vk53}
MsgBox % Hotkey_HKToSend(&quot;vk53&quot;) ; {vk53}
MsgBox % Hotkey_HKToSend(&quot;Enter&quot;) ; {Enter}
MsgBox % Hotkey_HKToSend(&quot;sc19 &amp; Enter&quot;)  ; {sc19}{Enter}
</code></pre></div><p>HKToSendEx преобразует модификаторы в нажатия и отпускания, по собственному опыту так они реже залипают.</p><div class="codebox"><pre><code>Hotkey_HKToSendEx(HK, Count = &quot;&quot;)</code></pre></div><div class="codebox"><pre><code>
MsgBox % Hotkey_HKToSendEx(&quot;~*$&gt;^&lt;+vk53&quot;) ; {RCtrl Down}{LShift Down}{vk53}{RCtrl Up}{LShift Up}
MsgBox % Hotkey_HKToSendEx(&quot;^vk53&quot;) ; {LCtrl Down}{vk53}{LCtrl Up}
MsgBox % Hotkey_HKToSendEx(&quot;vk53&quot;) ; {vk53}
MsgBox % Hotkey_HKToSendEx(&quot;Enter&quot;) ; {Enter}
MsgBox % Hotkey_HKToSendEx(&quot;sc19 &amp; Enter&quot;)  ;	{sc19 Down}{Enter Down}{sc19 Up}{Enter Up}
</code></pre></div><p>Получить из строки хоткея, строку такого же вида, как и при отображении в контроле.<br /></p><div class="codebox"><pre><code>MsgBox % Hotkey_HKToStr(HK)</code></pre></div><p>Получить хэндл из имени, или имя из хэндла.<br /></p><div class="codebox"><pre><code>MsgBox % Hotkey_ID(ID)</code></pre></div><p>Если в ходе работы скрипта требуется самому установить хоткей. Без проверки повторов.<br /></p><div class="codebox"><pre><code>Hotkey_Set(Name, Hotkey)</code></pre></div><p>Получить строку опций активного контрола, пусто если Hook не установлен в данный момент. <br /></p><div class="codebox"><pre><code>MsgBox % Hotkey_Arr(&quot;Hook&quot;)</code></pre></div><p>Получить строку опций контрола.<br /></p><div class="codebox"><pre><code>MsgBox % Hotkey_Options(Name)</code></pre></div><p>Если в ходе работы скрипта требуется установить новые опции для контрола.<br /></p><div class="codebox"><pre><code>Hotkey_ChangeOption(Name, Option)</code></pre></div><p>Удалить контрол и данные о нём. Если указать второй параметр равным нулю, то контрол не будет удалён.<br /></p><div class="codebox"><pre><code>Hotkey_Delete(Name, Destroy = 1)</code></pre></div><p>Отключить или включить все хоткеи библиотеки.<br />0 - отключить, например при скрытии окна, на случай если обнаружен конфликт со своими хоткеями.<br />1 - включить, например при показе окна, при запуске скрипта это не требуется.<br /></p><div class="codebox"><pre><code>Hotkey_InitHotkeys(bool)</code></pre></div><p>При запуске можно оставить хоткеи отключенными.<br /></p><div class="codebox"><pre><code>Hotkey_Arr(&quot;ResetAllways&quot;, True)  ; Запускать перед созданием контролов.</code></pre></div><p>Если требуется перебрать все контролы.<br /></p><div class="codebox"><pre><code>for name, hwnd in Hotkey_Arr(&quot;AllHotkeys&quot;)
	MsgBox % name &quot;`n&quot; hwnd </code></pre></div><p>Показать привязанную строку, пример есть про &quot;Переназначение клавиш&quot;.<br /></p><div class="codebox"><pre><code>MsgBox % Hotkey_Arr(&quot;BindString&quot;)[Name]</code></pre></div><p>Получить строку хоткея из имени.<br /></p><div class="codebox"><pre><code>MsgBox % Hotkey_Value(Name)</code></pre></div><p>Получить строку как при отображении из имени.<br /></p><div class="codebox"><pre><code>MsgBox % Hotkey_ValueText(Name)</code></pre></div><p>Если требуется выводить имена символьных клавиш только как при английской раскладке.</p><div class="codebox"><pre><code>Hotkey_Arr(&quot;OnlyEngSym&quot;, True)  ; Запускать перед созданием контролов.</code></pre></div><p>Если нужно изменить текст (по умолчанию - &quot;Нет&quot;) который выводится при отсутствии нажатых клавиш, указываем новый текст во втором параметре.</p><div class="codebox"><pre><code>Hotkey_Arr(&quot;Empty&quot;, &quot;Мой текст&quot;)  ; Запускать перед созданием контролов.</code></pre></div><p>Получить неглобальный массив из библиотеки для своего использования, пример есть про &quot;Переназначение клавиш&quot;.</p><div class="codebox"><pre><code>Hotkey_Arr(&quot;User&quot;)</code></pre></div><p>Снять фокус с контрола. Если Name пусто или не указано, то фокус будет снят с любого зарегистрированного контрола.</p><div class="codebox"><pre><code>Hotkey_KillFocus(Name = &quot;&quot;)</code></pre></div><p>Установить фокус.</p><div class="codebox"><pre><code>Hotkey_SetFocus(Name)</code></pre></div><p>Если при клике по заголовку окна, месте окна без контролов или контролу не принимающему фокус нужно снимать фокус с контролов Edit.<br />Будет действовать для всех полей Edit в том окне, где есть хоть один добавленный контрол.</p><div class="codebox"><pre><code>Hotkey_Arr(&quot;KillFocus&quot;, true)  ; Запускать перед созданием контролов.</code></pre></div><p>Если нужно переместить или изменить размер контрола, Option тоже самое как для GuiControl Move (&quot;x10 y20 w200 h100&quot;).</p><div class="codebox"><pre><code>Hotkey_Move(Name, Option)</code></pre></div><p>Если нужно блокировать контрол, если второй параметр false - разблокировать.</p><div class="codebox"><pre><code>Hotkey_Disable(Name)</code></pre></div><p>Если нужно скрыть контрол, если второй параметр false - показать.</p><div class="codebox"><pre><code>Hotkey_Hide(Name)</code></pre></div><p>Получить в своей функции OnFocusFunc сообщение об активации контрола, в первом параметре принимается имя.</p><div class="codebox"><pre><code>Hotkey_Arr(&quot;OnFocus&quot;, Func(&quot;OnFocusFunc&quot;))

OnFocusFunc(name) { 
	MsgBox % name
}
</code></pre></div><p> </p><p>----------------------------------------------<br /><strong>Примеры:</strong></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Назначение хоткеев из назначенных клавиш.</div><div class="fancy_spoiler"><p>Вводим хоткеи, закрываем окно, когда окно закрыто, установленными хоткеями должны вызыватся MsgBoxы. Можно снова кликнуть по иконке показав окно, и изменить хоткеи.</p><div class="codebox"><pre><code>
#NoEnv
#SingleInstance Force
OnExit(&quot;ExitApp&quot;)
Menu, Tray, Click, 1
Menu, Tray, NoStandard
Menu, Tray, Add, Hide/Show, GuiClose
Menu, Tray, Add, ExitApp, ExitApp
Menu, Tray, Default, Hide/Show
Hotkey_IniPath(A_ScriptDir &quot;\Hotkey.ini&quot;), Hotkey_IniSection(&quot;Hotkeys&quot;)
#IF !GuiShow
#IF
GuiShow := 0
Hotkey_Add(&quot;w300&quot;, &quot;MyHotkey1&quot;, &quot;KMJG1&quot;, &quot;*&quot;)
Hotkey_Add(&quot;wp y+10&quot;, &quot;MyHotkey2&quot;, &quot;KMJG1&quot;, &quot;*&quot;)
Hotkey_Add(&quot;wp y+10&quot;, &quot;MyHotkey3&quot;, &quot;KMJG1&quot;, &quot;*&quot;)

GuiClose:
	HotkeySet(GuiShow := !GuiShow)
	Gui, Show, % GuiShow ? &quot;&quot; : &quot;Hide&quot;
	Return

HotkeySet(Reset=0) {
	Hotkey, IF, !GuiShow
	for name in Hotkey_Arr(&quot;AllHotkeys&quot;)
	{
		IF Reset
			Hotkey, % Hotkey_Value(name), Off, UseErrorLevel
		Else
			Hotkey, % Hotkey_Write(name), L_%name%, UseErrorLevel On
	}
	Hotkey, IF
}

ExitApp() {
	HotkeySet()
    ExitApp
}

L_MyHotkey1:
	MsgBox, , , % A_ThisLabel &quot;`n&quot; A_ThisHotkey, 0.6
	Return

L_MyHotkey2:
	MsgBox, , , % A_ThisLabel &quot;`n&quot; A_ThisHotkey, 0.6
	Return

L_MyHotkey3:
	MsgBox, , , % A_ThisLabel &quot;`n&quot; A_ThisHotkey, 0.6
	Return
</code></pre></div></div></div><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Переназначение клавиш (назначаем хоткей, и назначаем клавиши которые он отправляет с помощью Send).</div><div class="fancy_spoiler"><p>Более продвинутый пример, так как не требуется подтверждение сохранения \ назначения, хоткеи работают сразу после снятия фокуса с полей ввода.<br /></p><div class="codebox"><pre><code>
#SingleInstance Force
#NoEnv
#UseHook
#IF !Hotkey_Arr(&quot;Hook&quot;)
#IF
 
Hotkey_IniPath(&quot;Hotkey.ini&quot;)
Hotkey_IniSection(&quot;Hotkeys&quot;)

Gui, Color, 0xFFDD8A, 0xFFFFAA
Gui, Font, s12
Loop 5
{ 
	Gui, Add, Text, cRed xm y+20, Press %A_Index%:
	Hotkey_Add(&quot;cRed w400 yp x+10 Section&quot;, &quot;Press&quot; A_Index, &quot;G1KMLRJD&quot;, &quot;*&quot;, &quot;FuncPress&quot;, &quot;Send&quot; A_Index)
	Gui, Add, Text, xm, Send %A_Index%:
	Hotkey_Add(&quot;w400 yp xs&quot;, &quot;Send&quot; A_Index, &quot;KMLRJ&quot;, &quot;*&quot;, &quot;FuncSend&quot;) 
	Gui, Add, GroupBox, wp+100 h14 y+10 xm
	FuncPress(&quot;Press&quot; A_Index), FuncSend(&quot;Send&quot; A_Index)
} 
Gui, Add, Edit, wp y+20 r10
Gui, Show 
return 

FuncPress(name) {
	Static PrKey := {}  
	Hotkey, IF, !Hotkey_Arr(&quot;Hook&quot;)
	Hotkey, % PrKey[name], Off, UseErrorLevel
	PrKey[name] := Hotkey_Write(name)  
	fn := Func(&quot;ActionPress&quot;).Bind(Hotkey_Arr(&quot;BindString&quot;)[Name]) 
	Hotkey, % PrKey[name], % fn, On, UseErrorLevel 
	Hotkey, IF
}

FuncSend(name) { 
	Hotkey_Arr(&quot;User&quot;)[&quot;StrSend_&quot; name] := Hotkey_HKToSend(Hotkey_Write(name)) 
}

ActionPress(name) {  
	SendInput % Hotkey_Arr(&quot;User&quot;)[&quot;StrSend_&quot; name]
}

GuiClose() {
    ExitApp
}
</code></pre></div></div></div><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Обработка повторов в группах (несколько окон).</div><div class="fancy_spoiler"><p>В ключе OnGroup указываем имя своей функции<br /></p><div class="codebox"><pre><code>Hotkey_Arr(&quot;OnGroup&quot;, FuncName) </code></pre></div><p>которая в случае совпадения внутри группы принимает массив с ключами:<br /><span class="bbu">names</span> - массив имён в которых есть совпадения.<br /><span class="bbu">this</span> - имя в который хотели ввести хоткей.<br /><span class="bbu">value</span> - введённый хоткей.<br /><span class="bbu">group</span> - номер группы.</p><div class="codebox"><pre><code>
#NoEnv
#SingleInstance Force

Hotkey_Arr(&quot;OnGroup&quot;, &quot;OnGroupProc&quot;)
Hotkey_IniPath(A_ScriptDir &quot;\Hotkey.ini&quot;)
Hotkey_IniSection(&quot;Hotkeys&quot;)

Loop 4
    GuiCreate(A_Index)
Hotkey_Group(&quot;CheckAll&quot;)
Return

OnGroupProc(arr) {
 	for k, v in arr.names
		names .= &quot;`n&quot; v
	WinGetPos, x, y, w, h, % &quot;ahk_id&quot; Hotkey_ID(arr.this)
	S_CoordModeToolTip := A_CoordModeToolTip
	CoordMode, ToolTip, Screen
	ToolTip, % &quot;&#039;&quot; Hotkey_HKToStr(arr.value) &quot;&#039; уже назначено в группе номер: &quot; arr.group names, x + w + 2, y + h + 2, 20
	CoordMode, ToolTip, %S_CoordModeToolTip%
	SetTimer HideTooltip20, -500
	Return

	HideTooltip20:
		ToolTip,,,, 20
		Return
}

GuiCreate(I) {
	Gui, New, -DPIScale +AlwaysOnTop +LabelGui
	Hotkey_Add(&quot;w300&quot;, I &quot;Hotkey1&quot;, &quot;KMLRJG1W&quot;, &quot;*&quot;, &quot;Save&quot;)
	Hotkey_Add(&quot;wp y+10&quot;, I &quot;Hotkey2&quot;, &quot;KMLRJDG1&quot;, &quot;*&quot;, &quot;Save&quot;)
	Hotkey_Add(&quot;wp y+10&quot;, I &quot;Hotkey3&quot;, &quot;KMLRJG1&quot;, &quot;*&quot;, &quot;Save&quot;)
	Gui, Show, % &quot;y100 x&quot; 100+(I-1)*450, Hotkey Gui %I%
}

Save(Name) {
    Hotkey_Write(Name)
}

GuiClose() {
    ExitApp
}
</code></pre></div></div></div><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Listview</div><div class="fancy_spoiler"><p>Код содержит недокументированное поведение, и служит больше примером костыля.<br />Так же говорит о том, что не обязательно хоткеи нужно вводить в видимые поля edit, можно создать их в скрытом окне, и используя свою логику фокусировки использовать алгоритм библиотеки.<br /></p><div class="codebox"><pre><code>
#NoEnv
#SingleInstance Force

Hotkey_IniPath(A_ScriptDir &quot;\Hotkey.ini&quot;)
Hotkey_IniSection(&quot;Hotkeys&quot;) 

Gui, -DPIScale  
Gui, Font, s14

LVS_EX_INFOTIP = LV0x400   ;  уведомляющее сообщение LVN_GETINFOTIP
LVS_EX_HEADERDRAGDROP = LV0x10   ;  	Включает перетаскивание столбцов в элементе управления представления списка.

Gui, Add, Listview
, w600 h480 cBlue gListview AltSubmit NoSortHdr Grid -Multi -%LVS_EX_HEADERDRAGDROP% +%LVS_EX_INFOTIP% 
, Действие|Хоткей 
 
Loop 12
{
	Name := &quot;Action&quot; A_Index 
	Hotkey_Add(&quot;Hotkey:w300 gHotkeyText&quot;, Name, &quot;KMJG1&quot;, &quot;*&quot;, &quot;Save&quot;, A_Index)
	LV_Add(&quot;&quot;, Name, Hotkey_ValueText(Name))
}  
LV_ModifyCol(1, &quot;250&quot;)
LV_ModifyCol(2, &quot;340 Center&quot;) 
Gui, Show
Return

Listview() {
	Critical 
	i := LV_GetNext()
	If !i || !Hotkey_ID(&quot;Action&quot; i)
		Return Hotkey_Arr(&quot;Hook&quot;) &amp;&amp; Hotkey_Main()
	If Hotkey_Arr(&quot;Hook&quot;) &amp;&amp; (A_GuiEvent == &quot;f&quot; || A_GuiEvent = &quot;S&quot;)
		Hotkey_Main(), LV_Modify(i, &quot;-Focus&quot;), LV_Modify(i, &quot;-Select&quot;)  
	Else If (A_GuiEvent = &quot;DoubleClick&quot;)
		LV_Modify(i, &quot;col&quot; 2, Hotkey_Main(&quot;Clean&quot;))
	Else If (A_GuiEvent == &quot;Normal&quot; || A_GuiEvent == &quot;F&quot;) 
		Hotkey_Main(Hotkey_ID(&quot;Action&quot; i))   
}
	

GLabel(Name) {
	LV_Modify(Hotkey_Arr(&quot;BindString&quot;)[Name], &quot;col&quot; 2, Hotkey_ValueText(Name))
} 

HotkeyText(hwnd) {  
	funcobj := Func(&quot;GLabel&quot;).Bind(Hotkey_ID(hwnd))
	Try SetTimer, % funcobj, -1
}

Save(Name) {
	Hotkey_Write(Name)
}

GuiEscape:
GuiClose:
Escape::  ExitApp
</code></pre></div></div></div><p>----------------------------------------------</p><p><a href="https://raw.githubusercontent.com/serzh82saratov/Hotkey/master/Ban/Key%20syntax.txt">Синтаксис указания хоткеев.</a></p><p>----------------------------------------------</p><p><a href="http://forum.script-coding.com/viewtopic.php?pid=128099#p128099">Изменить цвет фона и текста.</a></p><p>----------------------------------------------</p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Если Вы пользовались предыдущей версией.</div><div class="fancy_spoiler"><p>	Изначально была ошибка в том, что я стал использовать модификаторы в отличном, от стандартного контрола, порядке - Ctrl + Alt + Shift + Win.<br />Получается переходя с обычного контрола на библиотеку, хоткеи из ини файла могут не определится в группе как повторы.<br />	Если у вас хоткеи объединены в группы, и Вы хотите перейти на новую версию, то можете при первом запуске новой версии у пользователя, <br />переписать все хоткеи в его ини файле с Ctrl + Alt + Shift + Win на Ctrl + Shift + Alt + Win, и записать в ини что проверка уже была, <br />чтобы не переписывать при каждом запуске. <a href="https://raw.githubusercontent.com/serzh82saratov/Hotkey/master/Ban/Hotkey_HKToNewSyntax.ahk">Функция</a> для форматирования хоткея в новый вид.</p></div></div>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Sun, 29 Jul 2018 21:14:02 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=127550#p127550</guid>
		</item>
		<item>
			<title><![CDATA[AHK: Замена gui контролу "Hotkey"]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=72549#p72549</link>
			<description><![CDATA[<div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Здесь содержится старая версия, она более не поддерживается.</div><div class="fancy_spoiler"><p>Смысл в устранении таких недостатков:<br /><em>- Буквенные клавиши сохраняются по имени, и потом могут не работать при другой языковой раскладке (есть <a href="http://forum.script-coding.com/viewtopic.php?pid=102089#p102089">обходной путь</a>, на данный момент эта проблема решена в AutoHotkey).</em></p><p><em>- Определяются не все клавиши клавиатуры<br />- Не определяются кнопки мыши и джойстиков<br />- Не определяется клавиша модификатор &quot;Win&quot;<br />- Не определяются левые и правые модификаторы<br />- Не определяются двойные хоткеи вида &quot;RControl &amp; RShift&quot;</em></p><p>Также в предложенном варианте возможно создать группы контролов, между которыми не будет повторов.<br />При повторе, поле ввода сбрасывается, те в которых назначен аналогичный хоткей, обозначаются миганием.<br />Можно получать сообщение в своей функции, о том в каких контролах было совпадение, см. спойлер &quot;Обработка повторов в группах&quot;.</p><br /><br /><p><span class="postimg"><img src="https://ic.pics.livejournal.com/the_bestseller/49384395/14190/14190_900.png" alt="https://ic.pics.livejournal.com/the_bestseller/49384395/14190/14190_900.png" /></span></p><p>----------------------------------------------</p><h5><a href="http://forum.script-coding.com/viewtopic.php?pid=69765#p69765">Тема для обсуждения</a></h5><p>----------------------------------------------</p><h5><a href="https://raw.githubusercontent.com/serzh82saratov/Hotkey/master/NoHook---Group---Double/Hotkey.ahk">Библиотека Hotkey.ahk</a></h5><p>&nbsp; (правка: 20:58 26.07.2018)</p><p>----------------------------------------------</p><p>Описание в комментариях примера:<br /></p><div class="codebox"><pre><code>
#NoEnv
#SingleInstance Force
Gui, +AlwaysOnTop
; Сохраняем в переменную путь к ини файлу.
PathIni = %A_ScriptDir%\Hotkey.ini
; Создаём Edit, указываем переменную после &quot;hwnd&quot; для сохранения хэндла контрола.
; После &quot;g&quot; указываем функцию которая будет вызыватся при нажатиях клавиш.
; r1 - чтобы не было переноса строки, это обязательно.
; Hotkey_Read(p1[, p2, p3]) - p1 ключ ини файла, p2 секция, p3 путь к ини файлу.
; Читает из ини файла ранее записанный хоткей, и возвращает в понятном виде для отображения в Edit.
; Также cохраняет значение внутри библиотеки в виде хоткея, для дальнейшего извлечения по ID.
; Если надо отобразить хоткей не из файла, читайте ниже про Hotkey_Set.
Gui, Add, Edit, Center w300 r1 hwndhMyHotkey1 gWriteIni, % Hotkey_Read(&quot;MyHotkey1&quot;, &quot;Section&quot;, PathIni)
Gui, Add, Edit, Center wp y+10 r1 hwndhMyHotkey2 gWriteIni, % Hotkey_Read(&quot;MyHotkey2&quot;, &quot;Section&quot;, PathIni)

; Регистрируем Edit`ы, передавая в массивах:
; Первое - связанное уникальное имя (не может быть числом!), которое понадобится например для записи в ини файл, или чтобы по имени узнать текущее значение хоткея.
; Второе - hwnd контрола.
; Третье - опции (необязательно):
; Указываем строку из возможных букв &quot;KMLRJDSWNG1&quot;, в любой последовательности:
; если не указано то - &quot;K&quot;.

; K - Определять клавиши клавиатуры
; M - Кнопки мыши без левой и правой.
; L - Левая кнопка мыши, для определения необходимо: зажать правую кнопку - зажать левую кнопку - отпустить правую кнопку.
; R - Правая кнопка мыши, определяется при отпускании кнопки.
; J - Кнопки джойстика, определяются без модификаторов, и без опции W.
; D - Определять модификаторы как левые и правые.
; S - Определять только одну нажатую клавишу, то есть без комбинации с модификаторами. С этим параметром опция &quot;D&quot; не имеет смысла.
; W - Определять как двойной хоткей вида &quot;RControl &amp; RShift&quot;. С этим параметром опции &quot;D&quot; и &quot;S&quot; не имеют смысла.
; N - 11 Numpad клавиш зависящих от состояния Numlock сохраняются по виртуальному коду, иначе как скан код,
; желательно её наличие или отсутствие во всех контролах внутри группы, так как при разнных опциях есть конфликт их сравнения при повторах.
; Gn - Указываем &quot;G&quot; и сразу за ней номер группы (целое положительное число больше нуля). В контролах из одной группы не могут быть назначены одинаковые ГК.
; Для страховки, при закрытии и\или показе окна с уже созданными контролами, можно запускать Hotkey_Group(&quot;CheckAll&quot;) для дополнительной проверки повторов.
; Двойной клик по контролу сбрасывает определённые в нём клавиши.

Hotkey_Register([&quot;MyHotkey1&quot;,hMyHotkey1,&quot;KD&quot;], [&quot;MyHotkey2&quot;,hMyHotkey2,&quot;KMLRJ&quot;])

; Демонстрационный контрол.
Gui, Add, Edit, Center vText wp
Gui, Show
Return

; Функция указанная при создании контролов, в первом параметре указана переменная для передачи Hwnd контрола.
WriteIni(CtrlHwnd) {
    ; Делаем переменную с путём к ини файлу, доступной внутри функции.
    Global PathIni
    ; Получаем из Hwnd связанное с ним имя который вызвал функцию.
	; Имя используем как одноимённый ключ в ини файле.
    Name := Hotkey_ID(CtrlHwnd)
    ; Получаем из Hwnd текущее значение ввиде строки хоткея.
    ; Строка пригодна для записи в ини файл, или установки хоткея.
    Value := Hotkey_Value(CtrlHwnd)
    ; Записываем в ини файл.
    IniWrite, % Value, % PathIni, Section, % Name
    ; Просто для демонстрации.
    GuiControl, , Text, % Name &quot; = &quot; Value
}

GuiClose() { 
    ExitApp
}
</code></pre></div><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Тоже без комментариев:</div><div class="fancy_spoiler"><div class="codebox"><pre><code>#NoEnv
#SingleInstance Force
Gui, +AlwaysOnTop  
PathIni = %A_ScriptDir%\Hotkey.ini  
Gui, Add, Edit, Center w300 r1 hwndhMyHotkey1 gWriteIni, % Hotkey_Read(&quot;MyHotkey1&quot;, &quot;Section&quot;, PathIni)
Gui, Add, Edit, Center wp y+10 r1 hwndhMyHotkey2 gWriteIni, % Hotkey_Read(&quot;MyHotkey2&quot;, &quot;Section&quot;, PathIni)
Hotkey_Register([&quot;MyHotkey1&quot;,hMyHotkey1,&quot;KD&quot;], [&quot;MyHotkey2&quot;,hMyHotkey2,&quot;KMLRJ&quot;])
Gui, Add, Edit, Center vText wp
Gui, Show
Return

WriteIni(CtrlHwnd) { 
    Global PathIni 
    Name := Hotkey_ID(CtrlHwnd) 
    Value := Hotkey_Value(CtrlHwnd) 
    IniWrite, % Value, % PathIni, Section, % Name 
    GuiControl, , Text, % Name &quot; = &quot; Value
}

GuiClose() { 
    ExitApp
}</code></pre></div></div></div><p><strong>Другие возможности:</strong></p><p>Если требуется выводить имена символьных клавиш только как при английской раскладке.</p><div class="codebox"><pre><code>Hotkey_Arr(&quot;OnlyEngSym&quot;, True)  ; Запускать перед созданием контролов.</code></pre></div><p>Если нужно изменить текст (по умолчанию - &quot;Нет&quot;) который выводится при отсутствии нажатых клавиш, указываем новый текст во втором параметре.</p><div class="codebox"><pre><code>Hotkey_Arr(&quot;Empty&quot;, Text)  ; Запускать перед созданием контролов.</code></pre></div><p>Для удобства можно сохранить путь к ини файлу:<br /></p><div class="codebox"><pre><code>Hotkey_IniPath(Path)</code></pre></div><p>В этом случае при вызове Hotkey_Read или Hotkey_IniWrite можно не указывать третий параметр.<br />Аналогично можно сохранить секцию ини файла, и также далее её не указывать.<br /></p><div class="codebox"><pre><code>Hotkey_IniSection(Section)</code></pre></div><p>Указав ID, можно записать в ини файл.&nbsp; <br /><strong>ID - это Hwnd или связанное имя. Напомню, что имя не может быть числом.</strong><br /></p><div class="codebox"><pre><code>Hotkey_IniWrite(ID[, Section, FilePath])</code></pre></div><p>Секцию и путь к инифайлу можно не указывать, если вы их сохранили в библиотеке.<br />Прочитать из ини файла как есть.<br /></p><div class="codebox"><pre><code>Hotkey_IniRead(Name[, Section, FilePath])</code></pre></div><p>Преобразует строку хоткея для использования с командой Send.<br /></p><div class="codebox"><pre><code>Hotkey_HKToSend(p1[, p2, p3])</code></pre></div><div class="codebox"><pre><code>
MsgBox % Hotkey_HKToSend(&quot;~*$&gt;^&lt;+vk53&quot;) ; {RCtrl Down}{LShift Down}{vk53}{RCtrl Up}{LShift Up} 
MsgBox % Hotkey_HKToSend(&quot;^vk53&quot;) ; {LCtrl Down}{vk53}{LCtrl Up}
MsgBox % Hotkey_HKToSend(&quot;vk53&quot;) ; {vk53}
MsgBox % Hotkey_HKToSend(&quot;Enter&quot;) ; {Enter}
MsgBox % Hotkey_HKToSend(&quot;sc19 &amp; Enter&quot;)  ;	{sc19 Down}{Enter Down}{sc19 Up}{Enter Up}
</code></pre></div><p>Hotkey_HKToSendShort вернёт краткую версию<br /></p><div class="codebox"><pre><code>
MsgBox % Hotkey_HKToSendShort(&quot;~*$&gt;^&lt;+vk53&quot;) ; ^+{vk53}
MsgBox % Hotkey_HKToSendShort(&quot;^vk53&quot;) ; ^{vk53}
MsgBox % Hotkey_HKToSendShort(&quot;vk53&quot;) ; {vk53}
MsgBox % Hotkey_HKToSendShort(&quot;Enter&quot;) ; {Enter}
MsgBox % Hotkey_HKToSendShort(&quot;sc19 &amp; Enter&quot;)  ; {sc19}{Enter}
</code></pre></div><p>В этих функциях можно прочитать сразу из ини файла, надо указать в p1 ключ, в p2 секцию, p3 путь к файлу. Если путь был установлен с помощью Hotkey_IniPath, то p3 можно не указывать, но если секция была указана с помощью Hotkey_IniSection, то в р2 всё таки придётся указать имя секции или как вызов Hotkey_IniSection().</p><p>Получить из ID текущее значение ввиде строки хоткея.<br /></p><div class="codebox"><pre><code>Hotkey_Value(ID)</code></pre></div><p>Получить Hwnd из имени.<br /></p><div class="codebox"><pre><code>Hotkey_ID(Name)</code></pre></div><p>Или имя из Hwnd.<br /></p><div class="codebox"><pre><code>Hotkey_ID(Hwnd)</code></pre></div><p>Получить из строки хоткея, строку такого же вида, как и при отображении в контроле.<br /></p><div class="codebox"><pre><code>Hotkey_HKToStr(HK)</code></pre></div><p>Если требуется отобразить свои клавиши (например при создании контрола) , укажите связанное имя и строку хоткея (вида: &quot;&lt;^vk57&quot;, или &quot;+Space&quot; и.т.п.). Также будет назначено значение связанному имени, чего не&nbsp; произойдёт при использовании Hotkey_HKToStr.<br /></p><div class="codebox"><pre><code>Hotkey_Set(Name, Hotkey)</code></pre></div><p>Если требуется в ходе работы скрипта изменить опции контрола.<br /></p><div class="codebox"><pre><code>Hotkey_ChangeOption(ID, Option)</code></pre></div><p>Удалить контрол и данные о нём. Если указать второй параметр равным нулю, то контрол не будет удалён.<br /></p><div class="codebox"><pre><code>Hotkey_Delete(ID[, Destroy = 1])</code></pre></div><p>0 - отключить все хоткеи библиотеки при скрытии окна, <strong>на случай если</strong> обнаружен конфликт со своими хоткеями.<br />1 - включить после отключения при показе окна, при запуске скрипта это не требуется.</p><div class="codebox"><pre><code>Hotkey_InitHotkeys(bool)</code></pre></div><p>----------------------------------------------<br /><strong>Примеры:</strong></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Назначение хоткеев из назначенных клавиш:</div><div class="fancy_spoiler"><p>После старта надо кликнуть по иконке скрипта в трее, появится окно, вводим хоткеи, закрываем окно, когда окно закрыто, установленными хоткеями должны вызыватся MsgBoxы. Можно снова кликнуть по иконке показав окно, и изменить хоткеи.</p><div class="codebox"><pre><code>
#NoEnv
#SingleInstance Force
OnExit(&quot;ExitApp&quot;)
Menu, Tray, Click, 1
Menu, Tray, NoStandard
Menu, Tray, Add, Hide/Show, GuiClose
Menu, Tray, Add, ExitApp, ExitApp
Menu, Tray, Default, Hide/Show
Hotkey_IniPath(A_ScriptDir &quot;\Hotkey.ini&quot;), Hotkey_IniSection(&quot;Hotkeys&quot;)
#IF !GuiShow   ; по данному алгоритму условие не требуется, я добавил чтобы проще было менять на своё.
#IF
GuiShow := 1
Gui, Add, Edit, Center w300 r1 hwndhMyHotkey1, % Hotkey_Read(&quot;MyHotkey1&quot;)
Gui, Add, Edit, Center wp y+10 r1 hwndhMyHotkey2, % Hotkey_Read(&quot;MyHotkey2&quot;)
Gui, Add, Edit, Center wp y+10 r1 hwndhMyHotkey3, % Hotkey_Read(&quot;MyHotkey3&quot;)
Hotkey_Register([&quot;MyHotkey1&quot;,hMyHotkey1,&quot;KMJG1&quot;], [&quot;MyHotkey2&quot;,hMyHotkey2,&quot;KMJDG1&quot;], [&quot;MyHotkey3&quot;,hMyHotkey3,&quot;KMJWG1&quot;])

GuiClose:
	HotkeySet(GuiShow := !GuiShow)
	Gui, Show, % GuiShow ? &quot;&quot; : &quot;Hide&quot;
	Return
	
HotkeySet(Reset=0) {
	Hotkey, IF, !GuiShow   ; по данному алгоритму условие не требуется, я добавил чтобы проще было менять на своё.
	Loop, 3
	{
		IF Reset
			Hotkey, % Hotkey_Value(&quot;MyHotkey&quot; A_Index), Off, UseErrorLevel
		Else IF (1, Hotkey_IniWrite(&quot;MyHotkey&quot; A_Index))
			Hotkey, % Hotkey_Value(&quot;MyHotkey&quot; A_Index), Action%A_Index%, UseErrorLevel On
	}
	Hotkey, IF
}

ExitApp() {
	HotkeySet()
    ExitApp
}

Action1:
	MsgBox, , , % A_ThisLabel &quot;`n&quot; A_ThisHotkey, 0.6
	Return

Action2:
	MsgBox, , , % A_ThisLabel &quot;`n&quot; A_ThisHotkey, 0.6
	Return

Action3:
	MsgBox, , , % A_ThisLabel &quot;`n&quot; A_ThisHotkey, 0.6
	Return
</code></pre></div></div></div><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Работа с несколькими окнами, контролы объединены в группу (нельзя назначить одинаковые ГК):</div><div class="fancy_spoiler"><div class="codebox"><pre><code>
#NoEnv
#SingleInstance Force 

Hotkey_Arr(&quot;Empty&quot;, &quot;NO&quot;)
Hotkey_Arr(&quot;OnlyEngSym&quot;, True)
Hotkey_IniPath(A_ScriptDir &quot;\Hotkey.ini&quot;)
Hotkey_IniSection(&quot;Hotkeys&quot;)

Loop 4
    GuiCreate(A_Index)

GuiCreate(I) {
    Gui, %I%:-DPIScale +AlwaysOnTop +LabelGui
    Gui, %I%:Add, Edit, Center xm ym w300 r1 hwndh1 gSave, % Hotkey_Read(I &quot;Hotkey1&quot;)
    Gui, %I%:Add, Edit, Center wp y+10 r1 hwndh2 gSave, % Hotkey_Read(I &quot;Hotkey2&quot;)
    Gui, %I%:Add, Edit, Center wp y+10 r1 hwndh3 gSave, % Hotkey_Read(I &quot;Hotkey3&quot;)
	Hotkey_Register([I &quot;Hotkey1&quot;,h1,&quot;KMLRJG1W&quot;], [I &quot;Hotkey2&quot;,h2,&quot;KMLRJDG1&quot;], [I &quot;Hotkey3&quot;,h3,&quot;KMLRJG1&quot;])
    Gui, %I%:Show, % &quot;y100 x&quot; 100+(I-1)*350, Hotkey Gui %I%
}

Save(Hwnd) {
    Hotkey_IniWrite(Hwnd)
}

GuiClose() { 
    ExitApp
}
</code></pre></div></div></div><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Обработка повторов в группах:</div><div class="fancy_spoiler"><p>В ключе GroupEvents указываем имя своей функции <br /></p><div class="codebox"><pre><code>Hotkey_Arr(&quot;GroupEvents&quot;, &quot;GroupEventsProc&quot;) </code></pre></div><p>которая в случае совпадения принимает массив с ключами:<br /><span class="bbu">names</span> - массив имён в которых есть совпадения.<br /><span class="bbu">this</span> - имя в который хотели ввести хоткей.<br /><span class="bbu">value</span> - введённый хоткей.<br /><span class="bbu">group</span> - номер группы.</p><br /><div class="codebox"><pre><code>
#NoEnv
#SingleInstance Force

Hotkey_Group(&quot;CheckAll&quot;)
Hotkey_Arr(&quot;GroupEvents&quot;, &quot;GroupEventsProc&quot;)
Hotkey_IniPath(A_ScriptDir &quot;\Hotkey.ini&quot;)
Hotkey_IniSection(&quot;Hotkeys&quot;)

Loop 4
    GuiCreate(A_Index)
Return

GroupEventsProc(arr) {
 	for k, v in arr.names
		names .= &quot;`n&quot; v
	WinGetPos, x, y, w, h, % &quot;ahk_id&quot; Hotkey_ID(arr.this)
	S_CoordModeToolTip := A_CoordModeToolTip
	CoordMode, ToolTip, Screen
	ToolTip, % &quot;&#039;&quot; Hotkey_HKToStr(arr.value) &quot;&#039; уже назначено в группе номер: &quot; arr.group names, x + w + 2, y + h + 2, 20
	CoordMode, ToolTip, %S_CoordModeToolTip%
	SetTimer HideTooltip20, -500
	Return

	HideTooltip20:
		ToolTip,,,, 20
		Return
}

GuiCreate(I) {
    Gui, %I%:-DPIScale +AlwaysOnTop +LabelGui
    Gui, %I%:Add, Edit, Center xm ym w300 r1 hwndh1 gSave, % Hotkey_Read(I &quot;Hotkey1&quot;)
    Gui, %I%:Add, Edit, Center wp y+10 r1 hwndh2 gSave, % Hotkey_Read(I &quot;Hotkey2&quot;)
    Gui, %I%:Add, Edit, Center wp y+10 r1 hwndh3 gSave, % Hotkey_Read(I &quot;Hotkey3&quot;)
	Hotkey_Register([I &quot;Hotkey1&quot;,h1,&quot;KMLRJG1W&quot;], [I &quot;Hotkey2&quot;,h2,&quot;KMLRJDG1&quot;], [I &quot;Hotkey3&quot;,h3,&quot;KMLRJG1&quot;])
    Gui, %I%:Show, % &quot;y100 x&quot; 100+(I-1)*350, Hotkey Gui %I%
}

Save(Hwnd) {
    Hotkey_IniWrite(Hwnd)
}

GuiClose() {
    ExitApp
}
</code></pre></div></div></div></div></div>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Wed, 29 May 2013 20:43:55 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=72549#p72549</guid>
		</item>
	</channel>
</rss>
