201

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov пишет:

Можно сделать свой костыль

Спасибо, этого вполне достаточно.

serzh82saratov пишет:

Это не баг, это фича

Именно о новой функции "G"
Вот скрин, в том месте на другой вкладке находится этот хоткей, я про это говорил. Кстати не всегда просвечивается хоткей из другой вкладки.

+ открыть спойлер

https://monosnap.com/file/3jGPDIFHN3jR95XwcqYMYA72XjKdEg.png

202

Re: AHK: Замена стандартного элемента управления "Hotkey"

А, разговор про Tab. Видимо это его недоработки, вы кстати контрол Tab3 используете? Они в Tabе часто что то допиливают.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

203

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov
Нет, я если честно и не знал про tab3. В русской викие ничего про это нет, а с английским у меня туговато.

204 (изменено: serzh82saratov, 2016-11-06 22:09:14)

Re: AHK: Замена стандартного элемента управления "Hotkey"

Вы после tab троечку допишите, авось поедет.

Gui, Add, Tab3,, General|View|Appearance|Settings
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

205

Re: AHK: Замена стандартного элемента управления "Hotkey"

Нет, не прошло, всё так же.

206

Re: AHK: Замена стандартного элемента управления "Hotkey"

Сделаете короткий код с табом, посмотрю.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

207

Re: AHK: Замена стандартного элемента управления "Hotkey"

Сожалею, но я не знаю как короче без всего вашего скрипта.

modkey1 = !F4
modkey2 = !F1
#NoEnv
#SingleInstance Force 
Hotkey_IniPath(A_ScriptDir "\Hotkey.ini")
	Gui, Add, Tab3, x7 y10 h100 w150 cBlue HwndtabID, 1|2
	Gui, Add, Edit, r1 center w120 hwndhmodkey1, % Hotkey_Set("modkey1", modkey1)
	Gui, Tab, 2
	Gui, Add, Edit, r1 center y+45 w120 hwndhmodkey2, % Hotkey_Set("modkey2", modkey2)
	Gui, Show
	Hotkey_Register(["modkey1",hmodkey1,"KG1"]
				, ["modkey2",hmodkey2,"KG1"])
	Return
	
;===========================================================================================
Hotkey_Register(Controls*) {
	Static IsStart
	Local k, v, g, g1
	For k, v in Controls
	{
		Hotkey_ID(v[2], v[1]), Hotkey_ID(v[1], v[2])
		Hotkey_Options(v[2], v[3] = "" ? "K" : v[3])
		Hotkey_Value(v[2], Hotkey_Value(v[1]))
		PostMessage, 0x00CF, 1, , , % "ahk_id" v[2]   ;  EM_SETREADONLY
		If RegExMatch(v[3], "i)G(\d+)", g)
			Hotkey_Group("Set", v[1], g1)
	}
	If IsStart
		Return Hotkey_IsRegFocus()
	#HotkeyInterval 0
	Hotkey_SetWinEventHook(0x8005, 0x8005, 0, RegisterCallback("Hotkey_EventFocus", "F"), 0, 0, 0)   ;  EVENT_OBJECT_FOCUS := 0x8005
	Hotkey_InitHotkeys(), Hotkey_IsRegFocus(), IsStart := 1
}

Hotkey_Main(Param1, Param2 = "") {
	Static OnlyMods, ControlHandle, Hotkey, KeyName, K := {}
	, Prefix := {"LAlt":"<!","LCtrl":"<^","LShift":"<+","LWin":"<#"
				,"RAlt":">!","RCtrl":">^","RShift":">+","RWin":">#"
				,"Alt":"!","Ctrl":"^","Shift":"+","Win":"#"}
	, EngSym := {"sc2":"1","sc3":"2","sc4":"3","sc5":"4","sc6":"5","sc7":"6"
				,"sc8":"7","sc9":"8","scA":"9","scB":"0","scC":"-","scD":"="
				,"sc10":"Q","sc11":"W","sc12":"E","sc13":"R","sc14":"T","sc15":"Y"
				,"sc16":"U","sc17":"I","sc18":"O","sc19":"P","sc1A":"[","sc1B":"]"
				,"sc1E":"A","sc1F":"S","sc20":"D","sc21":"F","sc22":"G","sc23":"H"
				,"sc24":"J","sc25":"K","sc26":"L","sc27":"`;","sc28":"'","sc29":"``"
				,"sc2B":"\","sc2C":"Z","sc2D":"X","sc2E":"C","sc2F":"V","sc30":"B"
				,"sc31":"N","sc32":"M","sc33":",","sc34":".","sc35":"/"}
	Local IsMod, Text

	If Param1 = GetMod
		Return K.MLCtrl K.MRCtrl K.MLAlt K.MRAlt K.MLShift K.MRShift K.MLWin K.MRWin K.MCtrl K.MAlt K.MShift K.MWin
	If Param2
	{
		If OnlyMods
		{
			SendMessage, 0xC, 0, "" Hotkey_Arr("Empty"), , ahk_id %ControlHandle%
			OnlyMods := 0, K := {}
		}
		ControlHandle := Param2
		Hotkey_Arr("Hook", Hotkey_Options(ControlHandle))
		PostMessage, 0x00B1, -1, -1, , ahk_id %ControlHandle%   ;  EM_SETSEL
	}
	Else If Hotkey_Arr("Hook")
	{
		Hotkey_Arr("Hook", 0), K := {}
		If OnlyMods
			SendMessage, 0xC, 0, "" Hotkey_Arr("Empty"), , ahk_id %ControlHandle%
		SetTimer, Hotkey_IsRegFocus, -200
	}
	Return

Hotkey_Mods:
	If InStr(Hotkey_Arr("Hook"), "S")
		GoTo Hotkey_View
	IsMod := InStr(Hotkey_Arr("Hook"), "D") ? A_ThisHotkey : SubStr(A_ThisHotkey, 2)
	If (K["M" IsMod] != "")
		Return
	K["M" IsMod] := IsMod "+", K["P" IsMod] := Prefix[IsMod]
	GoTo Hotkey_ViewMod

Hotkey_ModsUp:
	If InStr(Hotkey_Arr("Hook"), "S")
		Return
	IsMod := InStr(Hotkey_Arr("Hook"), "D") ? SubStr(A_ThisHotkey, 1, -3) : SubStr(A_ThisHotkey, 2, -3)
	K["M" IsMod] := "", K["P" IsMod] := ""
	If (Hotkey != "")
		Return

Hotkey_ViewMod:
	Hotkey := "", OnlyMods := 1, Hotkey_Value(Hotkey_ID(ControlHandle), K.Prefix Hotkey), Hotkey_Value(ControlHandle, K.Prefix Hotkey)
	K.Mods := K.MLCtrl K.MRCtrl K.MLAlt K.MRAlt K.MLShift K.MRShift K.MLWin K.MRWin K.MCtrl K.MAlt K.MShift K.MWin
	Text := K.Mods = "" ? Hotkey_Arr("Empty") : K.Mods
	SendMessage, 0xC, 0, &Text, , ahk_id %ControlHandle%
	Return

Hotkey_View:
Hotkey_ViewSC:
	If (A_ThisLabel = "Hotkey_ViewSC")
		KeyName := Hotkey_Arr("OnlyEngSym") ? EngSym[A_ThisHotkey] : Format("{:U}", GetKeyName(A_ThisHotkey))
	Else
		KeyName := A_ThisHotkey
	Hotkey := A_ThisHotkey, OnlyMods := 0
	K.Prefix := K.PLCtrl K.PRCtrl K.PLAlt K.PRAlt K.PLShift K.PRShift K.PLWin K.PRWin K.PCtrl K.PAlt K.PShift K.PWin
	Hotkey_Value(Hotkey_ID(ControlHandle), K.Prefix Hotkey), Hotkey_Value(ControlHandle, K.Prefix Hotkey)
	K.Mods := K.MLCtrl K.MRCtrl K.MLAlt K.MRAlt K.MLShift K.MRShift K.MLWin K.MRWin K.MCtrl K.MAlt K.MShift K.MWin
	Text := K.Mods KeyName = "" ? Hotkey_Arr("Empty") : K.Mods KeyName
	SendMessage, 0xC, 0, &Text, , ahk_id %ControlHandle%
	If Hotkey_Group("Get", Hotkey_ID(ControlHandle)) && Hotkey_Group("SaveCheck", ControlHandle)
		SetTimer, Hotkey_Group, -70
	Return
}

Hotkey_InitHotkeys() {
	Local S_FormatInteger, Name
	Static nmMods := "LAlt|RAlt|LCtrl|RCtrl|LShift|RShift|LWin|RWin"
	, nmMouse := "MButton|WheelDown|WheelUp|WheelRight|WheelLeft|XButton1|XButton2"
	, scSymb := "2|3|4|5|6|7|8|9|A|B|C|D|10|11|12|13|14|15|16|17|18|19|1A|1B|1E|1F|"
		. "20|21|22|23|24|25|26|27|28|29|2B|2C|2D|2E|2F|30|31|32|33|34|35"
	, scNoSymb := "1|E|F|1C|37|39|3A|3B|3C|3D|3E|3F|40|41|42|43|44|45|46|47|48|49|4A|4B|4C|4D|4E|4F|50|51|52|53|54|"
		. "57|58|63|64|65|66|67|68|69|6A|6B|6C|6D|6E|76|11C|135|147|148|149|14B|14D|14F|150|151|152|153|15D"
	, vkOther := "3|13|5F|60|61|62|63|64|65|66|67|68|69|6E|A6|A7|A8|A9|AA|AB|AC|AD|AE|AF|B0|B1|B2|B3|B4|B5|B6|B7"
	#IF Hotkey_IsRegControl()
	#IF Hotkey_Hook("K")
	#IF Hotkey_Hook("M")
	#IF Hotkey_Hook("L") && GetKeyState("RButton", "P")
	#IF Hotkey_Hook("R")
	#IF Hotkey_Hook("J") && !Hotkey_Main("GetMod")
	#IF Hotkey_Arr("Hook") && !Hotkey_Hook("K")
	#IF
	Hotkey, IF, Hotkey_Hook("M")
	Loop, Parse, nmMouse, |
		Hotkey, % A_LoopField, Hotkey_View
	Hotkey, IF, Hotkey_Hook("K")
	Loop, Parse, nmMods, |
	{
		Hotkey, % A_LoopField, Hotkey_Mods
		Hotkey, % A_LoopField " Up", Hotkey_ModsUp
	}
	Loop, Parse, scSymb, |
		Hotkey, % "sc" A_LoopField, Hotkey_ViewSC
	Loop, Parse, scNoSymb, |
		Hotkey, % GetKeyName("sc" A_LoopField), Hotkey_View
	Loop, Parse, vkOther, |
		Hotkey, % GetKeyName("vk" A_LoopField), Hotkey_View
	Hotkey, IF, Hotkey_Hook("L") && GetKeyState("RButton"`, "P")
	Hotkey, LButton, Hotkey_View
	Hotkey, IF, Hotkey_Hook("R")
	Hotkey, RButton, Hotkey_View
	S_FormatInteger := A_FormatInteger
	SetFormat, IntegerFast, D
	Hotkey, IF, Hotkey_Hook("J") && !Hotkey_Main("GetMod")
	Loop, 128
		Hotkey % Ceil(A_Index / 32) "Joy" Mod(A_Index - 1, 32) + 1, Hotkey_View
	SetFormat, IntegerFast, %S_FormatInteger%
	Hotkey, IF, Hotkey_IsRegControl()
	Hotkey, RButton, Hotkey_RButton
	Hotkey, RButton Up, Hotkey_Return
	Hotkey, IF, Hotkey_Arr("Hook") && !Hotkey_Hook("K")
	Hotkey, AppsKey Up, Hotkey_Return
	Hotkey, +F10, Hotkey_Return
	Hotkey, IF
	Return

	Hotkey_RButton:
		Click
	Hotkey_Return:
		Return
}

Hotkey_IsRegControl() {
	Local Control
	MouseGetPos,,,, Control, 2
	Return Hotkey_ID(Control) != ""
}

Hotkey_IsRegFocus() {
	Local ControlNN, hFocus
	ControlGetFocus, ControlNN, A
	ControlGet, hFocus, Hwnd, , %ControlNN%, A
	Hotkey_ID(hFocus) != "" ? Hotkey_Main("Control", hFocus) : 0
}

Hotkey_EventFocus(hWinEventHook, event, hwnd) {
	Hotkey_ID(hwnd) != "" ? Hotkey_Main("Control", hwnd) : Hotkey_Main("Control")
}

Hotkey_SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags) {
	Return DllCall("SetWinEventHook" , "UInt", eventMin, "UInt", eventMax, "Ptr", hmodWinEventProc
			, "Ptr", lpfnWinEventProc, "UInt", idProcess, "UInt", idThread, "UInt", dwFlags, "Ptr")
}

	; -------------------------------------- Save and get --------------------------------------

Hotkey_Arr(P*) {
	Static Arr := {"Empty":"Нет"}
	Return P.MaxIndex() = 1 ? Arr[P[1]] : (Arr[P[1]] := P[2])
}

Hotkey_ID(P*) {
	Static Arr := {}
	Return P.MaxIndex() = 1 ? Arr[P[1]] : P.MaxIndex() = 2 ? (Arr[P[1]] := P[2]) : Arr.Delete(P[1])
}

Hotkey_Value(P*) {
	Static Arr := {}
	Return P.MaxIndex() = 1 ? Arr[P[1]] : P.MaxIndex() = 2 ? (Arr[P[1]] := P[2]) : Arr.Delete(P[1])
}

Hotkey_Options(P*) {
	Static Arr := {}
	Return P.MaxIndex() = 1 ? Arr[P[1]] : P.MaxIndex() = 2 ? (Arr[P[1]] := P[2]) : Arr.Delete(P[1])
}

Hotkey_ChangeOption(ID, Option) {
	Local Hwnd
	Hwnd := (ID + 0 != "") ? ID : Hotkey_ID(ID)
	Return Hotkey_Options(Hwnd, Option)
}

Hotkey_Hook(Option) {
	Return Hotkey_Arr("Hook") && !!InStr(Hotkey_Arr("Hook"), Option)
}

Hotkey_Delete(ID, Destroy=0) {
	Local Hwnd, Name, hFocus, ControlNN
	(ID + 0 = "") ? (Hwnd := Hotkey_ID(ID), Name := ID) : (Hwnd := ID, Name := Hotkey_ID(ID))
	Hotkey_ID(Hwnd, "", 1), Hotkey_ID(Name, "", 1)
	Hotkey_Value(Hwnd, "", 1), Hotkey_Value(Name, "", 1)
	Hotkey_Options(Hwnd, "", 1)
	ControlGetFocus, ControlNN, A
	ControlGet, hFocus, Hwnd, , %ControlNN%, A
	(hFocus = Hwnd ? Hotkey_Main("Control") : 0)
	If Destroy
		DllCall("DestroyWindow", "Ptr", Hwnd)
	Else
		PostMessage, 0x00CF, 0, , , % "ahk_id" Hwnd		;  EM_SETREADONLY
	Return Hwnd
}

Hotkey_Set(Name, Value="") {
	Text := Value = "" ? Hotkey_Arr("Empty") : Hotkey_HKToStr(Value)
	SendMessage, 0xC, 0, &Text, , % "ahk_id" Hotkey_ID(Name)
	Return Hotkey_HKToStr(Value), Hotkey_Value(Name, Value), Hotkey_Value(Hotkey_ID(Name), Value)
}

Hotkey_Read(Name, Section = "", FilePath = "") {
	Local HK
	HK := Hotkey_IniRead(Name, Section, FilePath), Hotkey_Value(Name, HK)
	Return Hotkey_HKToStr(HK)
}

Hotkey_IniPath(Path = "") {
	Return Path = "" ? Hotkey_Arr("IniPath") : Hotkey_Arr("IniPath", Path)
}

Hotkey_IniSection(Section = "") {
	Return Section = "" ? Hotkey_Arr("IniSection") : Hotkey_Arr("IniSection", Section)
}

Hotkey_IniRead(Name, Section = "", FilePath = "") {
	Local Data
	IniRead, Data, % FilePath = "" ? Hotkey_IniPath() : FilePath, % Section = "" ? Hotkey_IniSection() : Section, % Name, % A_Space
	Return Data
}

Hotkey_IniWrite(ID, Section = "", FilePath = "") {
	Local Key
	Key := (ID + 0 = "") ? ID : Hotkey_ID(ID)
	If (Key != "")
		IniWrite, % Hotkey_Value(ID), % FilePath = "" ? Hotkey_IniPath() : FilePath, % Section = "" ? Hotkey_IniSection() : Section, % Key
}

	; -------------------------------------- Group --------------------------------------

Hotkey_Group(Key = "", p1 = "", p2 = "") {
	Local Name, Value, k, v, n, m
	Static NG := {}, GN := [], Blink := [], SaveCheck := [], i := 0
	If (Key = "") {
		For k, Name in SaveCheck
		{
			If ((Value := Hotkey_Value(Name)) != "")
				For m, n in GN[NG[Name]] {
					If (n != Name && Hotkey_Equal(Value, Hotkey_Value(n))) {
						DllCall("ShowWindowAsync", "Ptr", Hotkey_ID(n), "Int", 0)
						Blink[Hotkey_ID(n)] := 1, i := 5, Hotkey_Set(Name)
						SetTimer, Hotkey_BlinkControl, -50
					}
				}
			SaveCheck.Delete(k)
		}
	}
	Else If (Key = "Set")
		NG[p1] := p2, IsObject(GN[p2]) ? GN[p2].Push(p1) : GN[p2] := [p1]
	Else If (Key = "SaveCheck")
		Return 1, SaveCheck[p1] := Hotkey_ID(p1)
	Else If (Key = "Get")
		Return NG[p1] != ""
	Else If (Key = "CheckAll") {
		For k, v in GN
			For k, n in v
				If ((Value := Hotkey_Value(n)) != "")
					For k, m in v
						If (n != m && Hotkey_Equal(Value, Hotkey_Value(m)))
							Hotkey_Set(m)
	}
	Return

	Hotkey_BlinkControl:
		For k in Blink
			DllCall("ShowWindowAsync", "Ptr", k, "Int", Mod(i, 2) ? 4 : 0)
		If (--i > 0) || !(Blink := [])
			SetTimer, Hotkey_BlinkControl, -50
		Return
}

Hotkey_Equal(HK1, HK2) {
	If (HK2 = "")
		Return 0
	If (HK1 = HK2)
		Return 1
	If !(HK1 ~= "S)[\^\+!#]") || !(HK2 ~= "S)[\^\+!#]")
		Return 0
	If (HK1 ~= "S)[<>]") && (HK2 ~= "S)[<>]")
		Return 0
	Return (Hotkey_ModsSub(HK1) = Hotkey_ModsSub(HK2))
}

Hotkey_ModsSub(Value) {
	If !(Value ~= "[<>]")
		Return Value
	ValueSub := StrReplace(Value, "<")
	ValueSub := StrReplace(ValueSub, ">")
	ValueSub := StrReplace(ValueSub, "^^", "^", , 1)
	ValueSub := StrReplace(ValueSub, "!!", "!", , 1)
	ValueSub := StrReplace(ValueSub, "++", "+", , 1)
	Return StrReplace(ValueSub, "##", "#", , 1)
}

	; -------------------------------------- Format --------------------------------------

	; http://forum.script-coding.com/viewtopic.php?pid=105023#p105023

Hotkey_HKToStr(HK) {
	Static LRPrefix := [["<^","LCtrl"],[">^","RCtrl"],["<!","LAlt"],[">!","RAlt"]
					,["<+","LShift"],[">+","RShift"],["<#","LWin"],[">#","RWin"]]
	, Prefix := [["^","Ctrl"],["!","Alt"],["+","Shift"],["#","Win"]]
	, EngSym := {"sc2":"1","sc3":"2","sc4":"3","sc5":"4","sc6":"5","sc7":"6"
				,"sc8":"7","sc9":"8","scA":"9","scB":"0","scC":"-","scD":"="
				,"sc10":"Q","sc11":"W","sc12":"E","sc13":"R","sc14":"T","sc15":"Y"
				,"sc16":"U","sc17":"I","sc18":"O","sc19":"P","sc1A":"[","sc1B":"]"
				,"sc1E":"A","sc1F":"S","sc20":"D","sc21":"F","sc22":"G","sc23":"H"
				,"sc24":"J","sc25":"K","sc26":"L","sc27":"`;","sc28":"'","sc29":"``"
				,"sc2B":"\","sc2C":"Z","sc2D":"X","sc2E":"C","sc2F":"V","sc30":"B"
				,"sc31":"N","sc32":"M","sc33":",","sc34":".","sc35":"/"

				,"vk31":"1","vk32":"2","vk33":"3","vk34":"4","vk35":"5","vk36":"6"
				,"vk37":"7","vk38":"8","vk39":"9","vk30":"0","vkBD":"-","vkBB":"="
				,"vk51":"Q","vk57":"W","vk45":"E","vk52":"R","vk54":"T","vk59":"Y"
				,"vk55":"U","vk49":"I","vk4F":"O","vk50":"P","vkDB":"[","vkDD":"]"
				,"vk41":"A","vk53":"S","vk44":"D","vk46":"F","vk47":"G","vk48":"H"
				,"vk4A":"J","vk4B":"K","vk4C":"L","vkBA":"`;","vkDE":"'","vkC0":"``"
				,"vkDC":"\","vk5A":"Z","vk58":"X","vk43":"C","vk56":"V","vk42":"B"
				,"vk4E":"N","vk4D":"M","vkBC":",","vkBE":".","vkBF":"/"}

	Local K, K1, K2, I, V, M, R
	RegExMatch(HK, "S)^\s*([~\*\$\^\+!#<>]*)\{?(.*?)}?\s*$", K)
	If (K2 = "")
		Return "" Hotkey_Arr("Empty")
	If (InStr("|" K2, "|sc", 1) || InStr("|" K2, "|vk", 1))
		K2 := Hotkey_Arr("OnlyEngSym") && EngSym.HasKey(K2) ? EngSym[K2] : Format("{:U}", GetKeyName(K2))
	If (K1 != "")
		For I, V in K1 ~= "[<>]" ? LRPrefix : Prefix
			K1 := StrReplace(K1, V[1], "", R), R && (M .= V[2] "+")
	Return M . (StrLen(K2) = 1 ? Format("{:U}", K2) : K2)
}

Hotkey_HKToSend(HK, Section = "", FilePath = "") {
	Static LRPrefix := [["<^","LCtrl"],[">^","RCtrl"],["<!","LAlt"],[">!","RAlt"]
					,["<+","LShift"],[">+","RShift"],["<#","LWin"],[">#","RWin"]]
		, Prefix := [["^","LCtrl"],["!","LAlt"],["+","LShift"],["#","LWin"]]
	Local K, K1, K2, I, V, M1, M2, R
	If (HK = "")
		Return
	If (Section != "")
		IniRead, HK, % FilePath = "" ? Hotkey_IniPath() : FilePath, % Section, % HK, % A_Space
	RegExMatch(HK, "S)^\s*([~\*\$\^\+!#<>]*)\{?(.*?)}?\s*$", K)
	If (K1 != "")
		For I, V in K1 ~= "[<>]" ? LRPrefix : Prefix
			K1 := StrReplace(K1, V[1], "", R)
			, R ? (M1 .= "{" V[2] " Down}", M2 .= "{" V[2] " Up}") : 0
	Return M1 . "{" K2 "}" . M2
}

208

Re: AHK: Замена стандартного элемента управления "Hotkey"

Ну мы же с вами знаем о какой версии кода (библиотеки) говорим. Сами же отделили ;======= не нужное.

Так у меня не мелькает.


	;  http://forum.script-coding.com/viewtopic.php?id=8343

Hotkey_Register(Controls*) {
	Static IsStart
	Local k, v, g, g1
	For k, v in Controls
	{
		Hotkey_ID(v[2], v[1]), Hotkey_ID(v[1], v[2])
		Hotkey_Options(v[2], v[3] = "" ? "K" : v[3])
		Hotkey_Value(v[2], Hotkey_Value(v[1]))
		PostMessage, 0x00CF, 1, , , % "ahk_id" v[2]   ;  EM_SETREADONLY
		If RegExMatch(v[3], "i)G(\d+)", g)
			Hotkey_Group("Set", v[1], g1)
	}
	If IsStart
		Return Hotkey_IsRegFocus()
	#HotkeyInterval 0
	Hotkey_SetWinEventHook(0x8005, 0x8005, 0, RegisterCallback("Hotkey_EventFocus", "F"), 0, 0, 0)   ;  EVENT_OBJECT_FOCUS := 0x8005
	Hotkey_InitHotkeys(), Hotkey_IsRegFocus(), IsStart := 1
}

Hotkey_Main(Param1, Param2 = "") {
	Static OnlyMods, ControlHandle, Hotkey, KeyName, K := {}
	, Prefix := {"LAlt":"<!","LCtrl":"<^","LShift":"<+","LWin":"<#"
				,"RAlt":">!","RCtrl":">^","RShift":">+","RWin":">#"
				,"Alt":"!","Ctrl":"^","Shift":"+","Win":"#"}
	, EngSym := {"sc2":"1","sc3":"2","sc4":"3","sc5":"4","sc6":"5","sc7":"6"
				,"sc8":"7","sc9":"8","scA":"9","scB":"0","scC":"-","scD":"="
				,"sc10":"Q","sc11":"W","sc12":"E","sc13":"R","sc14":"T","sc15":"Y"
				,"sc16":"U","sc17":"I","sc18":"O","sc19":"P","sc1A":"[","sc1B":"]"
				,"sc1E":"A","sc1F":"S","sc20":"D","sc21":"F","sc22":"G","sc23":"H"
				,"sc24":"J","sc25":"K","sc26":"L","sc27":"`;","sc28":"'","sc29":"``"
				,"sc2B":"\","sc2C":"Z","sc2D":"X","sc2E":"C","sc2F":"V","sc30":"B"
				,"sc31":"N","sc32":"M","sc33":",","sc34":".","sc35":"/"}
	Local IsMod, Text

	If Param1 = GetMod
		Return K.MLCtrl K.MRCtrl K.MLAlt K.MRAlt K.MLShift K.MRShift K.MLWin K.MRWin K.MCtrl K.MAlt K.MShift K.MWin
	If Param2
	{
		If OnlyMods
		{
			SendMessage, 0xC, 0, "" Hotkey_Arr("Empty"), , ahk_id %ControlHandle%
			OnlyMods := 0, K := {}
		}
		ControlHandle := Param2
		Hotkey_Arr("Hook", Hotkey_Options(ControlHandle))
		PostMessage, 0x00B1, -1, -1, , ahk_id %ControlHandle%   ;  EM_SETSEL
	}
	Else If Hotkey_Arr("Hook")
	{
		Hotkey_Arr("Hook", 0), K := {}
		If OnlyMods
			SendMessage, 0xC, 0, "" Hotkey_Arr("Empty"), , ahk_id %ControlHandle%
		SetTimer, Hotkey_IsRegFocus, -200
	}
	Return

Hotkey_Mods:
	If InStr(Hotkey_Arr("Hook"), "S")
		GoTo Hotkey_View
	IsMod := InStr(Hotkey_Arr("Hook"), "D") ? A_ThisHotkey : SubStr(A_ThisHotkey, 2)
	If (K["M" IsMod] != "")
		Return
	K["M" IsMod] := IsMod "+", K["P" IsMod] := Prefix[IsMod]
	GoTo Hotkey_ViewMod

Hotkey_ModsUp:
	If InStr(Hotkey_Arr("Hook"), "S")
		Return
	IsMod := InStr(Hotkey_Arr("Hook"), "D") ? SubStr(A_ThisHotkey, 1, -3) : SubStr(A_ThisHotkey, 2, -3)
	K["M" IsMod] := "", K["P" IsMod] := ""
	If (Hotkey != "")
		Return

Hotkey_ViewMod:
	Hotkey := "", OnlyMods := 1, Hotkey_Value(Hotkey_ID(ControlHandle), K.Prefix Hotkey), Hotkey_Value(ControlHandle, K.Prefix Hotkey)
	K.Mods := K.MLCtrl K.MRCtrl K.MLAlt K.MRAlt K.MLShift K.MRShift K.MLWin K.MRWin K.MCtrl K.MAlt K.MShift K.MWin
	Text := K.Mods = "" ? Hotkey_Arr("Empty") : K.Mods
	SendMessage, 0xC, 0, &Text, , ahk_id %ControlHandle%
	Return

Hotkey_View:
Hotkey_ViewSC:
	If (A_ThisLabel = "Hotkey_ViewSC")
		KeyName := Hotkey_Arr("OnlyEngSym") ? EngSym[A_ThisHotkey] : Format("{:U}", GetKeyName(A_ThisHotkey))
	Else
		KeyName := A_ThisHotkey
	Hotkey := A_ThisHotkey, OnlyMods := 0
	K.Prefix := K.PLCtrl K.PRCtrl K.PLAlt K.PRAlt K.PLShift K.PRShift K.PLWin K.PRWin K.PCtrl K.PAlt K.PShift K.PWin
	Hotkey_Value(Hotkey_ID(ControlHandle), K.Prefix Hotkey), Hotkey_Value(ControlHandle, K.Prefix Hotkey)
	K.Mods := K.MLCtrl K.MRCtrl K.MLAlt K.MRAlt K.MLShift K.MRShift K.MLWin K.MRWin K.MCtrl K.MAlt K.MShift K.MWin
	Text := K.Mods KeyName = "" ? Hotkey_Arr("Empty") : K.Mods KeyName
	SendMessage, 0xC, 0, &Text, , ahk_id %ControlHandle%
	If Hotkey_Group("Get", Hotkey_ID(ControlHandle)) && Hotkey_Group("SaveCheck", ControlHandle)
		SetTimer, Hotkey_Group, -70
	Return
}

Hotkey_InitHotkeys() {
	Local S_FormatInteger, S_BatchLines
	Static nmMods := "LAlt|RAlt|LCtrl|RCtrl|LShift|RShift|LWin|RWin"
	, nmMouse := "MButton|WheelDown|WheelUp|WheelRight|WheelLeft|XButton1|XButton2"
	, scSymb := "2|3|4|5|6|7|8|9|A|B|C|D|10|11|12|13|14|15|16|17|18|19|1A|1B|"
		. "1E|1F|20|21|22|23|24|25|26|27|28|29|2B|2C|2D|2E|2F|30|31|32|33|34|35"
	, scNoSymb := "1|E|F|1C|37|39|3A|3B|3C|3D|3E|3F|40|41|42|43|44|45|46|47|48|49|4A|4B|4C|4D|4E|4F|50|51|52|"
		. "53|54|57|58|63|64|65|66|67|68|69|6A|6B|6C|6D|6E|76|11C|135|147|148|149|14B|14D|14F|150|151|152|153|15D"
	, vkOther := "3|13|5F|60|61|62|63|64|65|66|67|68|69|6E|A6|A7|A8|A9|AA|AB|AC|AD|AE|AF|B0|B1|B2|B3|B4|B5|B6|B7"
	S_BatchLines := A_BatchLines
	SetBatchLines, -1
	#IF Hotkey_IsRegControl()
	#IF Hotkey_Hook("K")
	#IF Hotkey_Hook("M")
	#IF Hotkey_Hook("L") && GetKeyState("RButton", "P")
	#IF Hotkey_Hook("R")
	#IF Hotkey_Hook("J") && !Hotkey_Main("GetMod")
	#IF Hotkey_Arr("Hook") && !Hotkey_Hook("K")
	#IF
	Hotkey, IF, Hotkey_Hook("M")
	Loop, Parse, nmMouse, |
		Hotkey, % A_LoopField, Hotkey_View
	Hotkey, IF, Hotkey_Hook("K")
	Loop, Parse, nmMods, |
	{
		Hotkey, % A_LoopField, Hotkey_Mods
		Hotkey, % A_LoopField " Up", Hotkey_ModsUp
	}
	Loop, Parse, scSymb, |
		Hotkey, % "sc" A_LoopField, Hotkey_ViewSC
	Loop, Parse, scNoSymb, |
		Hotkey, % GetKeyName("sc" A_LoopField), Hotkey_View
	Loop, Parse, vkOther, |
		Hotkey, % GetKeyName("vk" A_LoopField), Hotkey_View
	Hotkey, IF, Hotkey_Hook("L") && GetKeyState("RButton"`, "P")
	Hotkey, LButton, Hotkey_View
	Hotkey, IF, Hotkey_Hook("R")
	Hotkey, RButton, Hotkey_View
	S_FormatInteger := A_FormatInteger
	SetFormat, IntegerFast, D
	Hotkey, IF, Hotkey_Hook("J") && !Hotkey_Main("GetMod")
	Loop, 128
		Hotkey % Ceil(A_Index / 32) "Joy" Mod(A_Index - 1, 32) + 1, Hotkey_View
	SetFormat, IntegerFast, %S_FormatInteger%
	Hotkey, IF, Hotkey_IsRegControl()
	Hotkey, RButton, Hotkey_RButton
	Hotkey, RButton Up, Hotkey_Return
	Hotkey, IF, Hotkey_Arr("Hook") && !Hotkey_Hook("K")
	Hotkey, AppsKey Up, Hotkey_Return
	Hotkey, +F10, Hotkey_Return
	Hotkey, IF
	SetBatchLines, %S_BatchLines%
	Return

	Hotkey_RButton:
		Click
	Hotkey_Return:
		Return
}

Hotkey_IsRegControl() {
	Local Control
	MouseGetPos,,,, Control, 2
	Return Hotkey_ID(Control) != ""
}

Hotkey_IsRegFocus() {
	Local ControlNN, hFocus
	ControlGetFocus, ControlNN, A
	ControlGet, hFocus, Hwnd, , %ControlNN%, A
	Hotkey_ID(hFocus) != "" ? Hotkey_Main("Control", hFocus) : 0
}

Hotkey_EventFocus(hWinEventHook, event, hwnd) {
	Hotkey_ID(hwnd) != "" ? Hotkey_Main("Control", hwnd) : Hotkey_Main("Control")
}

Hotkey_SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags) {
	Return DllCall("SetWinEventHook" , "UInt", eventMin, "UInt", eventMax, "Ptr", hmodWinEventProc
			, "Ptr", lpfnWinEventProc, "UInt", idProcess, "UInt", idThread, "UInt", dwFlags, "Ptr")
}

	; -------------------------------------- Save and get --------------------------------------

Hotkey_Arr(P*) {
	Static Arr := {"Empty":"Нет"}
	Return P.MaxIndex() = 1 ? Arr[P[1]] : (Arr[P[1]] := P[2])
}

Hotkey_ID(P*) {
	Static Arr := {}
	Return P.MaxIndex() = 1 ? Arr[P[1]] : P.MaxIndex() = 2 ? (Arr[P[1]] := P[2]) : Arr.Delete(P[1])
}

Hotkey_Value(P*) {
	Static Arr := {}
	Return P.MaxIndex() = 1 ? Arr[P[1]] : P.MaxIndex() = 2 ? (Arr[P[1]] := P[2]) : Arr.Delete(P[1])
}

Hotkey_Options(P*) {
	Static Arr := {}
	Return P.MaxIndex() = 1 ? Arr[P[1]] : P.MaxIndex() = 2 ? (Arr[P[1]] := P[2]) : Arr.Delete(P[1])
}

Hotkey_ChangeOption(ID, Option) {
	Local Hwnd, Name, g, g1
	(ID + 0 = "") ? (Hwnd := Hotkey_ID(ID), Name := ID) : (Hwnd := ID, Name := Hotkey_ID(ID))
	If RegExMatch(Hotkey_Options(Hwnd), "i)G(\d+)", g)
		Hotkey_Group("Delete", Name)
	If RegExMatch(Option, "i)G(\d+)", g)
		Hotkey_Group("Set", Name, g1)
	Return Hotkey_Options(Hwnd, Option)
}

Hotkey_Hook(Option) {
	Return Hotkey_Arr("Hook") && !!InStr(Hotkey_Arr("Hook"), Option)
}

Hotkey_Delete(ID, Destroy=0) {
	Local Hwnd, Name, hFocus, ControlNN
	(ID + 0 = "") ? (Hwnd := Hotkey_ID(ID), Name := ID) : (Hwnd := ID, Name := Hotkey_ID(ID))
	Hotkey_Group("Delete", Name)
	Hotkey_ID(Hwnd, "", 1), Hotkey_ID(Name, "", 1)
	Hotkey_Value(Hwnd, "", 1), Hotkey_Value(Name, "", 1)
	Hotkey_Options(Hwnd, "", 1)
	ControlGetFocus, ControlNN, A
	ControlGet, hFocus, Hwnd, , %ControlNN%, A
	(hFocus = Hwnd ? Hotkey_Main("Control") : 0)
	If Destroy
		DllCall("DestroyWindow", "Ptr", Hwnd)
	Else
		PostMessage, 0x00CF, 0, , , % "ahk_id" Hwnd		;  EM_SETREADONLY
	Return Hwnd
}

Hotkey_Set(Name, Value="") {
	Local Text
	Text := Hotkey_HKToStr(Value)
	SendMessage, 0xC, 0, &Text, , % "ahk_id" Hotkey_ID(Name)
	Return Text, Hotkey_Value(Name, Value), Hotkey_Value(Hotkey_ID(Name), Value)
}

Hotkey_Read(Name, Section = "", FilePath = "") {
	Local HK
	HK := Hotkey_IniRead(Name, Section, FilePath), Hotkey_Value(Name, HK)
	Return Hotkey_HKToStr(HK)
}

Hotkey_IniPath(Path = "") {
	Return Path = "" ? Hotkey_Arr("IniPath") : Hotkey_Arr("IniPath", Path)
}

Hotkey_IniSection(Section = "") {
	Return Section = "" ? Hotkey_Arr("IniSection") : Hotkey_Arr("IniSection", Section)
}

Hotkey_IniRead(Name, Section = "", FilePath = "") {
	Local Data
	IniRead, Data, % FilePath = "" ? Hotkey_IniPath() : FilePath, % Section = "" ? Hotkey_IniSection() : Section, % Name, % A_Space
	Return Data
}

Hotkey_IniWrite(ID, Section = "", FilePath = "") {
	Local Key
	Key := (ID + 0 = "") ? ID : Hotkey_ID(ID)
	If (Key != "")
		IniWrite, % Hotkey_Value(ID), % FilePath = "" ? Hotkey_IniPath() : FilePath, % Section = "" ? Hotkey_IniSection() : Section, % Key
}

	; -------------------------------------- Group --------------------------------------

Hotkey_Group(Key = "", p1 = "", p2 = "") {
	Local Name, Value, k, v, n, m
	Static NG := {}, GN := [], Blink := [], SaveCheck := [], i := 0
	If (Key = "") {
		For k, Name in SaveCheck {
			If ((Value := Hotkey_Value(Name)) != "")
				For m, n in GN[NG[Name]] {
					If (n != Name && Hotkey_Equal(Value, Hotkey_Value(n))) {
						Hotkey_Set(Name)
						If !DllCall("IsWindowVisible", "Ptr", Hotkey_ID(n))
							Return
						DllCall("ShowWindowAsync", "Ptr", Hotkey_ID(n), "Int", 0)
						Blink[Hotkey_ID(n)] := 1, i := 5
						SetTimer, Hotkey_BlinkControl, -50
					}
				}
			SaveCheck.Delete(k)
		}
	}
	Else If (Key = "Set")
		NG[p1] := p2, IsObject(GN[p2]) ? GN[p2].Push(p1) : GN[p2] := [p1]
	Else If (Key = "SaveCheck")
		Return 1, SaveCheck[p1] := Hotkey_ID(p1)
	Else If (Key = "Get")
		Return NG[p1] != ""
	Else If (Key = "CheckAll") {
		For k, v in GN
			For k, n in v
				If ((Value := Hotkey_Value(n)) != "")
					For k, m in v
						If (n != m && Hotkey_Equal(Value, Hotkey_Value(m)))
							Hotkey_Set(m)
	}
	Else If (Key = "Delete") {
		For k, v in GN[NG[p1]]
			If (v = p1) {
				GN[NG[p1]].RemoveAt(k)
				Break
			}
		NG.Delete(p1)
	}
	Return

	Hotkey_BlinkControl:
		For k in Blink
			DllCall("ShowWindowAsync", "Ptr", k, "Int", Mod(i, 2) ? 4 : 0)
		If (--i > 0) || !(Blink := [])
			SetTimer, Hotkey_BlinkControl, -50
		Return
}

Hotkey_Equal(HK1, HK2) {
	If (HK2 = "")
		Return 0
	If (HK1 = HK2)
		Return 1
	If !(HK1 ~= "S)[\^\+!#]") || !(HK2 ~= "S)[\^\+!#]")
		Return 0
	If (HK1 ~= "S)[<>]") && (HK2 ~= "S)[<>]")
		Return 0
	Return (Hotkey_ModsSub(HK1) = Hotkey_ModsSub(HK2))
}

Hotkey_ModsSub(Value) {
	If !(Value ~= "[<>]")
		Return Value
	Value := StrReplace(Value, "<")
	Value := StrReplace(Value, ">")
	Value := StrReplace(Value, "^^", "^", , 1)
	Value := StrReplace(Value, "!!", "!", , 1)
	Value := StrReplace(Value, "++", "+", , 1)
	Return StrReplace(Value, "##", "#", , 1)
}

	; -------------------------------------- Format --------------------------------------

	; http://forum.script-coding.com/viewtopic.php?pid=105023#p105023

Hotkey_HKToStr(HK) {
	Static LRPrefix := [["<^","LCtrl"],[">^","RCtrl"],["<!","LAlt"],[">!","RAlt"]
					,["<+","LShift"],[">+","RShift"],["<#","LWin"],[">#","RWin"]]
	, Prefix := [["^","Ctrl"],["!","Alt"],["+","Shift"],["#","Win"]]
	, EngSym := {"sc2":"1","sc3":"2","sc4":"3","sc5":"4","sc6":"5","sc7":"6"
				,"sc8":"7","sc9":"8","scA":"9","scB":"0","scC":"-","scD":"="
				,"sc10":"Q","sc11":"W","sc12":"E","sc13":"R","sc14":"T","sc15":"Y"
				,"sc16":"U","sc17":"I","sc18":"O","sc19":"P","sc1A":"[","sc1B":"]"
				,"sc1E":"A","sc1F":"S","sc20":"D","sc21":"F","sc22":"G","sc23":"H"
				,"sc24":"J","sc25":"K","sc26":"L","sc27":"`;","sc28":"'","sc29":"``"
				,"sc2B":"\","sc2C":"Z","sc2D":"X","sc2E":"C","sc2F":"V","sc30":"B"
				,"sc31":"N","sc32":"M","sc33":",","sc34":".","sc35":"/"

				,"vk31":"1","vk32":"2","vk33":"3","vk34":"4","vk35":"5","vk36":"6"
				,"vk37":"7","vk38":"8","vk39":"9","vk30":"0","vkBD":"-","vkBB":"="
				,"vk51":"Q","vk57":"W","vk45":"E","vk52":"R","vk54":"T","vk59":"Y"
				,"vk55":"U","vk49":"I","vk4F":"O","vk50":"P","vkDB":"[","vkDD":"]"
				,"vk41":"A","vk53":"S","vk44":"D","vk46":"F","vk47":"G","vk48":"H"
				,"vk4A":"J","vk4B":"K","vk4C":"L","vkBA":"`;","vkDE":"'","vkC0":"``"
				,"vkDC":"\","vk5A":"Z","vk58":"X","vk43":"C","vk56":"V","vk42":"B"
				,"vk4E":"N","vk4D":"M","vkBC":",","vkBE":".","vkBF":"/"}

	Local K, K1, K2, I, V, M, R
	RegExMatch(HK, "S)^\s*([~\*\$\^\+!#<>]*)\{?(.*?)}?\s*$", K)
	If (K2 = "")
		Return "" Hotkey_Arr("Empty")
	If (InStr("|" K2, "|sc", 1) || InStr("|" K2, "|vk", 1))
		K2 := Hotkey_Arr("OnlyEngSym") && EngSym.HasKey(K2) ? EngSym[K2] : Format("{:U}", GetKeyName(K2))
	If (K1 != "")
		For I, V in K1 ~= "[<>]" ? LRPrefix : Prefix
			K1 := StrReplace(K1, V[1], "", R), R && (M .= V[2] "+")
	Return M . (StrLen(K2) = 1 ? Format("{:U}", K2) : K2)
}

Hotkey_HKToSend(HK, Section = "", FilePath = "") {
	Static LRPrefix := [["<^","LCtrl"],[">^","RCtrl"],["<!","LAlt"],[">!","RAlt"]
					,["<+","LShift"],[">+","RShift"],["<#","LWin"],[">#","RWin"]]
		, Prefix := [["^","LCtrl"],["!","LAlt"],["+","LShift"],["#","LWin"]]
	Local K, K1, K2, I, V, M1, M2, R
	If (HK = "")
		Return
	If (Section != "")
		IniRead, HK, % FilePath = "" ? Hotkey_IniPath() : FilePath, % Section, % HK, % A_Space
	RegExMatch(HK, "S)^\s*([~\*\$\^\+!#<>]*)\{?(.*?)}?\s*$", K)
	If (K1 != "")
		For I, V in K1 ~= "[<>]" ? LRPrefix : Prefix
			K1 := StrReplace(K1, V[1], "", R)
			, R ? (M1 .= "{" V[2] " Down}", M2 .= "{" V[2] " Up}") : 0
	Return M1 . "{" K2 "}" . M2
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

209

Re: AHK: Замена стандартного элемента управления "Hotkey"

Да, точно, я что-то и не подумал что это код и так очевиден.
У меня тоже всё нормально, спасибо.

210

Re: AHK: Замена стандартного элемента управления "Hotkey"

Сделал основной версию (209 пост) с "хоткеями и группами".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

211 (изменено: serzh82saratov, 2017-01-21 16:58:41)

Re: AHK: Замена стандартного элемента управления "Hotkey"

Добавил возможность вызова своего обработчика повторов в группах. См. пример в конце описания.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

212

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov, а почему клавиши цифровой клавиатуры определяются по названиям? Они ведь зависят от состояния NumLock.

Заметил опечатку:

Hotkey, IF, Hotkey_Hook("L") && GetKeyState("RButton"`, "P")

Лишний знак акцента.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

213

Re: AHK: Замена стандартного элемента управления "Hotkey"

teadrinker пишет:

Лишний знак акцента.

Иначе неправильно, обсуждали год назад - http://forum.script-coding.com/viewtopi … 98#p104598.

teadrinker пишет:

а почему клавиши цифровой клавиатуры определяются по названиям?

Вообще от задачи зависит, можно наверное опционально сделать, но только как? Отображать sc коды вместо имён, как то не комильфо.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

214

Re: AHK: Замена стандартного элемента управления "Hotkey"

Отображать-то можно имена, а сохранять в виде кодов. Сейчас в виде имён сохраняются.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

215

Re: AHK: Замена стандартного элемента управления "Hotkey"

Но сделать это надо опционально?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

216

Re: AHK: Замена стандартного элемента управления "Hotkey"

Можно и опционально. Хотя, трудно представить, что кому-то удобно назначать разные горячие клавиши на цифровой клавиатуре в зависимости от NumLock, по-моему, всё время путать будешь.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

217

Re: AHK: Замена стандартного элемента управления "Hotkey"

Всяко бывает, но как редкий вариант его можно сделать опцией, а по умолчанию сохранять как скан коды. Вообщем подумаю на досуге.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

218

Re: AHK: Замена стандартного элемента управления "Hotkey"

Хотел твою функцию приладить к своему ScreenCatcher'у, собираюсь сделать обновление.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

219

Re: AHK: Замена стандартного элемента управления "Hotkey"

Ок, постараюсь побыстрее, если у тебя всё готово.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

220 (изменено: teadrinker, 2017-06-25 17:03:17)

Re: AHK: Замена стандартного элемента управления "Hotkey"

Ну не то, чтобы прямо всё готово, но осталось это всобачить и описание сочинить.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

221 (изменено: serzh82saratov, 2017-06-27 20:34:10)

Re: AHK: Замена стандартного элемента управления "Hotkey"

N - 11 Numpad клавиш зависящих от состояния Numlock сохраняются по имени, без этой опции как скан код.


Hotkey_Register(Controls*) {
	Static IsStart
	Local k, v, g, g1
	For k, v in Controls
	{
		Hotkey_ID(v[2], v[1]), Hotkey_ID(v[1], v[2])
		Hotkey_Options(v[2], v[3] = "" ? "K" : v[3])
		Hotkey_Value(v[2], Hotkey_Value(v[1]))
		PostMessage, 0x00CF, 1, , , % "ahk_id" v[2]   ;  EM_SETREADONLY
		If RegExMatch(v[3], "i)G(\d+)", g)
			Hotkey_Group("Set", v[1], g1)
	}
	If IsStart
		Return Hotkey_IsRegFocus()
	#HotkeyInterval 0
	Hotkey_SetWinEventHook(0x8005, 0x8005, 0, RegisterCallback("Hotkey_EventFocus", "F"), 0, 0, 0)   ;  EVENT_OBJECT_FOCUS := 0x8005
	Hotkey_InitHotkeys(), Hotkey_IsRegFocus(), IsStart := 1
}

Hotkey_Main(Param1, Param2 = "") {
	Static OnlyMods, ControlHandle, Hotkey, KeyName, K := {}
	, Prefix := {"LAlt":"<!","LCtrl":"<^","LShift":"<+","LWin":"<#"
				,"RAlt":">!","RCtrl":">^","RShift":">+","RWin":">#"
				,"Alt":"!","Ctrl":"^","Shift":"+","Win":"#"}
	, EngSym := {"sc2":"1","sc3":"2","sc4":"3","sc5":"4","sc6":"5","sc7":"6"
				,"sc8":"7","sc9":"8","scA":"9","scB":"0","scC":"-","scD":"="
				,"sc10":"Q","sc11":"W","sc12":"E","sc13":"R","sc14":"T","sc15":"Y"
				,"sc16":"U","sc17":"I","sc18":"O","sc19":"P","sc1A":"[","sc1B":"]"
				,"sc1E":"A","sc1F":"S","sc20":"D","sc21":"F","sc22":"G","sc23":"H"
				,"sc24":"J","sc25":"K","sc26":"L","sc27":"`;","sc28":"'","sc29":"``"
				,"sc2B":"\","sc2C":"Z","sc2D":"X","sc2E":"C","sc2F":"V","sc30":"B"
				,"sc31":"N","sc32":"M","sc33":",","sc34":".","sc35":"/"}
	Local IsMod, Text

	If Param1 = GetMod
		Return K.MLCtrl K.MRCtrl K.MLAlt K.MRAlt K.MLShift K.MRShift K.MLWin K.MRWin K.MCtrl K.MAlt K.MShift K.MWin
	If Param2
	{
		If OnlyMods
		{
			SendMessage, 0xC, 0, "" Hotkey_Arr("Empty"), , ahk_id %ControlHandle%
			OnlyMods := 0, K := {}
		}
		ControlHandle := Param2
		Hotkey_Arr("Hook", Hotkey_Options(ControlHandle))
		PostMessage, 0x00B1, -1, -1, , ahk_id %ControlHandle%   ;  EM_SETSEL
	}
	Else If Hotkey_Arr("Hook")
	{
		Hotkey_Arr("Hook", 0), K := {}
		If OnlyMods
			SendMessage, 0xC, 0, "" Hotkey_Arr("Empty"), , ahk_id %ControlHandle%
		SetTimer, Hotkey_IsRegFocus, -200
	}
	Return

Hotkey_Mods:
	If InStr(Hotkey_Arr("Hook"), "S")
		GoTo Hotkey_View
	IsMod := InStr(Hotkey_Arr("Hook"), "D") ? A_ThisHotkey : SubStr(A_ThisHotkey, 2)
	If (K["M" IsMod] != "")
		Return
	K["M" IsMod] := IsMod "+", K["P" IsMod] := Prefix[IsMod]
	GoTo Hotkey_ViewMod

Hotkey_ModsUp:
	If InStr(Hotkey_Arr("Hook"), "S")
		Return
	IsMod := InStr(Hotkey_Arr("Hook"), "D") ? SubStr(A_ThisHotkey, 1, -3) : SubStr(A_ThisHotkey, 2, -3)
	K["M" IsMod] := "", K["P" IsMod] := ""
	If (Hotkey != "")
		Return

Hotkey_ViewMod:
	Hotkey := "", OnlyMods := 1, Hotkey_Value(Hotkey_ID(ControlHandle), K.Prefix Hotkey), Hotkey_Value(ControlHandle, K.Prefix Hotkey)
	K.Mods := K.MLCtrl K.MRCtrl K.MLAlt K.MRAlt K.MLShift K.MRShift K.MLWin K.MRWin K.MCtrl K.MAlt K.MShift K.MWin
	Text := K.Mods = "" ? Hotkey_Arr("Empty") : K.Mods
	SendMessage, 0xC, 0, &Text, , ahk_id %ControlHandle%
	Return

Hotkey_ViewNum:
	 If InStr(Hotkey_Arr("Hook"), "N")
		KeyName := Hotkey := GetKeyName(A_ThisHotkey)
	Else
		KeyName := GetKeyName(A_ThisHotkey), Hotkey := Format("sc{:x}", GetKeySC(A_ThisHotkey))
	GoTo, Hotkey_Put

Hotkey_ViewSC:
	KeyName := Hotkey_Arr("OnlyEngSym") ? EngSym[A_ThisHotkey] : Format("{:U}", GetKeyName(A_ThisHotkey))
	Hotkey := A_ThisHotkey
	GoTo, Hotkey_Put

Hotkey_View:
	KeyName := Hotkey := A_ThisHotkey

Hotkey_Put:
	OnlyMods := 0
	K.Prefix := K.PLCtrl K.PRCtrl K.PLAlt K.PRAlt K.PLShift K.PRShift K.PLWin K.PRWin K.PCtrl K.PAlt K.PShift K.PWin
	Hotkey_Value(Hotkey_ID(ControlHandle), K.Prefix Hotkey), Hotkey_Value(ControlHandle, K.Prefix Hotkey)
	K.Mods := K.MLCtrl K.MRCtrl K.MLAlt K.MRAlt K.MLShift K.MRShift K.MLWin K.MRWin K.MCtrl K.MAlt K.MShift K.MWin
	Text := K.Mods KeyName = "" ? Hotkey_Arr("Empty") : K.Mods KeyName
	SendMessage, 0xC, 0, &Text, , ahk_id %ControlHandle%
	If Hotkey_Group("Get", Hotkey_ID(ControlHandle)) && Hotkey_Group("SaveCheck", ControlHandle)
		SetTimer, Hotkey_Group, -70
	Return
}

Hotkey_InitHotkeys() {
	Local S_FormatInteger, S_BatchLines
	Static nmMods := "LAlt|RAlt|LCtrl|RCtrl|LShift|RShift|LWin|RWin"
	, nmMouse := "MButton|WheelDown|WheelUp|WheelRight|WheelLeft|XButton1|XButton2"
	, scSymb := "2|3|4|5|6|7|8|9|A|B|C|D|10|11|12|13|14|15|16|17|18|19|1A|1B|"
		. "1E|1F|20|21|22|23|24|25|26|27|28|29|2B|2C|2D|2E|2F|30|31|32|33|34|35"
	; , scNumSymb := "53|52|4F|50|51|4B|4C|4D|47|48|49"
	, scOther := "1|E|F|1C|37|39|3A|3B|3C|3D|3E|3F|40|41|42|43|44|45|46|4A|4E|54|57|58|63|64|65|"
		. "66|67|68|69|6A|6B|6C|6D|6E|76|11C|135|147|148|149|14B|14D|14F|150|151|152|153|15D"
	, vkNum := "2E|6E|60|2D|61|23|62|28|63|22|64|25|65|C|66|27|67|24|68|26|69"
	, vkOther := "3|13|5F|A6|A7|A8|A9|AA|AB|AC|AD|AE|AF|B0|B1|B2|B3|B4|B5|B6|B7"
	S_BatchLines := A_BatchLines
	SetBatchLines, -1
	#IF Hotkey_IsRegControl()
	#IF Hotkey_Hook("K")
	#IF Hotkey_Hook("M")
	#IF Hotkey_Hook("L") && GetKeyState("RButton", "P")
	#IF Hotkey_Hook("R")
	#IF Hotkey_Hook("J") && !Hotkey_Main("GetMod")
	#IF Hotkey_Arr("Hook") && !Hotkey_Hook("K")
	#IF
	Hotkey, IF, Hotkey_Hook("M")
	Loop, Parse, nmMouse, |
		Hotkey, % A_LoopField, Hotkey_View
	Hotkey, IF, Hotkey_Hook("K")
	Loop, Parse, nmMods, |
	{
		Hotkey, % A_LoopField, Hotkey_Mods
		Hotkey, % A_LoopField " Up", Hotkey_ModsUp
	}
	Loop, Parse, scSymb, |
		Hotkey, % "sc" A_LoopField, Hotkey_ViewSC
	Loop, Parse, scOther, |
		Hotkey, % GetKeyName("sc" A_LoopField), Hotkey_View
	Loop, Parse, vkNum, |
		Hotkey, % "vk" A_LoopField, Hotkey_ViewNum
	Loop, Parse, vkOther, |
		Hotkey, % GetKeyName("vk" A_LoopField), Hotkey_View
	Hotkey, IF, Hotkey_Hook("L") && GetKeyState("RButton"`, "P")
	Hotkey, LButton, Hotkey_View
	Hotkey, IF, Hotkey_Hook("R")
	Hotkey, RButton, Hotkey_View
	S_FormatInteger := A_FormatInteger
	SetFormat, IntegerFast, D
	Hotkey, IF, Hotkey_Hook("J") && !Hotkey_Main("GetMod")
	Loop, 128
		Hotkey % Ceil(A_Index / 32) "Joy" Mod(A_Index - 1, 32) + 1, Hotkey_View
	SetFormat, IntegerFast, %S_FormatInteger%
	Hotkey, IF, Hotkey_IsRegControl()
	Hotkey, RButton, Hotkey_RButton
	Hotkey, RButton Up, Hotkey_Return
	Hotkey, IF, Hotkey_Arr("Hook") && !Hotkey_Hook("K")
	Hotkey, AppsKey Up, Hotkey_Return
	Hotkey, +F10, Hotkey_Return
	Hotkey, IF
	SetBatchLines, %S_BatchLines%
	Return

	Hotkey_RButton:
		Click
	Hotkey_Return:
		Return
}

Hotkey_IsRegControl() {
	Local Control
	MouseGetPos,,,, Control, 2
	Return Hotkey_ID(Control) != ""
}

Hotkey_IsRegFocus() {
	Local ControlNN, hFocus
	ControlGetFocus, ControlNN, A
	ControlGet, hFocus, Hwnd, , %ControlNN%, A
	Hotkey_ID(hFocus) != "" ? Hotkey_Main("Control", hFocus) : 0
}

Hotkey_EventFocus(hWinEventHook, event, hwnd) {
	Hotkey_ID(hwnd) != "" ? Hotkey_Main("Control", hwnd) : Hotkey_Main("Control")
}

Hotkey_SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags) {
	Return DllCall("SetWinEventHook" , "UInt", eventMin, "UInt", eventMax, "Ptr", hmodWinEventProc
			, "Ptr", lpfnWinEventProc, "UInt", idProcess, "UInt", idThread, "UInt", dwFlags, "Ptr")
}

	; -------------------------------------- Save and get --------------------------------------

Hotkey_Arr(P*) {
	Static Arr := {"Empty":"Нет"}
	Return P.MaxIndex() = 1 ? Arr[P[1]] : (Arr[P[1]] := P[2])
}

Hotkey_ID(P*) {
	Static Arr := {}
	Return P.MaxIndex() = 1 ? Arr[P[1]] : P.MaxIndex() = 2 ? (Arr[P[1]] := P[2]) : Arr.Delete(P[1])
}

Hotkey_Value(P*) {
	Static Arr := {}
	Return P.MaxIndex() = 1 ? Arr[P[1]] : P.MaxIndex() = 2 ? (Arr[P[1]] := P[2]) : Arr.Delete(P[1])
}

Hotkey_Options(P*) {
	Static Arr := {}
	Return P.MaxIndex() = 1 ? Arr[P[1]] : P.MaxIndex() = 2 ? (Arr[P[1]] := P[2]) : Arr.Delete(P[1])
}

Hotkey_ChangeOption(ID, Option) {
	Local Hwnd, Name, g, g1
	(ID + 0 = "") ? (Hwnd := Hotkey_ID(ID), Name := ID) : (Hwnd := ID, Name := Hotkey_ID(ID))
	If RegExMatch(Hotkey_Options(Hwnd), "i)G(\d+)", g)
		Hotkey_Group("Delete", Name)
	If RegExMatch(Option, "i)G(\d+)", g)
		Hotkey_Group("Set", Name, g1)
	Return Hotkey_Options(Hwnd, Option)
}

Hotkey_Hook(Option) {
	Return Hotkey_Arr("Hook") && !!InStr(Hotkey_Arr("Hook"), Option)
}

Hotkey_Delete(ID, Destroy = 0) {
	Local Hwnd, Name, hFocus, ControlNN
	(ID + 0 = "") ? (Hwnd := Hotkey_ID(ID), Name := ID) : (Hwnd := ID, Name := Hotkey_ID(ID))
	Hotkey_Group("Delete", Name)
	Hotkey_ID(Hwnd, "", 1), Hotkey_ID(Name, "", 1)
	Hotkey_Value(Hwnd, "", 1), Hotkey_Value(Name, "", 1)
	Hotkey_Options(Hwnd, "", 1)
	ControlGetFocus, ControlNN, A
	ControlGet, hFocus, Hwnd, , %ControlNN%, A
	(hFocus = Hwnd ? Hotkey_Main("Control") : 0)
	If Destroy
		DllCall("DestroyWindow", "Ptr", Hwnd)
	Else
		PostMessage, 0x00CF, 0, , , % "ahk_id" Hwnd		;  EM_SETREADONLY
	Return Hwnd
}

Hotkey_Set(Name, Value = "") {
	Local Text
	Text := Hotkey_HKToStr(Value)
	SendMessage, 0xC, 0, &Text, , % "ahk_id" Hotkey_ID(Name)
	Return Text, Hotkey_Value(Name, Value), Hotkey_Value(Hotkey_ID(Name), Value)
}

Hotkey_Read(Name, Section = "", FilePath = "") {
	Local HK
	HK := Hotkey_IniRead(Name, Section, FilePath), Hotkey_Value(Name, HK)
	Return Hotkey_HKToStr(HK)
}

Hotkey_IniPath(Path = "") {
	Return Path = "" ? Hotkey_Arr("IniPath") : Hotkey_Arr("IniPath", Path)
}

Hotkey_IniSection(Section = "") {
	Return Section = "" ? Hotkey_Arr("IniSection") : Hotkey_Arr("IniSection", Section)
}

Hotkey_IniRead(Name, Section = "", FilePath = "") {
	Local Data
	IniRead, Data, % FilePath = "" ? Hotkey_IniPath() : FilePath, % Section = "" ? Hotkey_IniSection() : Section, % Name, % A_Space
	Return Data
}

Hotkey_IniWrite(ID, Section = "", FilePath = "") {
	Local Key
	Key := (ID + 0 = "") ? ID : Hotkey_ID(ID)
	If (Key != "")
		IniWrite, % Hotkey_Value(ID), % FilePath = "" ? Hotkey_IniPath() : FilePath, % Section = "" ? Hotkey_IniSection() : Section, % Key
}

	; -------------------------------------- Group --------------------------------------

Hotkey_Group(Key = "", p1 = "", p2 = "") {
	Local Name, Value, k, v, n, m, f, r
	Static NG := {}, GN := [], Blink := [], SaveCheck := [], i := 0
	If (Key = "") {
		For k, Name in SaveCheck {
			If ((Value := Hotkey_Value(Name)) != "") {
				(f := Hotkey_Arr("GroupEvents")) != "" && (r := {}, r.names := [])
				For m, n in GN[NG[Name]] {
					If (n != Name && Hotkey_Equal(Value, Hotkey_Value(n))) {
						Hotkey_Set(Name)
						(f != "") && (r.names.Push(n), r.this := Name, r.value := Value, r.group := NG[Name])
						If !DllCall("IsWindowVisible", "Ptr", Hotkey_ID(n))
							Continue
						DllCall("ShowWindowAsync", "Ptr", Hotkey_ID(n), "Int", 0)
						Blink[Hotkey_ID(n)] := 1, i := 3
						SetTimer, Hotkey_BlinkControl, -50
					}
				}
			}
			SaveCheck.Delete(k)
		}
		(f != "") && (r.this != "") && %f%(r)
	}
	Else If (Key = "Set")
		NG[p1] := p2, IsObject(GN[p2]) ? GN[p2].Push(p1) : GN[p2] := [p1]
	Else If (Key = "SaveCheck")
		Return 1, SaveCheck[p1] := Hotkey_ID(p1)
	Else If (Key = "Get")
		Return NG[p1] != ""
	Else If (Key = "CheckAll") {
		For k, v in GN
			For k, n in v
				If ((Value := Hotkey_Value(n)) != "")
					For k, m in v
						If (n != m && Hotkey_Equal(Value, Hotkey_Value(m)))
							Hotkey_Set(m)
	}
	Else If (Key = "Delete") {
		For k, v in GN[NG[p1]]
			If (v = p1) {
				GN[NG[p1]].RemoveAt(k)
				Break
			}
		NG.Delete(p1)
	}
	Return

	Hotkey_BlinkControl:
		For k in Blink
			DllCall("ShowWindowAsync", "Ptr", k, "Int", Mod(i, 2) ? 4 : 0)
		If (--i > 0) || !(Blink := [])
			SetTimer, Hotkey_BlinkControl, -50
		Return
}

Hotkey_Equal(HK1, HK2) {
	If (HK2 = "")
		Return 0
	If (HK1 = HK2)
		Return 1
	If !(HK1 ~= "S)[\^\+!#]") || !(HK2 ~= "S)[\^\+!#]")
		Return 0
	If (HK1 ~= "S)[<>]") && (HK2 ~= "S)[<>]")
		Return 0
	Return (Hotkey_ModsSub(HK1) = Hotkey_ModsSub(HK2))
}

Hotkey_ModsSub(Value) {
	If !(Value ~= "[<>]")
		Return Value
	Value := StrReplace(Value, "<")
	Value := StrReplace(Value, ">")
	Value := StrReplace(Value, "^^", "^", , 1)
	Value := StrReplace(Value, "!!", "!", , 1)
	Value := StrReplace(Value, "++", "+", , 1)
	Return StrReplace(Value, "##", "#", , 1)
}

	; -------------------------------------- Format --------------------------------------

	; http://forum.script-coding.com/viewtopic.php?pid=105023#p105023

Hotkey_HKToStr(HK) {
	Static LRPrefix := [["<^","LCtrl"],[">^","RCtrl"],["<!","LAlt"],[">!","RAlt"]
					,["<+","LShift"],[">+","RShift"],["<#","LWin"],[">#","RWin"]]
	, Prefix := [["^","Ctrl"],["!","Alt"],["+","Shift"],["#","Win"]]
	, EngSym := {"sc2":"1","sc3":"2","sc4":"3","sc5":"4","sc6":"5","sc7":"6"
				,"sc8":"7","sc9":"8","scA":"9","scB":"0","scC":"-","scD":"="
				,"sc10":"Q","sc11":"W","sc12":"E","sc13":"R","sc14":"T","sc15":"Y"
				,"sc16":"U","sc17":"I","sc18":"O","sc19":"P","sc1A":"[","sc1B":"]"
				,"sc1E":"A","sc1F":"S","sc20":"D","sc21":"F","sc22":"G","sc23":"H"
				,"sc24":"J","sc25":"K","sc26":"L","sc27":"`;","sc28":"'","sc29":"``"
				,"sc2B":"\","sc2C":"Z","sc2D":"X","sc2E":"C","sc2F":"V","sc30":"B"
				,"sc31":"N","sc32":"M","sc33":",","sc34":".","sc35":"/"

				,"vk31":"1","vk32":"2","vk33":"3","vk34":"4","vk35":"5","vk36":"6"
				,"vk37":"7","vk38":"8","vk39":"9","vk30":"0","vkBD":"-","vkBB":"="
				,"vk51":"Q","vk57":"W","vk45":"E","vk52":"R","vk54":"T","vk59":"Y"
				,"vk55":"U","vk49":"I","vk4F":"O","vk50":"P","vkDB":"[","vkDD":"]"
				,"vk41":"A","vk53":"S","vk44":"D","vk46":"F","vk47":"G","vk48":"H"
				,"vk4A":"J","vk4B":"K","vk4C":"L","vkBA":"`;","vkDE":"'","vkC0":"``"
				,"vkDC":"\","vk5A":"Z","vk58":"X","vk43":"C","vk56":"V","vk42":"B"
				,"vk4E":"N","vk4D":"M","vkBC":",","vkBE":".","vkBF":"/"}

	Local K, K1, K2, I, V, M, R
	RegExMatch(HK, "S)^\s*([~\*\$\^\+!#<>]*)\{?(.*?)}?\s*$", K)
	If (K2 = "")
		Return "" Hotkey_Arr("Empty")
	If (InStr("|" K2, "|sc") || InStr("|" K2, "|vk"))
		K2 := Hotkey_Arr("OnlyEngSym") && EngSym.HasKey(K2) ? EngSym[K2] : GetKeyName(K2)
	If (K1 != "")
		For I, V in K1 ~= "[<>]" ? LRPrefix : Prefix
			K1 := StrReplace(K1, V[1], "", R), R && (M .= V[2] "+")
	Return M . (StrLen(K2) = 1 ? Format("{:U}", K2) : K2)
}

Hotkey_HKToSend(HK, Section = "", FilePath = "") {
	Static LRPrefix := [["<^","LCtrl"],[">^","RCtrl"],["<!","LAlt"],[">!","RAlt"]
					,["<+","LShift"],[">+","RShift"],["<#","LWin"],[">#","RWin"]]
		, Prefix := [["^","LCtrl"],["!","LAlt"],["+","LShift"],["#","LWin"]]
	Local K, K1, K2, I, V, M1, M2, R
	If (HK = "")
		Return
	If (Section != "")
		IniRead, HK, % FilePath = "" ? Hotkey_IniPath() : FilePath, % Section, % HK, % A_Space
	RegExMatch(HK, "S)^\s*([~\*\$\^\+!#<>]*)\{?(.*?)}?\s*$", K)
	If (K1 != "")
		For I, V in K1 ~= "[<>]" ? LRPrefix : Prefix
			K1 := StrReplace(K1, V[1], "", R)
			, R ? (M1 .= "{" V[2] " Down}", M2 .= "{" V[2] " Up}") : 0
	Return M1 . "{" K2 "}" . M2
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

222

Re: AHK: Замена стандартного элемента управления "Hotkey"

У нас тут была баталия по поводу мультимедийных клавиш. А сейчас твой код определяет их коды и названия?
Когда я запускаю первый демонстрационный пример, дописывая туда

Sleep, 3000
SendLevel, 1
SendInput, {VOLUME_UP}

то определяет, как B и sc30.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

223 (изменено: serzh82saratov, 2017-07-04 15:09:50)

Re: AHK: Замена стандартного элемента управления "Hotkey"

Если нажимать клавишу то определяет верно, для данных целей думаю пойдёт.

У меня в коде хоткеи на ММ установлены по именам.
А так вообще не понятно, тут с #If и без по разному идёт вызов.

Sleep, 1000
SendLevel, 1
Send {VOLUME_UP}
Return
#If 1= 1
VOLUME_UP::
sc130::
vkAF::MsgBox % A_ThisHotkey
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

224 (изменено: Malcev, 2017-07-04 15:15:56)

Re: AHK: Замена стандартного элемента управления "Hotkey"

Просто при закомментировании "#If 1= 1" VOLUME_UP устанавливается через reg метод.
А такие хотки не воздействуются Sendlevelом.

Hotkeys using the "reg" method are incapable of distinguishing physical and artificial input, so are not affected by SendLevel. However, hotkeys above level 0 always use the keyboard or mouse hook.

https://autohotkey.com/docs/commands/SendLevel.htm

225

Re: AHK: Замена стандартного элемента управления "Hotkey"

Как понять не воздействуются? Запускается же.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

226

Re: AHK: Замена стандартного элемента управления "Hotkey"

Запускается всегда, так как не видит отличий между физическим нажатием и эмуляцией.
Но SendLevel на это не влияет.

227

Re: AHK: Замена стандартного элемента управления "Hotkey"

Какие тонкие материи.
А что видит отличия между физическим нажатием и эмуляцией?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

228

Re: AHK: Замена стандартного элемента управления "Hotkey"

Хотки, которые установлены через Хук.

229

Re: AHK: Замена стандартного элемента управления "Hotkey"

А как они это рассказывают?

#InstallKeybdHook
VOLUME_UP::MsgBox % физическое : нефизическое
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

230

Re: AHK: Замена стандартного элемента управления "Hotkey"

Хотки через хук:

Sleep, 1000
SendLevel, 0
Send {VOLUME_UP}
Return
#If 1= 1
VOLUME_UP::MsgBox % A_ThisHotkey

Хотки через reg:

Sleep, 1000
SendLevel, 0
Send {VOLUME_UP}
Return
;#If 1= 1
VOLUME_UP::MsgBox % A_ThisHotkey

231

Re: AHK: Замена стандартного элемента управления "Hotkey"

И кстати, у тебя ошибка.
При эмуляции Send {VOLUME_UP} хотки не sc130::, а sc030::.

232 (изменено: serzh82saratov, 2017-07-04 17:49:30)

Re: AHK: Замена стандартного элемента управления "Hotkey"

А у "B" англ. какой скан?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

233

Re: AHK: Замена стандартного элемента управления "Hotkey"

Ну так Lexikos объяснил же в чем причина.
Просто не пользуйся сканкодами и дело с концом.

234

Re: AHK: Замена стандартного элемента управления "Hotkey"

Объяснение причины не является решением. Ты говоришь что ошибка у меня, она в другом, и sc030 там быть не должно.
Не пользоватся для ММ? Я так и делаю, там оно только для наглядности проверки было.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

235

Re: AHK: Замена стандартного элемента управления "Hotkey"

Откуда там взяться наглядности если до sc130:: в твоём примере команда не дойдет.
Со sc030 можно писать костыли:

f1::
key := "sc130"
SendLevel 1
Send {VOLUME_UP}
Return
f2::
key := ""
SendLevel 1
Send b
Return

sc030::
if (key = "")
   msgbox % A_ThisHotKey
else
   msgbox % key
key := ""

236

Re: AHK: Замена стандартного элемента управления "Hotkey"

А зачем такой костыль может пригодится? Можно имя или vk использовать в зависимости от ситуации. А sc130 это скан этой клавиши, что у тебя показывает хук из коллекции, и таблица кодов. Почему код до туда не дойдёт, просто показано что по скан коду эта клавиша не вызывается, по известной теперь причине.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

237 (изменено: Malcev, 2017-07-04 22:29:24)

Re: AHK: Замена стандартного элемента управления "Hotkey"

Ну а как код из твоего примера дойдет?
Он сработает только при физическом нажатии.

Sleep, 1000
SendLevel, 1
Send {VOLUME_UP}
Return
sc130::MsgBox % A_ThisHotkey

238

Re: AHK: Замена стандартного элемента управления "Hotkey"

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

Sleep, 1000
SendLevel, 1
Send {RAlt}
Return
sc138::MsgBox % A_ThisHotkey

Я просто привёл все варианты хоткея.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

239

Re: AHK: Замена стандартного элемента управления "Hotkey"

Ну меня это ввело в заблуждение, так как не мог понять, почему из трех вариантов, вариант со сканкодом не вызывается.
Может Lexikos и поправит это в следующем апдейте.

240

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov пишет:

так как это исключение

Не единственное, это все MM-клавиши, похоже:

SendLevel, 1
Send {Volume_Mute}
Sleep, 1000
Send d
Sleep, 1000
Send {Volume_Down}
Sleep, 1000
Send c
Sleep, 1000
ExitApp

sc20::
sc2E:: MsgBox,,, % A_ThisHotkey, .8
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

241

Re: AHK: Замена стандартного элемента управления "Hotkey"

Я и не говорил про единственное, имел ввиду именно все MM-клавиши.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

242

Re: AHK: Замена стандартного элемента управления "Hotkey"

В моём коде не работает так как установлены хоткеи для символов через скан код. Он запускается первым, если ниже убрать sc30, то будет запускатся по имени (или вирт коду), иначе первый всегда сканкод, а скан код не правильный, так что это ошибка АНК.

Sleep, 1000
SendLevel, 1
Send {VOLUME_UP}
Return
#If 1= 1
sc30::
VOLUME_UP::MsgBox % A_ThisHotkey
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

243

Re: AHK: Замена стандартного элемента управления "Hotkey"

Ладно, главное, чтобы при физических нажатиях всё правильно определялось, и сохранялось, где нужно, по имени.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

244

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov
Спасибо большое за разработку такой крутой библиотеки.
Хотел спросить, как сделать запись в .ini файл в виде VK (virtual key). Вроде прочитал всю тему, но еще больше запутался.
И возможно ли поменять код чтобы вести запись в .ini файл в таком виде?
MyHotkey1:="<^VK4D"
а для пустых полей
MyHotkey2:=""
Т.е. чтобы вместо = было именно := а сам код был заключен в ""

245

Re: AHK: Замена стандартного элемента управления "Hotkey"

Так делайте это в функции, в которой происходит сохранение.
Но скорее всего, то что вам нужно, на самом деле ненужно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

246

Re: AHK: Замена стандартного элемента управления "Hotkey"

Спасибо за абсолютно бесполезный ответ. С таким же успехом могли бы просто не отвечать.

247

Re: AHK: Замена стандартного элемента управления "Hotkey"

Добавил в библиотеку возможность задавать двойной хоткей вида "RControl & RShift", опция "W".
Изменился алгоритм определения левой кнопки, описание в комментариях примера.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

248

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov, как бы я не вставлял

Hotkey_Arr("KillFocus", true)

перед созданием контроллов, у меня это не работает. Или я что-то не так делаю?
Беру пример из поста, после первого return вставляю библиотеку и перед созданием edit'ов вставляю эту строку

Hotkey_Arr("KillFocus", true)
Gui, Add, Edit, Center w300 r1 hwndhMyHotkey1 gWriteIni, % Hotkey_Read("MyHotkey1", "Section", PathIni)
Gui, Add, Edit, Center wp y+10 r1 hwndhMyHotkey2 gWriteIni, % Hotkey_Read("MyHotkey2", "Section", PathIni)
AutoHotkey - 1.1.30.01

249

Re: AHK: Замена стандартного элемента управления "Hotkey"

Вы используете старую версию из второго поста?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

250 (изменено: Gutalin, 2018-08-11 19:25:05)

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov, А это старая? Ну да из 2 поста

AutoHotkey - 1.1.30.01

251

Re: AHK: Замена стандартного элемента управления "Hotkey"

Да, новая в первом посте, описание и примеры соответсвенно тоже.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

252 (изменено: serzh82saratov, 2018-08-11 19:25:18)

Re: AHK: Замена стандартного элемента управления "Hotkey"

Вообщем я всех запутал, новая теперь во втором посте как и положено.
http://forum.script-coding.com/viewtopi … 50#p127550

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

253

Re: AHK: Замена стандартного элемента управления "Hotkey"

Вопрос решён, но можно ли сделать, чтобы сразу при запуске строка была неактивна?

AutoHotkey - 1.1.30.01

254 (изменено: serzh82saratov, 2018-08-11 19:32:04)

Re: AHK: Замена стандартного элемента управления "Hotkey"

Можете перед показом окна вызвать:

ControlFocus, , % "ahk_id" Hotkey_Arr("Focus")[hwnd] 

hwnd - это хэндл окна.

#NoEnv
#SingleInstance Force
Gui, +AlwaysOnTop +HWNDhGui
Hotkey_Arr("KillFocus", true)
Hotkey_IniPath(A_ScriptDir "\Hotkey.ini"), Hotkey_IniSection("Hotkeys")
Hotkey_Add("w300", "MyHotkey1", "G1KD", "*", "Save")
Hotkey_Add("wp y+10", "MyHotkey2", "G1KMLRJ", "*", "Save")
Gui, Add, Edit, Center vText wp
ControlFocus, , % "ahk_id" Hotkey_Arr("Focus")[hGui] 
Gui, Show
Return

Save(Name) { 
    GuiControl, , Text, % Name " = " Hotkey_Write(Name)
}

GuiClose() {
    ExitApp
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

255

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov, Да, всё работает, спасибо!

AutoHotkey - 1.1.30.01

256 (изменено: serzh82saratov, 2018-08-11 20:43:33)

Re: AHK: Замена стандартного элемента управления "Hotkey"

Хотя управление фокусом давно надо было добавить, и вне зависимости от опции KillFocus, в новую версию добавил Hotkey_KillFocus(Name).
То есть перед Gui Show можно вызвать Hotkey_KillFocus с именем любого контрола в нужном окне.

#NoEnv
#SingleInstance Force
Gui, +AlwaysOnTop 
Hotkey_Arr("KillFocus", true)
Hotkey_IniPath(A_ScriptDir "\Hotkey.ini"), Hotkey_IniSection("Hotkeys")
Hotkey_Add("w300", "MyHotkey1", "G1KD", "*", "Save")
Hotkey_Add("wp y+10", "MyHotkey2", "G1KMLRJ", "*", "Save")
Gui, Add, Edit, Center vText wp y+50
Hotkey_KillFocus("MyHotkey2")
Gui, Show
Return

Save(Name) { 
    GuiControl, , Text, % Name " = " Hotkey_Write(Name)
}

GuiClose() {
    ExitApp
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

257 (изменено: Vitalkerrain, 2018-08-12 14:08:54)

Re: AHK: Замена стандартного элемента управления "Hotkey"

Привет. Вот тыкните меня носом, никак не пойму, как сделать из

Gui, Add, Hotkey, x202 y300 w70 h20 vCombo, %Combo%

вариант из темы

Hotkey_Add("wp y+10", "MyHotkey2", "G1KMLRJ", Hotkey_Read("MyHotkey2"), "Save")

Мой вариант

Hotkey_Add("x202 y300 w70 h20", "Combo", "G1KMLRJ", Hotkey_Read("Combo"), "Save")

Не работает. Я не могу понять как пришить %Combo%. Контрол создал, кнопки ставятся, но не работает мой вариант по нажатию Кнопки комбо.

258 (изменено: serzh82saratov, 2018-08-12 14:18:03)

Re: AHK: Замена стандартного элемента управления "Hotkey"

Вы весь код приведите.
Не понятно что значит:

Vitalkerrain пишет:

не работает мой вариант по нажатию Кнопки комбо.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

259 (изменено: Vitalkerrain, 2018-08-12 14:26:16)

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov Вот есть простой макрос - я опустил лишнее


IniRead, Armlet , Armlet of Mordiggian.ini, Items , Armlet
IniRead, Combo , Armlet of Mordiggian.ini, Combo , Combo
Gui, Add, Picture, x202 y162 w70 h50 , %A_Temp%/Armlet.png
Gui, Add, Hotkey, x202 y209 w70 h20 vArmlet, %Armlet%
Gui, Add, Hotkey, x202 y300 w70 h20 vCombo, %Combo%
Gui, Add, Picture, x399 y349 w80 h30 vmOFF, %a_temp%/mOFF.png
Gui, Add, Picture, x399 y349 w80 h30 vmON, %A_Temp%/mON.png
Gui, Font, S10 CDefault Bold, Verdana
Gui, Add, Text, x202 y280 w70 h20 +Center, КОМБО
Gui, Add, Picture, x0 y329 w60 h50 gOk, %A_Temp%/Save.png
Gui, Show, w479 h379, Armlet of Mordiggian v1.0
Gosub, Ok
return


Ok:
Hotkey, %Armlet% , off , UseErrorLevel
Hotkey, %Combo% , off , UseErrorLevel
Gui, Submit, NoHide
b := [Armlet, Combo]
Loop % b.MaxIndex()
{
t := A_Index
a := ""
modi := ""
a := % b[t]
Loop
{
first := ""
StringLeft first, a, 1
if (first = "+" or first ="^" or first ="!")
{
modi := modi . first
StringTrimLeft a, a, 1
}
else
break
}
a := Format("sc{:x}", GetKeySC(a))
b[t] := modi . a
}
Armlet := b[1]
Combo := b[2]
IniWrite, %Armlet%, Armlet of Mordiggian.ini, Items, Armlet
IniWrite, %Combo%, Armlet of Mordiggian.ini, Combo, Combo
Hotkey, %Combo% , Combo, On , UseErrorLevel
Hotkey, %Armlet% , Armlet, On , UseErrorLevel
return

Combo:
sendinput {%Armlet% 2}
return

Видно, что При нажатии контрола "Combo" выполняется нажатие контрола "Armlet" - 2 раза.
Я строку с добавлением комбо меняю на

Hotkey_Add("x202 y300 w70 h20", "Combo", "G1KMLRJ", Hotkey_Read("Combo"), "Save")

Всё работает понимает кнопки мыши, сохраняется и т.д Но больше не выполняет то, что задано в

Combo:
sendinput {%Armlet% 2}
return

260

Re: AHK: Замена стандартного элемента управления "Hotkey"

Посмотрите пример  "Назначение хоткеев из назначенных клавиш".
В переменной Combo ничего нет, тут вообще нет никаких переменных, есть просто имена.

Hotkey, % Hotkey_Value("Combo"), Combo, On , UseErrorLevel
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

261

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov Замечательно теперь работает! Спасибо)

262

Re: AHK: Замена стандартного элемента управления "Hotkey"

Я так понял вы нажатием из Combo посылаете Armlet? Тогда зачем

Hotkey, %Armlet% , off , UseErrorLevel
Hotkey, %Armlet% , Armlet, On , UseErrorLevel

И G1 из опций можно убрать, они же могут повторятся.
И для удобства проще писать в одну секцию ини файла.
И есть функция Hotkey_HKToSend, так что можно немного сократить код.


#SingleInstance Force
#NoEnv
#UseHook

Hotkey_IniPath(A_ScriptDir "\Armlet of Mordiggian.ini")
Hotkey_IniSection("Hotkeys")

Gui, Add, Picture, x202 y162 w70 h50 , %A_Temp%/Armlet.png 
Hotkey_Add("x80 y209 w300 h20", "Armlet", "G1KMLRJ", "*")
Hotkey_Add("x80 y300 w300 h20", "Combo", "G1KMLRJ", "*") 
Gui, Add, Picture, x399 y349 w80 h30 vmOFF, %a_temp%/mOFF.png
Gui, Add, Picture, x399 y349 w80 h30 vmON, %A_Temp%/mON.png
Gui, Font, S10 CDefault Bold, Verdana
Gui, Add, Text, x202 y280 w70 h20 +Center, КОМБО
Gui, Add, Picture, x0 y329 w60 h50 gOk, %A_Temp%/Save.png
Gui, Show, w479 h379, Armlet of Mordiggian v1.0 

Ok: 
	Hotkey, % PrKey_Combo, Off, UseErrorLevel
	PrKey_Combo := Hotkey_Write("Combo")
	Hotkey, % PrKey_Combo, Combo, On, UseErrorLevel 
	Send_Armlet := Hotkey_HKToSend(Hotkey_Write("Armlet"))
	return

Combo:
	Loop 2
		sendinput % Send_Armlet
	return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

263

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov Так еще прекрасней работает. И можно ли использовать сохранение в конструкции, если да то как?

Save(Name) {

Не ругайте, за то что юзаю всё в одном файле, мне так удобнее. Таким образом код должен выглядеть так или можно ещё сократить?

#SingleInstance Force
#NoEnv
#UseHook
Hotkey_IniPath(A_ScriptDir "\Armlet of Mordiggian.ini")
Hotkey_IniSection("Hotkeys")
FileInstall, dota.png , %A_Temp%/dota.png , 1
FileInstall, Armlet.png , %A_Temp%/Armlet.png , 1
FileInstall, vk.png , %A_Temp%/vk.png , 1
FileInstall, YouTube.png , %A_Temp%/YouTube.png , 1
FileInstall, Save.png , %A_Temp%/Save.png , 1
FileInstall, button_nazhimaem-na-kartinki.png , %A_Temp%/button_nazhimaem-na-kartinki.png , 1
FileInstall, button_podpisyvajtes-na-menya.png , %A_Temp%/button_podpisyvajtes-na-menya.png , 1
FileInstall, information.png , %A_Temp%/information.png , 1
FileInstall, Settings.png , %A_Temp%/Settings.png , 1
FileInstall, Fon_1.png , %A_Temp%/Fon_1.png , 1
FileInstall, mOFF.png , %A_Temp%/mOFF.png , 1
FileInstall, mON.png , %A_Temp%/mON.png , 1
Gui, Add, Picture, x-248 y-41 w970 h470 , %A_Temp%/dota.png
Gui, Add, Picture, x202 y162 w70 h50 , %A_Temp%/Armlet.png 
Hotkey_Add("x80 y209 w300 h20", "Armlet", "G1KMLRJ", "*")
Hotkey_Add("x80 y300 w300 h20", "Combo", "G1KMLRJ", "*") 
Gui, Add, Picture, x399 y349 w80 h30 vmOFF, %a_temp%/mOFF.png
Gui, Add, Picture, x399 y349 w80 h30 vmON, %A_Temp%/mON.png
Gui, Font, S10 CDefault Bold, Verdana
Gui, Add, Text, x202 y280 w70 h20 +Center, КОМБО
Gui, Add, Picture, x0 y329 w60 h50 gOk, %A_Temp%/Save.png
Gui, Show, w479 h379, Armlet of Mordiggian v1.0
return

Ok: 
	Hotkey, % PrKey_Combo, Off, UseErrorLevel
	PrKey_Combo := Hotkey_Write("Combo")
	Hotkey, % PrKey_Combo, Combo, On, UseErrorLevel 
	Send_Armlet := Hotkey_HKToSend(Hotkey_Write("Armlet"))
	return		

Combo:
	Loop 2
		sendinput % Send_Armlet
	return
	
F8:: ; Приостановка по F8.
 Suspend Toggle
 if (!A_IsSuspended)
 {
guicontrol hide, mOFF
guicontrol show, mON
 }
 Else
 {
guicontrol show, mOFF
guicontrol hide, mON
 }
 return

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

GuiClose() {
    ExitApp
}

Hotkey_Add(ControlOption, Name, Option = "", Hotkey = "", Func = "", BindString = "", ByRef hEdit = "") {
	Local M, M1, M2, FuncObj, GuiName, Write, hGui, hDummy
	If (Name + 0 != "") {
		MsgBox, 4112, Hotkey add error, % "Name '" Name "' can not be a number, exit app."
		ExitApp
	}
	If Hotkey = *
		Hotkey := Hotkey_Read(Name)
	Else If Hotkey ~= "^:"
		Hotkey := SubStr(Hotkey, 2), Write := 1
	RegExMatch(ControlOption, "S)^\s*(\S+:)*(.*)$", M), GuiName := M1, ControlOption := M2
	ControlOption := "r1 +ReadOnly +Center " Hotkey_Arr("ControlOption") " " ControlOption
	Gui, %GuiName%Add, Edit, %ControlOption% hwndhEdit, % Hotkey_HKToStr(Hotkey)
	Hotkey_ID(hEdit, Name), Hotkey_ID(Name, hEdit), Hotkey_Value(Name, Hotkey)
	If !Hotkey_Arr("Focus")[hGui := DllCall("GetParent", Ptr, hEdit)] {
		Gui, %GuiName%Add, Text, xp yp wp hp Hidden hwndhDummy
		Hotkey_Arr("Focus")[hGui] := hDummy
	}
	If Write
		Hotkey_Write(Name)
	RegExMatch(Option, "Si)G(\d+)", M) && Hotkey_Group("Set", Name, M1)
	Hotkey_Options(hEdit, Option = "" ? "K" : Option)
	Hotkey_Arr("BindString")[Name] := BindString
	Hotkey_Arr("AllHotkeys")[Name] := hEdit
	FuncObj := Func(Func).Bind(Name)
	GuiControl, +g, % hEdit, % FuncObj
	Hotkey_Start()
}

Hotkey_Start() {
	Static IsStart
	Local fn, k, v
	If IsStart
		Return Hotkey_IsRegFocus()
	#HotkeyInterval 0
	fn := Func("Hotkey_WM_LBUTTONDBLCLK"), OnMessage(0x203, fn)  ;	WM_LBUTTONDBLCLK
	If Hotkey_Arr("KillFocus")
		for, k, v in {WM_LBUTTONDOWN:0x201,WM_LBUTTONUP:0x202,WM_NCLBUTTONDOWN:0xA1}
			fn := Func("Hotkey_FocusClick"), OnMessage(v, fn)
	Hotkey_SetWinEventHook(0x8005, 0x8005, 0, RegisterCallback("Hotkey_EventFocus", "F"), 0, 0, 0)   ;  EVENT_OBJECT_FOCUS := 0x8005
	If !Hotkey_Arr("ResetAllways")
		Hotkey_InitHotkeys()
	Hotkey_IsRegFocus(), IsStart := 1
}

Hotkey_Main(Param1, Param2 = "") {
	Static OnlyMods, ControlHandle, Hotkey, KeyName, K := {}
	, Prefix := {"LCtrl":"<^","RCtrl":">^","LShift":"<+","RShift":">+"
				,"LAlt":"<!","RAlt":">!","LWin":"<#","RWin":">#"
				,"Ctrl":"^","Shift":"+","Alt":"!","Win":"#"}
	, EngSym := {"sc2":"1","sc3":"2","sc4":"3","sc5":"4","sc6":"5","sc7":"6"
				,"sc8":"7","sc9":"8","scA":"9","scB":"0","scC":"-","scD":"="
				,"sc10":"Q","sc11":"W","sc12":"E","sc13":"R","sc14":"T","sc15":"Y"
				,"sc16":"U","sc17":"I","sc18":"O","sc19":"P","sc1A":"[","sc1B":"]"
				,"sc1E":"A","sc1F":"S","sc20":"D","sc21":"F","sc22":"G","sc23":"H"
				,"sc24":"J","sc25":"K","sc26":"L","sc27":"`;","sc28":"'","sc29":"``"
				,"sc2B":"\","sc2C":"Z","sc2D":"X","sc2E":"C","sc2F":"V","sc30":"B"
				,"sc31":"N","sc32":"M","sc33":",","sc34":".","sc35":"/","sc56":"\"}
	Local IsMod, ThisHotkey, Text
	If Param1 = GetMod
		Return !!(K.MLCtrl K.MRCtrl K.MLShift K.MRShift K.MLAlt K.MRAlt K.MLWin K.MRWin K.MCtrl K.MShift K.MAlt K.MWin)
	If Param1 = Clean
	{
		ControlHandle := !Param2 ? ControlHandle : Param2
		Hotkey_SetText(ControlHandle, Hotkey_Arr("Empty"), "")
		Return K := {}, OnlyMods := 0, Hotkey := KeyName := ""
	}
	If Param2
	{
		K := {}
		If OnlyMods && !(OnlyMods := 0)
			Hotkey_SetText(ControlHandle, Hotkey_Arr("Empty"), "")
		ControlHandle := Param2
		Hotkey_Arr("Hook", Hotkey_Options(ControlHandle))
		PostMessage, 0x00B1, -2, -2, , ahk_id %ControlHandle%   ;	EM_SETSEL
	}
	Else If Hotkey_Arr("Hook")
	{
		Hotkey_Arr("Hook", "")
		If OnlyMods && !(OnlyMods := 0)
			Hotkey_SetText(ControlHandle, Hotkey_Arr("Empty"), "")
		SetTimer, Hotkey_IsRegFocus, -200
	}
	Return

	Hotkey_Mods:
		ThisHotkey := Hotkey_GetName(A_ThisHotkey, "M")
		If Hotkey_IsBan(ThisHotkey, ControlHandle)
			Return Hotkey_Main("Clean")
		If Hotkey_InHook("S") || Hotkey_InHook("W")
		{
			KeyName := Hotkey := ThisHotkey
			GoTo, Hotkey_Put
		}
		IsMod := Hotkey_InHook("D") ? ThisHotkey : SubStr(ThisHotkey, 2)
		If (K["M" IsMod] != "")
			Return
		K["M" IsMod] := IsMod " + ", K["P" IsMod] := Prefix[IsMod]
		GoTo, Hotkey_ViewMod

	Hotkey_ModsUp:
		If Hotkey_InHook("S") || Hotkey_InHook("W")
			Return
		ThisHotkey := Hotkey_GetName(SubStr(A_ThisHotkey, 1, -3), "M")
		If Hotkey_InHook("Z") && Hotkey = ""
		{
			If Hotkey_IsBan(ThisHotkey, ControlHandle)
				Return Hotkey_Main("Clean")
			K := {}, KeyName := Hotkey := ThisHotkey
			GoTo, Hotkey_Put
		}
		IsMod := Hotkey_InHook("D") ? ThisHotkey : SubStr(ThisHotkey, 2)
		If K["M" IsMod] = ""  ;	Check LCtrl Up, for activate window AltGr layout language
			Return
		If Hotkey_IsBan(ThisHotkey, ControlHandle)
			Return Hotkey_Main("Clean")
		K["M" IsMod] := "", K["P" IsMod] := ""
		If (Hotkey != "")
			Return

	Hotkey_ViewMod:
		Hotkey := "", OnlyMods := 1
		K.Mods := K.MLCtrl K.MRCtrl K.MLShift K.MRShift K.MLAlt K.MRAlt K.MLWin K.MRWin K.MCtrl K.MShift K.MAlt K.MWin
		Text := K.Mods = "" ? Hotkey_Arr("Empty") : K.Mods
		Hotkey_SetText(ControlHandle, Text, "")
		Return

	Hotkey_ViewNum:  ;	code
		ThisHotkey := Hotkey_GetName(A_ThisHotkey, "C")
		If Hotkey_IsBan(ThisHotkey, ControlHandle)
			Return Hotkey_Main("Clean")
		 If Hotkey_InHook("N")
			KeyName := GetKeyName(ThisHotkey), Hotkey := ThisHotkey
		Else
			Hotkey := Format("sc{:x}", GetKeySC(ThisHotkey)), KeyName := GetKeyName(Hotkey)
		GoTo, Hotkey_Put

	Hotkey_ViewNumExcept:  ;	code
		ThisHotkey := Hotkey_GetName(A_ThisHotkey, "C")
		If Hotkey_IsBan(ThisHotkey, ControlHandle)
			Return Hotkey_Main("Clean")
		If Hotkey_InHook("N")
			GetKeyState("NumLock", "T") ? (KeyName := "Numpad5", Hotkey := "vk65") : (KeyName := "NumpadClear", Hotkey := "vkC")
		Else
			KeyName := "NumpadClear", Hotkey := ThisHotkey
		GoTo, Hotkey_Put

	Hotkey_ViewSC:  ;	code
		ThisHotkey := Hotkey_GetName(A_ThisHotkey, "C")
		If Hotkey_IsBan(ThisHotkey, ControlHandle)
			Return Hotkey_Main("Clean")
		KeyName := Hotkey_Arr("OnlyEngSym") ? EngSym[ThisHotkey] : Format("{:U}", GetKeyName(ThisHotkey))
		Hotkey := ThisHotkey
		GoTo, Hotkey_Put

	Hotkey_ViewJoy:
		If Hotkey_Main("GetMod") || Hotkey_InHook("W")
			Return
		ThisHotkey := Hotkey_GetName(A_ThisHotkey, "J")
		If Hotkey_IsBan(ThisHotkey, ControlHandle)
			Return Hotkey_Main("Clean")
		KeyName := Hotkey := ThisHotkey
		GoTo, Hotkey_Put

	Hotkey_View:
		ThisHotkey := Hotkey_GetName(A_ThisHotkey, "N")
		If Hotkey_IsBan(ThisHotkey, ControlHandle)
			Return Hotkey_Main("Clean")
		KeyName := Hotkey := ThisHotkey

	Hotkey_Put:
		If Hotkey_InHook("W")
			GoTo, Hotkey_Double
		OnlyMods := 0
		K.Prefix := K.PLCtrl K.PRCtrl K.PLShift K.PRShift K.PLAlt K.PRAlt K.PLWin K.PRWin K.PCtrl K.PShift K.PAlt K.PWin
		K.Mods := K.MLCtrl K.MRCtrl K.MLShift K.MRShift K.MLAlt K.MRAlt K.MLWin K.MRWin K.MCtrl K.MShift K.MAlt K.MWin
		Text := K.Mods KeyName = "" ? Hotkey_Arr("Empty") : K.Mods KeyName
		Hotkey_SetText(ControlHandle, Text, K.Prefix Hotkey)

	Hotkey_GroupCheck:
		If Hotkey_Group("Get", Hotkey_ID(ControlHandle)) && Hotkey_Group("SaveCheck", ControlHandle)
			SetTimer, Hotkey_Group, -70
		Return

	Hotkey_Double:
		If !K.Double
		{
			K.DHotkey := Hotkey, K.DName := KeyName, K.Double := 1, OnlyMods := 1
			Hotkey_SetText(ControlHandle, KeyName " & ", "")
			Return
		}
		If (K.DHotkey = Hotkey)
			Return
		Text := K.DName " & " KeyName, K.Double := 0, OnlyMods := 0
		Hotkey_SetText(ControlHandle, Text, K.DHotkey " & " Hotkey)
		GoTo, Hotkey_GroupCheck

	Hotkey_RButton:
		If Hotkey_InHook("L") && GetKeyState("LButton"`, "P")
			KeyName := Hotkey := "LButton"
		Else If Hotkey_InHook("R")
			KeyName := Hotkey := "RButton"
		Else
			Return
		If Hotkey_IsBan(Hotkey, ControlHandle)
			Return Hotkey_Main("Clean")
		GoTo, Hotkey_Put
}

Hotkey_GetName(HK, Type) {
	Static ModsNames := {"LCtrl":"LCtrl","RCtrl":"RCtrl","LShift":"LShift"
	,"RShift":"RShift","LAlt":"LAlt","RAlt":"RAlt","LWin":"LWin","RWin":"RWin"}
	HK := RegExReplace(HK, "S)[~\*\$]")
	If Type = N
		Return GetKeyName(HK)
	If Type = M
		Return ModsNames[HK]
	If Type = C
		Return RegExReplace(HK, "Si)(vk|sc)(.*)", "$L1$U2")
	If Type = J
		Return RegExReplace(HK, "Si)(Joy)", "Joy", , 1)
}

Hotkey_InitHotkeys(Option = 1) {
	Local S_FormatInteger, S_BatchLines
	Static nmMods := "LCtrl|RCtrl|LShift|RShift|LAlt|RAlt|LWin|RWin"
	, nmMouse := "MButton|WheelDown|WheelUp|WheelRight|WheelLeft|XButton1|XButton2"
	, scSymb := "2|3|4|5|6|7|8|9|A|B|C|D|10|11|12|13|14|15|16|17|18|19|1A|1B|"
		. "1E|1F|20|21|22|23|24|25|26|27|28|29|2B|2C|2D|2E|2F|30|31|32|33|34|35|56"
	, scOther := "1|E|F|1C|37|39|3A|3B|3C|3D|3E|3F|40|41|42|43|44|46|4A|4E|54|57|58|63|64|65|"
		. "66|67|68|69|6A|6B|6C|6D|6E|76|7C|11C|135|145|147|148|149|14B|14D|14F|150|151|152|153|15D"
	, vkNum := "21|22|23|24|25|26|27|28|2D|2E|60|61|62|63|64|66|67|68|69|6E|C|65"	; , scNum := "53|52|4F|50|51|4B|4D|47|48|49|4C|59"
	, vkOther := "3|13|5F|A6|A7|A8|A9|AA|AB|AC|AD|AE|AF|B0|B1|B2|B3|B4|B5|B6|B7"

	S_BatchLines := A_BatchLines
	SetBatchLines, -1
	Option := Option ? "On" : "Off"
	#IF Hotkey_IsRegControl()
	#IF Hotkey_Hook("K")
	#IF Hotkey_Hook("M")
	#IF Hotkey_Hook("L") && GetKeyState("RButton", "P")
	#IF Hotkey_Hook("R") || Hotkey_InHook("L")
	#IF Hotkey_Hook("J")
	#IF Hotkey_Arr("Hook") && !Hotkey_InHook("K")
	#IF
	Hotkey, IF, Hotkey_Hook("M")
	Loop, Parse, nmMouse, |
		Hotkey, % A_LoopField, Hotkey_View, % Option
	Hotkey, IF, Hotkey_Hook("K")
	Loop, Parse, nmMods, |
	{
		Hotkey, % A_LoopField, Hotkey_Mods, % Option
		Hotkey, % A_LoopField " Up", Hotkey_ModsUp, % Option
	}
	Loop, Parse, scSymb, |
		Hotkey, % "sc" A_LoopField, Hotkey_ViewSC, % Option
	Loop, Parse, scOther, |
		Hotkey, % GetKeyName("sc" A_LoopField), Hotkey_View, % Option
	Loop, Parse, vkNum, |
		Hotkey, % "vk" A_LoopField, Hotkey_ViewNum, % Option
	Hotkey, sc59, Hotkey_ViewNumExcept, % Option  ;	NumpadClear
	Loop, Parse, vkOther, |
		Hotkey, % GetKeyName("vk" A_LoopField), Hotkey_View, % Option
	Hotkey, IF, Hotkey_Hook("L") && GetKeyState("RButton"`, "P")
	Hotkey, LButton, Hotkey_Return, % Option
	Hotkey, IF, Hotkey_Hook("R") || Hotkey_InHook("L")
	Hotkey, RButton, Hotkey_Return, % Option
	Hotkey, RButton Up, Hotkey_RButton, % Option
	S_FormatInteger := A_FormatInteger
	SetFormat, IntegerFast, D
	Hotkey, IF, Hotkey_Hook("J")
	Loop, 128
		Hotkey % Ceil(A_Index / 32) "Joy" Mod(A_Index - 1, 32) + 1, Hotkey_ViewJoy, % Option
	SetFormat, IntegerFast, %S_FormatInteger%
	Hotkey, IF, Hotkey_IsRegControl()
	Hotkey, RButton, Hotkey_Return, % Option
	Hotkey, RButton Up, Hotkey_Return, % Option
	Hotkey, IF, Hotkey_Arr("Hook") && !Hotkey_InHook("K")
	Hotkey, AppsKey Up, Hotkey_Return, % Option
	Hotkey, +F10, Hotkey_Return, % Option
	Hotkey, IF
	SetBatchLines, %S_BatchLines%
	Return

	Hotkey_Return:
		Return
}

Hotkey_IsRegControl() {
	Local Control
	MouseGetPos,,,, Control, 2
	Return Hotkey_ID(Control) != ""
}

Hotkey_IsRegFocus() {
	Local ControlNN, hFocus
	ControlGetFocus, ControlNN, A
	ControlGet, hFocus, Hwnd, , %ControlNN%, A
	Hotkey_ID(hFocus) != "" ? Hotkey_Main("Control", hFocus) : 0
}

Hotkey_WM_LBUTTONDBLCLK(wp, lp, msg, hwnd) {
	If (Hotkey_ID(hwnd) = "")
		Return
	Hotkey_Main("Clean", hwnd)
	Sleep 50
	PostMessage, 0x00B1, -2, -2, , ahk_id %hwnd%   ;	EM_SETSEL
}

Hotkey_EventFocus(hWinEventHook, event, hwnd) {
	Hotkey_ID(hwnd) != "" ? Hotkey_Main("Control", hwnd) : Hotkey_Main("Control")
}

Hotkey_SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags) {
	Return DllCall("SetWinEventHook" , "UInt", eventMin, "UInt", eventMax, "Ptr", hmodWinEventProc
			, "Ptr", lpfnWinEventProc, "UInt", idProcess, "UInt", idThread, "UInt", dwFlags, "Ptr")
}

	; -------------------------------------- Get and set --------------------------------------

Hotkey_Arr(P*) {
	Static Arr := {Empty:"Нет", AllHotkeys:{}, BindString:{}, Focus:{}, User:{}}
	Return P.MaxIndex() = 1 ? Arr[P[1]] : P.MaxIndex() = 2 ? (Arr[P[1]] := P[2]) : !P.MaxIndex() ? Arr : Arr.Delete(P[1])
}

Hotkey_ID(P*) {
	Static Arr := {}
	Return P.MaxIndex() = 1 ? Arr[P[1]] : P.MaxIndex() = 2 ? (Arr[P[1]] := P[2]) : !P.MaxIndex() ? Arr : Arr.Delete(P[1])
}

Hotkey_Value(P*) {
	Static Arr := {}
	Return P.MaxIndex() = 2 ? (Arr[P[1]] := P[2], Arr[Hotkey_ID(P[1])] := P[2]) : P.MaxIndex() = 1 ? Arr[P[1]] : !P.MaxIndex() ? Arr : (Arr.Delete(P[1]), Arr.Delete(Hotkey_ID(P[1])))
}

Hotkey_Options(P*) {
	Static Arr := {}
	Return P.MaxIndex() = 1 ? Arr[P[1]] : P.MaxIndex() = 2 ? (Arr[P[1]] := P[2]) : !P.MaxIndex() ? Arr : Arr.Delete(P[1])
}

Hotkey_BanKey(Keys, Name = 0) {
	Hotkey_BanArr()[Name] := {}
	Loop, Parse, Keys, |
		Hotkey_BanArr()[Name][A_LoopField] := 1
}

Hotkey_BanArr(P*) {
	Static Arr := {}
	Return Arr
}

Hotkey_IsBan(HK, hwnd) {
	If Hotkey_BanArr().0.HasKey(HK)  ;	Global ban
		Return 1
	If Hotkey_BanArr()[Hotkey_ID(hwnd)].HasKey(HK)
		Return 1
	Return 0
}

Hotkey_IniPath(Path = "") {
	Return Path = "" ? Hotkey_Arr("IniPath") : Hotkey_Arr("IniPath", Path)
}

Hotkey_IniSection(Section = "") {
	Return Section = "" ? Hotkey_Arr("IniSection") : Hotkey_Arr("IniSection", Section)
}

Hotkey_Hook(Option) {
	Return Hotkey_Arr("Hook") && InStr(Hotkey_Arr("Hook"), Option)
}

Hotkey_InHook(Option) {
	Return InStr(Hotkey_Arr("Hook"), Option)
}

Hotkey_ChangeOption(Name, Option = "") {
	Local g, g1
	If Hotkey_Group("Get", Name)
		Hotkey_Group("Delete", Name)
	If RegExMatch(Option, "Si)G(\d+)", g)
		Hotkey_Group("Set", Name, g1)
	Return Hotkey_Options(Hotkey_ID(Name), Option = "" ? "K" : Option), Hotkey_IsRegFocus()
}

Hotkey_Delete(Name, Destroy = 1) {
	Local Hwnd, hFocus, ControlNN
	Hwnd := Hotkey_ID(Name)
	GuiControl, -g, % Hwnd
	If Hotkey_Group("Get", Name)
		Hotkey_Group("Delete", Name)
	Hotkey_Value(Hwnd, "", "")  ;	Удалять, до удаления Hotkey_ID
	Hotkey_ID(Hwnd, "", ""), Hotkey_ID(Name, "", "")
	Hotkey_Options(Hwnd, "", "")
	Hotkey_BanArr().Delete(Name)
	Hotkey_Arr("AllHotkeys").Delete(Name)
	Hotkey_Arr("BindString").Delete(Name)
	ControlGetFocus, ControlNN, A
	ControlGet, hFocus, Hwnd, , %ControlNN%, A
	(hFocus = Hwnd ? Hotkey_Main("Control") : 0)
	If Destroy
		DllCall("DestroyWindow", "Ptr", Hwnd)
	Else
		PostMessage, 0x00CF, 0, , , ahk_id %hwnd%		;	EM_SETREADONLY
	Return Hwnd
}

Hotkey_SetText(hwnd, Text, HK) {
	Hotkey_Value(hwnd, HK)
	SendMessage, 0x000C, 0, &Text, , ahk_id %hwnd%		;	WM_SETTEXT
	PostMessage, 0x00B1, -2, -2, , ahk_id %hwnd%		;	EM_SETSEL
}

Hotkey_Set(Name, HK = "") {
	Local Text
	Text := Hotkey_HKToStr(HK)
	Hotkey_SetText(Hotkey_ID(Name), Text, HK)
	Return Text
}

Hotkey_Read(Name, Section = "", FilePath = "") {
	Local HK
	IniRead, HK, % FilePath = "" ? Hotkey_IniPath() : FilePath, % Section = "" ? Hotkey_IniSection() : Section, % Name, % A_Space
	Return HK
}

Hotkey_Write(Name, Section = "", FilePath = "") {
	Local HK
	IniWrite, % HK := Hotkey_Value(Name), % FilePath = "" ? Hotkey_IniPath() : FilePath, % Section = "" ? Hotkey_IniSection() : Section, % Name
	Return HK
}

	; -------------------------------------- Focus --------------------------------------

Hotkey_FocusClick(wParam, lParam, msg, hwnd) {
	If Hotkey_Arr("Focus")[hwnd]
		ControlFocus, , % "ahk_id" Hotkey_Arr("Focus")[hwnd]
	Else
		ControlFocus, , ahk_id %hwnd%
}

Hotkey_KillFocus(Name) {
	ControlFocus, , % "ahk_id" Hotkey_Arr("Focus")[DllCall("GetParent", Ptr, Hotkey_ID(Name))]
}

Hotkey_SetFocus(Name) {
	ControlFocus, , % "ahk_id" Hotkey_ID(Name)
}

	; -------------------------------------- Group --------------------------------------

Hotkey_Group(Key = "", p1 = "", p2 = "") {
	Local Name, Value, k, v, n, m, f, r
	Static NG := {}, GN := [], SaveCheck := []
	If (Key = "") {
		For k, Name in SaveCheck {
			If ((Value := Hotkey_Value(Name)) != "") {
				(f := Hotkey_Arr("OnGroup")) != "" && (r := {}, r.names := [])
				For m, n in GN[NG[Name]] {
					If (n != Name && Hotkey_Equal(Value, Hotkey_Value(n))) {
						Hotkey_Set(Name)
						(f != "") && (r.names.Push(n), r.this := Name, r.value := Value, r.group := NG[Name])
						Hotkey_Blink(Hotkey_ID(n))
					}
				}
			}
			SaveCheck.Delete(k)
		}
		(f != "") && (r.this != "") && %f%(r)
	}
	Else If (Key = "Set")
		NG[p1] := p2, IsObject(GN[p2]) ? GN[p2].Push(p1) : GN[p2] := [p1]
	Else If (Key = "SaveCheck")
		Return 1, SaveCheck[p1] := Hotkey_ID(p1)
	Else If (Key = "Get")
		Return NG[p1]
	Else If (Key = "CheckAll") {
		For k, v in GN
			For k, n in v
				If ((Value := Hotkey_Value(n)) != "")
					For k, m in v
						If (n != m && Hotkey_Equal(Value, Hotkey_Value(m)))
							Hotkey_Set(m)
	}
	Else If (Key = "Delete") {
		For k, v in GN[NG[p1]]
			If (v = p1) {
				GN[NG[p1]].RemoveAt(k)
				Break
			}
		NG.Delete(p1)
	}
}

Hotkey_Blink(hwnd) {
	Local k
	Static i, Blink := {}
	If !DllCall("IsWindowVisible", "Ptr", hwnd)
		Return
	DllCall("ShowWindowAsync", "Ptr", hwnd, "Int", 0)
	Blink[hwnd] := 1, i := 3
	SetTimer, Hotkey_BlinkControl, -50
	Return

	Hotkey_BlinkControl:
		For k in Blink
			DllCall("ShowWindowAsync", "Ptr", k, "Int", Mod(i, 2) ? 4 : 0)
		If (--i > 0) || !(Blink := {})
			SetTimer, Hotkey_BlinkControl, -50
		Return
}

Hotkey_Equal(HK1, HK2) {
	Local Bool
	If (HK2 = "")
		Return 0
	If (HK1 = HK2)
		Return 1
	If (HK1 ~= "S)[<>]") && (HK2 ~= "S)[<>]")
		Return 0
	If Hotkey_EqualDouble(HK1, HK2, Bool)
		Return Bool
	If !(HK1 ~= "S)[\^\+!#]") || !(HK2 ~= "S)[\^\+!#]")
		Return 0
	Return (Hotkey_ModsSub(HK1) = Hotkey_ModsSub(HK2))
}

Hotkey_EqualDouble(HK1, HK2, ByRef Bool) {
	Static Prefix := {"LCtrl":"<^","RCtrl":">^","LShift":"<+","RShift":">+"
						,"LAlt":"<!","RAlt":">!","LWin":"<#","RWin":">#"}
	Local K, K1, K2, i, D, P, R
	If !(!!InStr(HK1, " & ") && i:=1) ^ (!!InStr(HK2, " & ") && i:=2)
		Return Bool := 0
	D := HK%i%, P := i = 1 ? HK2 : HK1
	If !((1, RegExReplace(P, "[\^\+!#]", , R, 2)) && (R = 1)
	&& RegExMatch(D, "S)^\s*(.*?) & (.*?)\s*$", K)
	&& (Prefix[K1] && !Prefix[K2]) && (1, D := Prefix[K1] . K2))
		Return Bool := 0
	Return 1, Bool := SubStr(D, 1 + !(P ~= "S)[<>]")) = P
}

Hotkey_ModsSub(HK) {
	If !(HK ~= "[<>]")
		Return HK
	HK := StrReplace(HK, "<")
	HK := StrReplace(HK, ">")
	HK := StrReplace(HK, "^^", "^", , 1)
	HK := StrReplace(HK, "++", "+", , 1)
	HK := StrReplace(HK, "!!", "!", , 1)
	Return StrReplace(HK, "##", "#", , 1)
}

	; -------------------------------------- Format --------------------------------------

Hotkey_HKToStr(HK) {
	Static Prefix := {"^":"Ctrl","+":"Shift","!":"Alt","#":"Win","<":"L",">":"R"}
	, EngSym := {"sc2":"1","sc3":"2","sc4":"3","sc5":"4","sc6":"5","sc7":"6"
				,"sc8":"7","sc9":"8","scA":"9","scB":"0","scC":"-","scD":"="
				,"sc10":"Q","sc11":"W","sc12":"E","sc13":"R","sc14":"T","sc15":"Y"
				,"sc16":"U","sc17":"I","sc18":"O","sc19":"P","sc1A":"[","sc1B":"]"
				,"sc1E":"A","sc1F":"S","sc20":"D","sc21":"F","sc22":"G","sc23":"H"
				,"sc24":"J","sc25":"K","sc26":"L","sc27":"`;","sc28":"'","sc29":"``"
				,"sc2B":"\","sc2C":"Z","sc2D":"X","sc2E":"C","sc2F":"V","sc30":"B"
				,"sc31":"N","sc32":"M","sc33":",","sc34":".","sc35":"/","sc56":"\"

				,"vk31":"1","vk32":"2","vk33":"3","vk34":"4","vk35":"5","vk36":"6"
				,"vk37":"7","vk38":"8","vk39":"9","vk30":"0","vkBD":"-","vkBB":"="
				,"vk51":"Q","vk57":"W","vk45":"E","vk52":"R","vk54":"T","vk59":"Y"
				,"vk55":"U","vk49":"I","vk4F":"O","vk50":"P","vkDB":"[","vkDD":"]"
				,"vk41":"A","vk53":"S","vk44":"D","vk46":"F","vk47":"G","vk48":"H"
				,"vk4A":"J","vk4B":"K","vk4C":"L","vkBA":"`;","vkDE":"'","vkC0":"``"
				,"vkDC":"\","vk5A":"Z","vk58":"X","vk43":"C","vk56":"V","vk42":"B"
				,"vk4E":"N","vk4D":"M","vkBC":",","vkBE":".","vkBF":"/","vkE2":"\"}

	Local K, K1, K2, R, R1, R2, M, P := 1
	If InStr(HK, " & ")
	{
		RegExMatch(HK, "S)^\s*(.*?) & (.*?)\s*$", K)
		If K1 ~= "i)^(vk|sc[^r])"
			K1 := Hotkey_Arr("OnlyEngSym") && EngSym.HasKey(K1) ? EngSym[K1] : GetKeyName(K1)
		If K2 ~= "i)^(vk|sc[^r])"
			K2 := Hotkey_Arr("OnlyEngSym") && EngSym.HasKey(K2) ? EngSym[K2] : GetKeyName(K2)
		Return (StrLen(K1) = 1 ? Format("{:U}", K1) : K1) " & " (StrLen(K2) = 1 ? Format("{:U}", K2) : K2)
	}
	RegExMatch(HK, "S)^\s*([~\*\$\^\+!#<>]*)\{?(.*?)}?\s*$", K)
	If (K2 = "")
		Return "" Hotkey_Arr("Empty")
	If K2 ~= "i)^(vk|sc[^r])"
		K2 := Hotkey_Arr("OnlyEngSym") && EngSym.HasKey(K2) ? EngSym[K2] : GetKeyName(K2)
	While P := RegExMatch(K1, "S)([<>])*([\^\+!#])", R, P) + StrLen(R)
		M .= Prefix[R1] . Prefix[R2] . " + "
	Return M . (StrLen(K2) = 1 ? Format("{:U}", K2) : K2)
}

Hotkey_HKToSend(HK, Section = "", FilePath = "") {
	Local K, K1, K2
	If (HK = "")
		Return
	If (Section != "")
		IniRead, HK, % FilePath = "" ? Hotkey_IniPath() : FilePath, % Section, % HK, % A_Space
	If InStr(HK, " & ") && (1, RegExMatch(HK, "S)^\s*(.*?) & (.*?)\s*$", K))
		Return "{" RegExReplace(K1, "S)[~\$\*]") "}{" K2 "}"
	RegExMatch(HK, "S)^\s*([~\*\$\^\+!#<>]*)\{?(.*?)}?\s*$", K)
	Return RegExReplace(K1, "S)([^\^\+!#]*)") "{" K2 "}"
}

Hotkey_HKToSendEx(HK, Section = "", FilePath = "") {
	Static V := {"^":"Ctrl","+":"Shift","!":"Alt","#":"Win","<":"L",">":"R","":"L"}
	Local K, K1, K2, M1, M2, R, R1, R2, P := 1
	If (HK = "")
		Return
	If (Section != "")
		IniRead, HK, % FilePath = "" ? Hotkey_IniPath() : FilePath, % Section, % HK, % A_Space
	If InStr(HK, " & ") && (1, RegExMatch(HK, "S)^\s*(.*?) & (.*?)\s*$", K))
		Return "{" (K1 := RegExReplace(K1, "S)[~\$\*]")) " Down}{" K2 " Down}{" K1 " Up}{" K2 " Up}"
	RegExMatch(HK, "S)^\s*([~\*\$\^\+!#<>]*)\{?(.*?)}?\s*$", K)
	While P := RegExMatch(K1, "S)([<>])*([\^\+!#])", R, P) + StrLen(R)
		M1 .= "{" V[R1] V[R2] " Down}", M2 .= "{" V[R1] V[R2] " Up}"
	Return M1 . "{" K2 "}" . M2
}

264

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov И немного прокоментируйте пожалуйста

Ok: 
	Hotkey, % PrKey_Combo, Off, UseErrorLevel
	PrKey_Combo := Hotkey_Write("Combo")
	Hotkey, % PrKey_Combo, Combo, On, UseErrorLevel 
	Send_Armlet := Hotkey_HKToSend(Hotkey_Write("Armlet"))
	return

Не очень понимаю, что за что отвечает

265 (изменено: serzh82saratov, 2018-08-12 18:49:38)

Re: AHK: Замена стандартного элемента управления "Hotkey"

Не ругайте, за то что юзаю всё в одном файле, мне так удобнее.

Ну актуальную версию библиотеки точно не надо добавлять в пост.

Я обновил библиотеку, теперь кол-во нажатий можно задать в Hotkey_HKToSend.

можно ли использовать сохранение в конструкции, если да то как?

Я так понял вы спрашиваете как сохранять на лету, без кнопки сохранения.


#SingleInstance Force
#NoEnv
#UseHook

Hotkey_IniPath("Hotkey.ini")
Hotkey_IniSection("Hotkeys")
Gui, Add, Text, w300 +Center, Send
Hotkey_Add("wp", "Send", "KMLRJ", "*", "fSend")
Gui, Add, Text, wp y+10 +Center, Press
Hotkey_Add("wp y+10", "Press", "KMLRJ", "*", "fPress")
Gui, Add, Edit, wp y+20 r22
Gui, Show
fPress(), fSend()  ;	назначаем хоткей и строку для Send
return

fPress() {
	Static PrKey_Press
	Hotkey, % PrKey_Press, Off, UseErrorLevel
	PrKey_Press := Hotkey_Write("Press")
	Hotkey, % PrKey_Press, lPress, On, UseErrorLevel  
}

fSend() {
	Global
	Str_Send := Hotkey_HKToSend(Hotkey_Write("Send"), 3) 
}

lPress: 
	SendInput % Str_Send
	return

GuiClose() {
    ExitApp
}

Не очень понимаю, что за что отвечает

Так всё в описании есть, Hotkey_Write и Hotkey_HKToSend.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

266

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov Благодарю

267

Re: AHK: Замена стандартного элемента управления "Hotkey"

Я добавил в описание пример про "Переназначение клавиш", он продвинутый, но полезный если много подобных переназначений.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

268 (изменено: Gutalin, 2018-08-17 20:40:54)

Re: AHK: Замена стандартного элемента управления "Hotkey"

1)При отключении хоткеев с помощью

Hotkey_InitHotkeys(bool)

Их нельзя будет ввести, но можно будет удалить двойным нажатием ЛКМ.
Как можно сделать, чтобы не ввести и не удалить хоткей нельзя было?
2)Поле ввода хоткеев всегда того же цвета,что и фон окна, можно ли сделать, чтобы, к примеру, когда Hotkey_InitHotkeys(1) фон поля ввода хоткеев был белый, а во время Hotkey_InitHotkeys(0) как и у фона окна (как в Edit'ах при ReadOnly)

AutoHotkey - 1.1.30.01

269

Re: AHK: Замена стандартного элемента управления "Hotkey"

Hotkey_InitHotkeys сделано для другого, это когда контролов не видно, а ваши хоткеи по разным причинам могут не работать из за установленных хоткеев в библиотеке.
ReadOnly - это уже стиль по умолчанию для создаваемых в библиотеке контролов, чтобы при некоторых условиях нельзя было ввести свои данные.
Вам проще использовать Disabled, его и визуально можно отличить.


for name in Hotkey_Arr("AllHotkeys") 
	GuiControl, Disabled, % Hotkey_ID(name)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

270

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov, да, Вы правы. Работает идеально, спасибо!

AutoHotkey - 1.1.30.01

271

Re: AHK: Замена стандартного элемента управления "Hotkey"

Недавно меня ещё спрашивали как переместить, я добавил:

Hotkey_Move(Name, Option)
Hotkey_Disable(Name)
Hotkey_Hide(Name)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

272

Re: AHK: Замена стандартного элемента управления "Hotkey"

Gutalin
В вашем случае так:

MsgBox Отключить все
for name in Hotkey_Arr("AllHotkeys")  
	Hotkey_Disable(Name) 
	
MsgBox Включить все
for name in Hotkey_Arr("AllHotkeys")  
	Hotkey_Disable(Name, 0)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

273

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov, а в чем разница? На вид я не замечаю отличий?

AutoHotkey - 1.1.30.01

274

Re: AHK: Замена стандартного элемента управления "Hotkey"

GuiControl, Disabled, % Hotkey_ID(name)

и

Hotkey_Disable(Name)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

275 (изменено: Gutalin, 2018-08-17 21:23:47)

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov, функциональных изменений я не замечаю. Так же блокируется, код становится меньше.

AutoHotkey - 1.1.30.01

276

Re: AHK: Замена стандартного элемента управления "Hotkey"

Gutalin пишет:

функциональных изменений я не замечаю

Так и задумано.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

277

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov, возможно сделать фон ввода белым? Как в обычных Edit'ах?

AutoHotkey - 1.1.30.01

278

Re: AHK: Замена стандартного элемента управления "Hotkey"

В Hotkey_Add в первом параметре напишите -ReadOnly, или сразу для всех - Hotkey_Arr("ControlOption", "-ReadOnly").

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

279

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov, зачем был добавлен +ReadOnly? Спрашиваю за тем, что, не перестанет ли код работать в определённых ситуациях  из-за -ReadOnly ?

AutoHotkey - 1.1.30.01

280

Re: AHK: Замена стандартного элемента управления "Hotkey"

Можно будет ввести текст если нет опции К, но может и ещё как, я не гарантирую.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

281

Re: AHK: Замена стандартного элемента управления "Hotkey"

serzh82saratov, опция K есть, поэтому и не заметил разницы,спасибо за объяснения.

AutoHotkey - 1.1.30.01

282

Re: AHK: Замена стандартного элемента управления "Hotkey"

Кстати есть очень хороший пример от teadrinker.
Можно установить любые цвета, и ReadOnly убирать не надо.


#NoEnv
#SingleInstance Force
Gui, +AlwaysOnTop
Hotkey_IniPath(A_ScriptDir "\Hotkey.ini"), Hotkey_IniSection("Hotkeys")
Hotkey_Add("w300", "MyHotkey1", "G1KD", "*", "Save")
Hotkey_Add("wp y+10", "MyHotkey2", "G1KMLRJ", "*", "Save")
Gui, Add, Edit, Center vText wp
for name, hwnd in Hotkey_Arr("AllHotkeys")
	SetStaticColor(hwnd, 0x0000FF, 0xFFFFFF) 
Gui, Show
Return

Save(Name) { 
    GuiControl, , Text, % Name " = " Hotkey_Write(Name)
}

GuiClose() {
    ExitApp
}

SetStaticColor(hStatic, b_color, f_color)
{
	static arr := [], GWL_WNDPROC := -4
	hGui := DllCall("GetParent", Ptr, hStatic, Ptr)
	if !arr.HasKey(hGui)  {
		arr[hGui] := {}, arr[hGui].Statics := []
		arr[hGui].ProcOld := DllCall("SetWindowLong" . (A_PtrSize = 8 ? "Ptr" : ""), Ptr, hGui, Int, GWL_WNDPROC
												, Ptr, RegisterCallback("WindowProc", "", 4, Object(arr[hGui])), Ptr)
	}
	else if arr[hGui].Statics.HasKey(hStatic)
		DllCall("DeleteObject", Ptr, arr[hGui].Statics[hStatic].hBrush)
	arr[hGui].Statics[hStatic] := { b_color: Rgb2Bgr(b_color), f_color: Rgb2Bgr(f_color)
											, hBrush: DllCall("CreateSolidBrush", UInt, Rgb2Bgr(b_color), Ptr) }
	WinSet, Redraw,, ahk_id %hGui%
}

WindowProc(hwnd, uMsg, wParam, lParam)
{
	Critical
	static WM_CTLCOLORSTATIC := 0x138
	obj := Object(A_EventInfo)
	if (uMsg = WM_CTLCOLORSTATIC && k := obj.Statics[lParam])  {
		DllCall("SetBkColor", Ptr, wParam, UInt, k.b_color)
		DllCall("SetTextColor", Ptr, wParam, UInt, k.f_color)
		Return k.hBrush
	}
	Return DllCall("CallWindowProc", Ptr, obj.ProcOld, Ptr, hwnd, UInt, uMsg, Ptr, wParam, Ptr, lParam)
}
	
Rgb2Bgr(color)
{
	Return (color & 0xff) << 16 | ((color >> 8) & 0xff) << 8 | color >> 16
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

283

Re: AHK: Замена стандартного элемента управления "Hotkey"

Приветствую, по аналогии с

#SingleInstance Force
#NoEnv
#UseHook

Hotkey_IniPath("Hotkey.ini")
Hotkey_IniSection("Hotkeys")
Gui, Add, Text, w300 +Center, Send
Hotkey_Add("wp", "Send", "KMLRJ", "*", "fSend")
Gui, Add, Text, wp y+10 +Center, Press
Hotkey_Add("wp y+10", "Press", "KMLRJ", "*", "fPress")
Gui, Add, Edit, wp y+20 r22
Gui, Show
fPress(), fSend()  ;	назначаем хоткей и строку для Send
return

fPress() {
	Static PrKey_Press
	Hotkey, % PrKey_Press, Off, UseErrorLevel
	PrKey_Press := Hotkey_Write("Press")
	Hotkey, % PrKey_Press, lPress, On, UseErrorLevel  
}

fSend() {
	Global
	Str_Send := Hotkey_HKToSend(Hotkey_Write("Send"), 3) 
}

lPress: 
	SendInput % Str_Send
	return

GuiClose() {
    ExitApp
}

Пытаюсь написать 

Flux:
If (space_Flux and GetKeyState("Space")) {
send, {%Group_2%}
Send, {%Flux%}
send, {%Group_1%}
} Else {
Send, {%Flux%}
}
return

Вот так примерно у меня вышло ВАРИАНТ 1

fFlux() {
	Static PrKey_Press
	Hotkey, % PrKey_Press, Off, UseErrorLevel
	PrKey_Press := Hotkey_Write("Flux")
	Hotkey, % PrKey_Press, lPress, On, UseErrorLevel
	If (space_Flux and GetKeyState("Space")) {
	Str_Send := Hotkey_HKToSend(Hotkey_Write("Group_2"))		
	Str_Send := Hotkey_HKToSend(Hotkey_Write("Flux"))		
	Str_Send := Hotkey_HKToSend(Hotkey_Write("Group_1"))		
	} Else {
	Str_Send := Hotkey_HKToSend(Hotkey_Write("Flux"))
}
}

fGroup_1() {
	Global
	Str_Send := Hotkey_HKToSend(Hotkey_Write("Group_1")) 
}

fGroup_2() {
	Global
	Str_Send := Hotkey_HKToSend(Hotkey_Write("Group_2")) 
}

lPress: 
	SendInput % Str_Send
	return

Вариант 2

fFlux() {
	Static PrKey_Press
	Hotkey, % PrKey_Press, Off, UseErrorLevel
	PrKey_Press := Hotkey_Write("Flux")
	Hotkey, % PrKey_Press, lPress, On, UseErrorLevel
}
 
flux() {
	Global
	If (space_Flux and GetKeyState("Space")) {
	Str_Send := Hotkey_HKToSend(Hotkey_Write("Group_2"))		
	Str_Send := Hotkey_HKToSend(Hotkey_Write("Flux"))		
	Str_Send := Hotkey_HKToSend(Hotkey_Write("Group_1"))		
	} Else {
	Str_Send := Hotkey_HKToSend(Hotkey_Write("Flux"))
}
}

fGroup_1() {
	Static PrKey_Press
	Hotkey, % PrKey_Press, Off, UseErrorLevel
	PrKey_Press := Hotkey_Write("Group_1")
	Hotkey, % PrKey_Press, On, UseErrorLevel
}


fGroup_2() {
	Static PrKey_Press
	Hotkey, % PrKey_Press, Off, UseErrorLevel
	PrKey_Press := Hotkey_Write("Group_2")
	Hotkey, % PrKey_Press, On, UseErrorLevel
}

lPress: 
	SendInput % Str_Send
	return

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

Hotkey_Add("x22 y79 w45 h20", "Flux", "G1KMLRJ", "*", "fFlux")
Hotkey_Add("x22 y195 w100 h20", "Group_1", "G1KMLRJ", "*", "fGroup_1")
Hotkey_Add("x144 y195 w100 h20", "Group_2", "G1KMLRJ", "*", "fGroup_2")
fFlux(), fGroup_1(), fGroup_2()
Gui, Show, w1045 h579

284

Re: AHK: Замена стандартного элемента управления "Hotkey"

Попробовал такой вариант

Ok:
	Hotkey, % PrKey_Flux, Off, UseErrorLevel
	PrKey_Flux := Hotkey_Write("Flux")
	Hotkey, % PrKey_Flux, Flux, On, UseErrorLevel
	
	Hotkey, % PrKey_Group_1, Off, UseErrorLevel
	PrKey_Group_1 := Hotkey_Write("Group_1")
	Hotkey, % PrKey_Group_1, Group_1, On, UseErrorLevel
	
	Hotkey, % PrKey_Group_2, Off, UseErrorLevel
	PrKey_Group_2 := Hotkey_Write("Group_2")
	Hotkey, % PrKey_Group_2, Group_2, On, UseErrorLevel
return

Flux:
If (space_Flux and GetKeyState("Space")) {
send, % PrKey_Group_2
send, % PrKey_Flux
send, % PrKey_Group_1
} Else {
send, % PrKey_Flux
}
return

Всё сохраняет и работает, но пишит лишь скан кодами, чувствую что где-то рядом топчусь. Пробовал заменить

	PrKey_Flux := Hotkey_Write("Flux")

на это

	PrKey_Flux := Hotkey_HKToSend(Hotkey_Write("Flux"))

Но  тогда перестаёт работать конструкция Flux: