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 Telegram: https://t.me/sergiol982
Win10x64 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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

205

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

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

206

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

209

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

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

210

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

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

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

212

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

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

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

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

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

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

213

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

teadrinker пишет:

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

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

teadrinker пишет:

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

214

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

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

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

215

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

216

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

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

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

217

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

218

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

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

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

219

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

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

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

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

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

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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

222

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

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

Sleep, 3000
SendLevel, 1
SendInput, {VOLUME_UP}

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

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

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 Telegram: https://t.me/sergiol982
Win10x64 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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

226

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

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

227

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

228

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

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

229

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

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

#InstallKeybdHook
VOLUME_UP::MsgBox % физическое : нефизическое
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

233

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

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

234

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 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 Telegram: https://t.me/sergiol982
Win10x64 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 Telegram: https://t.me/sergiol982
Win10x64 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
Telegram jollycoder

241

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

243

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

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

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

244

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

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

245

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

246

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

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

247

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 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.32.00

249

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

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

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

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

AutoHotkey - 1.1.32.00

251

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

253

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

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

AutoHotkey - 1.1.32.00

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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

255

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

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

AutoHotkey - 1.1.32.00

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 Telegram: https://t.me/sergiol982
Win10x64 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 Telegram: https://t.me/sergiol982
Win10x64 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 Telegram: https://t.me/sergiol982
Win10x64 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 Telegram: https://t.me/sergiol982
Win10x64 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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

266

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

serzh82saratov Благодарю

267

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 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.32.00

269

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

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


for name in Hotkey_Arr("AllHotkeys") 
	GuiControl, Disabled, % Hotkey_ID(name)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

270

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

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

AutoHotkey - 1.1.32.00

271

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

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

Hotkey_Move(Name, Option)
Hotkey_Disable(Name)
Hotkey_Hide(Name)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

273

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

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

AutoHotkey - 1.1.32.00

274

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

GuiControl, Disabled, % Hotkey_ID(name)

и

Hotkey_Disable(Name)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

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

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

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

AutoHotkey - 1.1.32.00

276

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

Gutalin пишет:

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

277

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

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

AutoHotkey - 1.1.32.00

278

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

279

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

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

AutoHotkey - 1.1.32.00

280

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

281

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

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

AutoHotkey - 1.1.32.00

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 Telegram: https://t.me/sergiol982
Win10x64 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:

285

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

После обновления от 11.02.2020, перестал работать код из примеров "Назначение хоткеев из назначенных клавиш". Просто не работает, запускается без ошибок. На предшествующей версии всё работало нормально.

286

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

Проверил, всё работает.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

287

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

serzh82saratov, Дико извиняюсь, перепутал , я имел ввиду "переназначение клавиш (назначаем хоткей, и назначаем клавиши которые он отправляет с помощью Send)".
Назначаю две клавиши, но по нажатию клавиши "Press", не отправляет "Send"

288

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

Исправил библиотеку, v2.07.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

289 (изменено: Vitalkerrain, 2020-08-04 14:57:52)

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

Основываясь на справке и примерах пытаюсь сделать максимально короткий и удобный код, но имею проблему следующего характера. Когда задаю новую клавишу работает и назначенная новая и срабатывает старая, как фиксить? Не пойму почему не снимается со старой, так сказать её "полномочия". И скажите пожалуйста, почему я не могу после Show, вызвать Save()- вот так, а обязательно что-то должен передать в функцию, может в этом и дело?

#Include Hotkey.Ahk
#NoEnv
#SingleInstance Force
Hotkey_Arr("OnlyEngSym", True)
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")
Hotkey_Add("wp y+10", "MyHotkey3", "G1KMLRJ", "*", "Save")
Gui, Show
Save(ZachemToNyjnoPeradatb4Toto)
Return

Save(name) {
	for name in Hotkey_Arr("AllHotkeys") {
			Hotkey, % Hotkey_Value(name), Off, UseErrorLevel
			Hotkey, % Hotkey_Write(name), L_%name%, On , UseErrorLevel 
			}
		Sleep, 2500
			Hotkey_KillFocus(Name)
}

GuiClose() {
    ExitApp
}
L_MyHotkey1:
Send, % Hotkey_HKToSend(Hotkey_Value("MyHotkey2"))
	Return
	
L_MyHotkey2:
Send, % Hotkey_HKToSend("Enter")
	Return

L_MyHotkey3:
Send, % Hotkey_HKToSend(Hotkey_Value("MyHotkey1"))
	Return

Ну и сразу попытался сделать "Адекватное, но колхозное снятие фокуса"

290

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

Из вашего примера, я не могу сделать вывод чего вы в итоге добиваетесь. Похоже на куски кода которые вы выдернули не задумываясь.
Если вы тут хотите переназначить одну клавишу, то зачем третий хоткей. Функция Save указана для контролов, но вы в ней перебираете сразу все контролы, name берёте из массива, а меня спрашиваете зачем тут параметр, у вас тут не зачем. KillFocus надо вызывать по таймеру, иначе следующее нажатие не обновит таймаут.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

291 (изменено: Vitalkerrain, 2020-08-04 18:33:51)

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

serzh82saratov Цель в том, чтобы кнопки могли нажимать друг друга, для создания макроса. Вопрос такой, если в контрол "MyHotkey1", допустим я поставлю Q, то по её нажатию нажмётся клавиша из "MyHotkey2", а потом решу поменять Q на Z, то код будет работать и по нажатию Q и Z, а после его перезагрузки, уже будет полноценно работать только по Z. Как исправить сей недуг?
Т.Е. Кнопка уже для выполнения команды Z, но скрипт по прежнему реагирует на Q.

292 (изменено: serzh82saratov, 2020-08-04 19:21:55)

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

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


#SingleInstance Force
#NoEnv
#UseHook
#IF !Hotkey_Arr("Hook")
#IF
 
Hotkey_IniPath("Hotkey.ini")
Hotkey_IniSection("Hotkeys")

Hotkey_Add("cRed w400", "Press" 1, "G1KMLRJD", "*", "FuncPress", "Send" 1) 
Hotkey_Add("wp y+20 xp", "Send" 1, "KMLRJ", "*", "FuncSend")  
FuncPress("Press" 1), FuncSend("Send" 1) 
Gui, Show 
return 

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

FuncSend(name) { 
	Hotkey_Arr("User")["StrSend_" name] := Hotkey_HKToSend(Hotkey_Write(name)) 
}

ActionPress(name) {  
	SendInput % Hotkey_Arr("User")["StrSend_" name]
}

GuiClose() {
    ExitApp
}

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

293

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

serzh82saratov И на том спасибо)

294

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

Если ещё есть вопросы, задавайте.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

295

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

serzh82saratov пишет:

более тут упростить нечего

ТА-ДА

#Include Hotkey.Ahk
#NoEnv
#SingleInstance Force
Hotkey_Arr("OnlyEngSym", True)
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")
Hotkey_Add("wp y+10", "MyHotkey3", "G1KMLRJ", "*", "Save")
Gui, Show
Save(name)
Return

Save(name) {
	for name in Hotkey_Arr("AllHotkeys") {
			Static PrKey := {}  
			Hotkey, % PrKey[name], Off, UseErrorLevel
				PrKey[name] := Hotkey_Write(name) 
			Hotkey, % PrKey[name], L_%name%, On , UseErrorLevel 
			}
		Sleep, 2500
			Hotkey_KillFocus(Name)
}

GuiClose() {
    ExitApp
}
L_MyHotkey1:
Send, % Hotkey_HKToSend(Hotkey_Value("MyHotkey2"))
Sleep, 75
Send, % Hotkey_HKToSend(Hotkey_Value("MyHotkey3"))
	Return
	
L_MyHotkey2:
Send, % Hotkey_HKToSend("Enter")
	Return

L_MyHotkey3:
Send, % Hotkey_HKToSend(Hotkey_Value("MyHotkey1"))
	Return

Отталкиваясь от ваших постов.

296

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

Уважаемый serzh82saratov А можно ли как-то пофиксить параметр высоты у кнопок? "h" он просто не работает при любых значениях, а с шириной всё нормально.

297

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

При опции Edit r1, высота не действительна, если r1 удалить, ну в общем сами увидите, советую просто увеличить шрифт, тогда в соответствии с ним будет выстроена высота Edit.


Gui, Add, Edit, h88 r1
Gui, Show
Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

298

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

Уважаемый serzh82saratov, испытываю трудность с фокусом на разных ТАБах, если на первой вкладке фокус снимается, то на второй уже нет. Пробовал и Tab3, тоже самое. Это можно как-то пофиксить? Краткий код прилагаю

#Include Hotkey.Ahk

#SingleInstance Force
#NoEnv
#UseHook
#IF !Hotkey_Arr("Hook")
#IF
 
Hotkey_IniPath("Hotkey.ini")
Hotkey_IniSection("Hotkeys")

Gui, Color, 0xFFDD8A, 0xFFFFAA
Gui, Font, s12
Gui, Add, Tab, x0 y0 w233 h25 -Wrap vTabMain , Основная|Дополнительная
Gui, Tab, Основная
Gui, Add, Text, cRed x10 y50, Press %A_Index%:
	Hotkey_Add("x90 y50 w400 cRed Section", "Press" A_Index, "G1KMLRJD", "*", "FuncPress", "Send" A_Index)
	Gui, Add, Text, x10 y90, Send %A_Index%:
	Hotkey_Add("x90 y90 w400", "Send" A_Index, "KMLRJ", "*", "FuncSend") 
	Gui, Add, GroupBox, wp+100 h14 y+10 xm
	FuncPress("Press" A_Index), FuncSend("Send" A_Index)
	Gui, Add, Edit, wp y+20 r10
Gui, Tab, Дополнительная
Gui, Add, Text, cRed x10 y50, Press 1:
	Hotkey_Add("x90 y50 w400 cRed Section", "Press" 1, "G1KMLRJD", "*", "FuncPress", "Send" 1)
	Gui, Add, Text, x10 y90, Send 1:
	Hotkey_Add("x90 y90 w400", "Send" 1, "KMLRJ", "*", "FuncSend") 
	Gui, Add, GroupBox, wp+100 h14 y+10 xm
	FuncPress("Press" 1), FuncSend("Send" 1)
Gui, Add, Edit, wp y+20 r10
Gui, Show
Terminator()
return 
Terminator() {
		Hotkey_KillFocus(Name)
}
FuncPress(name) {
	SetTimer, Terminator, 500 ; Специально мало поставил, чтобы быстрее отслеживать
	Static PrKey := {}  
	Hotkey, IF, !Hotkey_Arr("Hook")
	Hotkey, % PrKey[name], Off, UseErrorLevel
	PrKey[name] := Hotkey_Write(name)  
	fn := Func("ActionPress").Bind(Hotkey_Arr("BindString")[Name]) 
	Hotkey, % PrKey[name], % fn, On, UseErrorLevel 
	Hotkey, IF
}

FuncSend(name) { 
	Hotkey_Arr("User")["StrSend_" name] := Hotkey_HKToSend(Hotkey_Write(name)) 
}

ActionPress(name) {  
	SendInput % Hotkey_Arr("User")["StrSend_" name]
}

GuiClose() {
    ExitApp
}

299

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

Пока только могу предложить костыль в вашем коде.
Навскидку не вспомню как определять принадлежность контрола к вкладке.


#SingleInstance Force
#NoEnv
#UseHook
#IF !Hotkey_Arr("Hook")
#IF
 
Hotkey_IniPath("Hotkey.ini")
Hotkey_IniSection("Hotkeys")

Gui, Color, 0xFFDD8A, 0xFFFFAA
Gui, Font, s12
Gui, Add, Tab, x0 y0 w233 h25 -Wrap vTabMain , Основная|Дополнительная
Gui, Tab, Основная
	Gui, Add, Text, 0 0 0 0 Hidden vDummy1
Gui, Add, Text, cRed x10 y50, Press %A_Index%:
	Hotkey_Add("x90 y50 w400 cRed Section", "Press" A_Index, "G1KMLRJD", "*", "FuncPress", "Send" A_Index)
	Gui, Add, Text, x10 y90, Send %A_Index%:
	Hotkey_Add("x90 y90 w400", "Send" A_Index, "KMLRJ", "*", "FuncSend") 
	Gui, Add, GroupBox, wp+100 h14 y+10 xm
	FuncPress("Press" A_Index), FuncSend("Send" A_Index)
	Gui, Add, Edit, wp y+20 r10
Gui, Tab, Дополнительная
	Gui, Add, Text, 0 0 0 0 Hidden vDummy2
Gui, Add, Text, cRed x10 y50, Press 1:
	Hotkey_Add("x90 y50 w400 cRed Section", "Press" 1, "G1KMLRJD", "*", "FuncPress", "Send" 1)
	Gui, Add, Text, x10 y90, Send 1:
	Hotkey_Add("x90 y90 w400", "Send" 1, "KMLRJ", "*", "FuncSend") 
	Gui, Add, GroupBox, wp+100 h14 y+10 xm
	FuncPress("Press" 1), FuncSend("Send" 1) 
Gui, Add, Edit, wp y+20 r10
Gui, Show
Terminator()
return 

Terminator() { 
	GuiControlGet, FocusTab,, TabMain 
	GuiControl, Focus, % FocusTab = "Основная" ? "Dummy1" : FocusTab = "Дополнительная" ? "Dummy2" : ""
}
FuncPress(name) {
	SetTimer, Terminator, 500 ; Специально мало поставил, чтобы быстрее отслеживать
	Static PrKey := {}  
	Hotkey, IF, !Hotkey_Arr("Hook")
	Hotkey, % PrKey[name], Off, UseErrorLevel
	PrKey[name] := Hotkey_Write(name)  
	fn := Func("ActionPress").Bind(Hotkey_Arr("BindString")[Name]) 
	Hotkey, % PrKey[name], % fn, On, UseErrorLevel 
	Hotkey, IF
}

FuncSend(name) { 
	Hotkey_Arr("User")["StrSend_" name] := Hotkey_HKToSend(Hotkey_Write(name)) 
}

ActionPress(name) {  
	SendInput % Hotkey_Arr("User")["StrSend_" name]
}

GuiClose() {
    ExitApp
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

300 (изменено: Vitalkerrain, 2020-10-19 16:16:21)

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

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