1 (изменено: Sgy-x2, 2016-06-29 22:41:21)

Тема: AHK: Конвертирование хоткеев

Все хоткеи так или иначе сохраняются в ini файл, от туда в последствии и читаются, но вот выводятся в окнах Gui в не очень приглядной форме.
Вопрос в следующем. Как выводить хоткеи типа !F1, ^F1, +F1 в формате АLt+F1, Ctrl+F1, Shift+F1 в Gui?

Решение.

2

Re: AHK: Конвертирование хоткеев

AHK: Замена gui контролу "Hotkey"

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

3

Re: AHK: Конвертирование хоткеев

Alectric
Я видел эту тему, но мне как раз обратный эффект нужен.

4

Re: AHK: Конвертирование хоткеев

И там в описании есть:

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

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

5 (изменено: serzh82saratov, 2017-08-01 16:20:48)

Re: AHK: Конвертирование хоткеев

Если нужно вне библиотеки, то можно взять Hotkey_HKToStr за основу.


MsgBox % HKToStr("^F1")

HKToStr(HK) {
	Static LRPrefix := [["<^","LCtrl"],[">^","RCtrl"],["<!","LAlt"],[">!","RAlt"]
	,["<+","LShift"],[">+","RShift"],["<#","LWin"],[">#","RWin"]]
	, Prefix := [["^","Ctrl"],["!","Alt"],["+","Shift"],["#","Win"]]
	, EngSym := {"vkBB":"=","vkBC":",","vkBD":"-","vkBE":".","vkBF":"/","vkC0":"``","vkBA":"`;"
				,"vkDB":"[","vkDC":"\","vkDD":"]","vkDE":"'","vk41":"A","vk42":"B","vk43":"C"
				,"vk44":"D","vk45":"E","vk46":"F","vk47":"G","vk48":"H","vk49":"I","vk4A":"J"
				,"vk4B":"K","vk4C":"L","vk4D":"M","vk4E":"N","vk4F":"O","vk50":"P","vk51":"Q"
				,"vk52":"R","vk53":"S","vk54":"T","vk55":"U","vk56":"V","vk57":"W","vk58":"X"
				,"vk59":"Y","vk5A":"Z"}
	Local K, K1, K2, I, V, M, R
	RegExMatch(HK, "S)^\s*([~\*\$\^\+!#<>]*)\{?(.*?)}?\s*$", K)
	If (K2 = "")
		Return "" 
	If InStr("|" K2, "|vk")
		K2 := K2 = "vkBF" ? "/" : (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)
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6 (изменено: Sgy-x2, 2016-06-08 17:31:18)

Re: AHK: Конвертирование хоткеев

Я понял. Спасибо.

7

Re: AHK: Конвертирование хоткеев

serzh82saratov
Скажите пожалуйста. Ваш код выше чувствителен к регистру VK-кодов, т.е. он воспринимает только со строчными буквами (vk23) а прописные (VK23) оставляет без изменений. Можно сделать его "всеядным"?

8

Re: AHK: Конвертирование хоткеев

Поправил.

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

9 (изменено: stealzy, 2016-06-09 15:51:57)

Re: AHK: Конвертирование хоткеев

Почему не использовать встроенную ф-ию GetKeyVK:

msgbox % GetKeyVKx("a")
GetKeyVKx(key) {
	return format("vk{:02x}", GetKeyVK(key))
}

10

Re: AHK: Конвертирование хоткеев

А как это поможет преобразовать +F1 в Shift+F1, или например >^<+F1 в RCtrl+LShift+F1?

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

11 (изменено: serzh82saratov, 2017-08-06 14:41:28)

Re: AHK: Конвертирование хоткеев

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


HKToStr(HK) {
	Static Prefix := {"^":"Ctrl","!":"Alt","+":"Shift","#":"Win","<":"L",">":"R"}
	Local K, K1, K2, R, R1, R2, M, P := 1
	RegExMatch(HK, "S)^\s*([~\*\$\^\+!#<>]*)\{?(.*?)}?\s*$", K)
	If (K2 = "")
		Return ""
	While P := RegExMatch(K1, "S)([<>])*([\^\+!#])", R, P) + StrLen(R)
		M .= Prefix[R1] . Prefix[R2] . "+"
	K := (K2 ~= "i)^(vk|sc[^r])" ? GetKeyName(K2) : K2)
	Return M . (StrLen(K) = 1 ? Format("{:U}", K) : K)
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12 (изменено: yalanne, 2016-06-09 19:03:42)

Re: AHK: Конвертирование хоткеев

serzh82saratov, А зачем использовать команду local для и так локальных переменных?
Ведь эта команда нужна что бы не передавать некоторые переменные в глобальной функции. А в простой функции она нечего не делает.

+ открыть спойлер
fn()
msgbox % "a)" a
			. "`nb)" b
			 . "`nc)" c
Return

fn(){
	Global
	Local c
	a := 1
	b := 2
	c := 3
}

13

Re: AHK: Конвертирование хоткеев

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

Global var := 1
 
Func()
MsgBox % var

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

14

Re: AHK: Конвертирование хоткеев

serzh82saratov
Спасибо за библиотеку Hotkey.ahk, полностью конечно не понимаю, но основные аспекты распробовал. Возникла тут небольшая проблема, надо понимать этот блок отвечает за перехват нажатий клавиатуры и всего остального. Так вот, из-за постоянного мониторинга нажатий, у меня подвивает клавиатура с залипанием кнопки, которая в тот момент удерживалась. Можно ли сделать эту проверку только в активном Gui окне?

	If !Hotkey_Hook("K")
		Return DllCall("CallNextHookEx", "Ptr", 0, "Int", nCode, "UInt", wParam, "UInt", lParam)
	pHeap := DllCall("HeapAlloc", "Ptr", hHeap, "UInt", HEAP_ZERO_MEMORY, "Ptr", Size, "Ptr")
	DllCall("RtlMoveMemory", "Ptr", pHeap, "Ptr", lParam, "Ptr", Size), oMem.Push([wParam, pHeap])
	SetTimer, Hotkey_LLKPWork, -10
	Return nCode < 0 ? DllCall("CallNextHookEx", "Ptr", 0, "Int", nCode, "UInt", wParam, "UInt", lParam) : 1

	Hotkey_LLKPWork:
		While (oMem[1] != "")
		{
			IF Hotkey_Hook("K")
			{
				Wp := oMem[1][1], Lp := oMem[1][2]
				VK := Format("vk{:X}", NumGet(Lp + 0, "UInt"))
				Ext := NumGet(Lp + 0, 8, "UInt")
				SC := Format("sc{:X}", (Ext & 1) << 8 | NumGet(Lp + 0, 4, "UInt"))
				If !Hotkey_Hook("S")
					IsMod := Mods[VK]
				If (Wp = 0x100 || Wp = 0x104)		;  WM_KEYDOWN := 0x100, WM_SYSKEYDOWN := 0x104
					IsMod ? Hotkey_Main("Mod", IsMod) : Hotkey_Main(VK, SC)
				Else IF ((Wp = 0x101 || Wp = 0x105) && VK != "vk5D")   ;  WM_KEYUP := 0x101, WM_SYSKEYUP := 0x105, AppsKey = "vk5D"
					IsMod ? Hotkey_Main("ModUp", IsMod) : 0
			}
			DllCall("HeapFree", "Ptr", hHeap, "UInt", 0, "Ptr", Lp)
			oMem.RemoveAt(1)
		}
		Return
}

15

Re: AHK: Конвертирование хоткеев

Sgy-x2 пишет:

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

Напишите более развёрнуто. И привидите свой код в котором используете.

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

16

Re: AHK: Конвертирование хоткеев

serzh82saratov
Без понятия как ещё ясней выразится. В общем в произвольное время, с интервалом от минуты до часа, происходят фризы. В этот момент клавиатура не реагирует, происходит это примерно 5-7 секунд, так же в этот момент залипает та кнопка что удерживалась в тот момент. Что характерно на другом компьютере этого нет. Буду выяснять в чем проблема, есть предположение, что это железная проблема. По поводу кода, не уверен, что вы захохочете изучать примерно 2к строк моего бреда.

17

Re: AHK: Конвертирование хоткеев

Sgy-x2 пишет:

Что характерно на другом компьютере этого нет.

У меня тоже такого нет. Там действительно хук не снимается на протяжении работы кода, изначально было снятие хука при каждой деактивации edit`а, но у меня при этом наблюдались ещё более частые и безсистемные залипания чем у вас.

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

18

Re: AHK: Конвертирование хоткеев

serzh82saratov пишет:

У меня тоже такого нет.

Я кажется нашел причину этих фризов. Есть такая программа, для снятия скриншотов и загрузки их на хост, под названием Monosnap. После выключения перестало фризить.

19

Re: AHK: Конвертирование хоткеев

С хуком периодически непонятки, подумываю перевести это на хоткеи.

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

20

Re: AHK: Конвертирование хоткеев

serzh82saratov пишет:

С хуком периодически непонятки, подумываю перевести это на хоткеи.

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

21

Re: AHK: Конвертирование хоткеев

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

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

22 (изменено: serzh82saratov, 2016-06-21 00:56:31)

Re: AHK: Конвертирование хоткеев

Черновой вариант.


Hotkey_Register(Controls*) {
	Static IsStart
	Local k, v
	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 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:
	IsMod := Hotkey_Hook("D") ? A_ThisHotkey : SubStr(A_ThisHotkey, 2), OnlyMods := 1
	If (K["M" IsMod] != "")
		Return
	K["M" IsMod] := IsMod "+", K["P" IsMod] := Prefix[IsMod]
	GoTo Hotkey_ViewMod
	
Hotkey_ModsUp:
	IsMod := Hotkey_Hook("D") ? SubStr(A_ThisHotkey, 1, -3) : SubStr(A_ThisHotkey, 2, -3)
	K["M" IsMod] := "", K["P" IsMod] := ""
	If (Hotkey != "")
		Return
	
Hotkey_ViewMod:  
	Hotkey := "", 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_MouseOrJoy:
	KeyName := InStr("|" A_ThisHotkey, "|sc", 1) ? Format("{:U}", GetKeyName(A_ThisHotkey)) : A_ThisHotkey
	Hotkey := A_ThisHotkey, OnlyMods := 0
	Hotkey_Arr("OnlyEngSym") && EngSym.HasKey(A_ThisHotkey) ? (KeyName := EngSym[A_ThisHotkey]) : 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%
	Return
}

Hotkey_InitHotkeys() {
	Local S_FormatInteger, Name
	Static Mods := "LAlt|RAlt|LCtrl|RCtrl|LShift|RShift|LWin|RWin"
	, MouseKey := "MButton|WheelDown|WheelUp|WheelRight|WheelLeft|XButton1|XButton2"
	#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, IF, Hotkey_Hook("M")
	Loop, Parse, MouseKey, |
		Hotkey, % Hotkey_SetName(A_LoopField), Hotkey_MouseOrJoy
	Hotkey, IF, Hotkey_Hook("K")
	Loop, Parse, Mods, |
	{
		Hotkey, % Hotkey_SetName(A_LoopField), Hotkey_Mods
		Hotkey, % A_LoopField " Up", Hotkey_ModsUp
	}
	Loop % 0x15D + 0xFF - 2
		If ((Name := Hotkey_SetName(A_Index)) != "")
			Hotkey, %Name%, Hotkey_View
	Hotkey, IF, Hotkey_Hook("L") && GetKeyState("RButton"`, "P")
	Hotkey, LButton, Hotkey_MouseOrJoy
	Hotkey, IF, Hotkey_Hook("R")
	Hotkey, RButton, Hotkey_MouseOrJoy
	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_MouseOrJoy
	SetFormat, IntegerFast, %S_FormatInteger%
	Hotkey, IF, Hotkey_IsRegControl()
	Hotkey, RButton Up, Hotkey_RButton_Up
	Hotkey, RButton, Hotkey_RButton
	Hotkey, IF
	Return

	Hotkey_RButton:
		Click
	Hotkey_RButton_Up:
		Return
}

Hotkey_SetName(I) {
	Static Names := {Control:1,LControl:1,RControl:1,Alt:1,Shift:1}
	Local Code, Name
	If (I + 0 = "" && Names[i] := 1)
		Return I
	Code := Format((I > 0x15D ? "vk" : "sc") "{:X}", I - (I > 0x15D ? 0x15B : 0))
	If Names[Name := GetKeyName(Code)]
		Return
	Names[Name] := 1
	Return StrLen(Name) = 1 ? Code : Name
} 

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="") {
	Hotkey_Value(Name, Value)
	Return Hotkey_HKToStr(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
}

	; -------------------------------------- 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":"/"}
	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)
		K2 := K2 = "sc35" ? "/" : (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

23

Re: AHK: Конвертирование хоткеев

serzh82saratov
Спасибо, буду тестировать. Была проблема с отображением vk-кодов, я не знаю ошибка или нет.
Было так.

	If InStr("|" K2, "|sc")

Сделал так, заработало.

	If InStr("|" K2, "|vk")

24

Re: AHK: Конвертирование хоткеев

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

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

25

Re: AHK: Конвертирование хоткеев

Вон оно что, а не подскажете таблицу соответствии обычных клавиш к sc?

26

Re: AHK: Конвертирование хоткеев

http://forum.script-coding.com/viewtopi … 43#p105143.
Если под обычными,  вы имеете ввиду непечатные, то их проще задавать по имени, коды для них не требуются.

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

27

Re: AHK: Конвертирование хоткеев

serzh82saratov
Подскажите, вот вы порекомендовали переходить на SC-коды. Допустим для меня это не проблема, а как мне объяснить, что делать друзьям, у которых в конфиг фале VK-коды прописаны. Конечно можно порекомендовать удалить конфиг файл, но это не очень хорошая идея.

28

Re: AHK: Конвертирование хоткеев

Можно будет переделать hktostr,  чтобы вк отображались как символы.
А что с тестированием?

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

29

Re: AHK: Конвертирование хоткеев

serzh82saratov пишет:

А что с тестированием?

Вчера пол дня скрипт постоянно работал (на SC пока не менял) подвиваний не было. Если честно, то сидя в браузере отловить подвисания довольно сложно, в играх лучше заметно. Сегодня день поработает с играми, по возможности без выключения.

30

Re: AHK: Конвертирование хоткеев

serzh82saratov пишет:

Можно будет переделать hktostr,  чтобы вк отображались как символы.

Сделал так. В принципе работает, но есть подозрение, что что-то не так.

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":"/"}
	, EngSym1 := {"vk41":"A","vk42":"B","vk43":"C"
				,"vk44":"D","vk45":"E","vk46":"F","vk47":"G","vk48":"H","vk49":"I","vk4A":"J"
				,"vk4B":"K","vk4C":"L","vk4D":"M","vk4E":"N","vk4F":"O","vk50":"P","vk51":"Q"
				,"vk52":"R","vk53":"S","vk54":"T","vk55":"U","vk56":"V","vk57":"W","vk58":"X"
				,"vk59":"Y","vk5A":"Z"}
	Local K, K1, K2, I, V, M, R
	RegExMatch(HK, "S)^\s*([~\*\$\^\+!#<>]*)\{?(.*?)}?\s*$", K)
	If (K2 = "")
		Return "" Hotkey_Arr("Empty")
	If InStr("|" K2, "|sc")
	If InStr("|" K2, "|vk")
		K2 := K2 = "vkBF" ? "/" : (Hotkey_Arr("OnlyEngSym") && EngSym1.HasKey(K2) ? EngSym1[K2] : Format("{:U}", GetKeyName(K2)))
		K2 := K2 = "sc35" ? "/" : (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)
}

31 (изменено: serzh82saratov, 2016-07-25 20:09:08)

Re: AHK: Конвертирование хоткеев


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

Hotkey_Register(Controls*) {
	Static IsStart
	Local k, v
	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
		h := v[2]
		GuiControl, +r1, %h%
		
	}
	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%
	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_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
}

	; -------------------------------------- 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

32

Re: AHK: Конвертирование хоткеев

Внёс правки.

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

33

Re: AHK: Конвертирование хоткеев

Спасибо большое. Подвисаний, кстати, небыло больше.

34 (изменено: Sgy-x2, 2016-06-28 07:19:29)

Re: AHK: Конвертирование хоткеев

serzh82saratov
Скажите пожалуйста. В вашем скрипте есть возможность выбора какие клавиши будут определены.

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

Возникла необходимость задавать кнопки модификаторы (Shift...) в качестве одиночного хоткея, но это не получается, т.к. требуется ввод обычной кнопки.

35

Re: AHK: Конвертирование хоткеев

Было такое, это опция "S", но я про неё забыл в новой версии, исправил 31 пост.

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

36

Re: AHK: Конвертирование хоткеев

serzh82saratov
Намедни решил поэкспериментировать с комбинациям хоткеев, и выяснился не очень приятный баг. Если использовать длинные хоткеи (Пример Ctrl+Shifh+Alt+Lbutton) и длинна хоткея будет больше поля ввода этого хоткея, то его в последствии невозможно будет изменить. Т.е. в поле ввода хоткея он вбивается, а сохранение не происходит. Так же, при следующем запуске, этот хоткей отображается в две строки. Если увеличить размер поля ввода, и этот хоткей будет помещаться в одну строку, то всё нормально сохраняется. Что это может быть?

37

Re: AHK: Конвертирование хоткеев

Надо в опции элемента добавлять "r1", я пока не нашёл как это делать в библиотеке, то есть не знаю как добавить эту оцию после создания элемента. Думал получится так:

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

38 (изменено: Alectric, 2016-07-02 23:18:27)

Re: AHK: Конвертирование хоткеев

Может "ES_MULTILINE"?...

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

39

Re: AHK: Конвертирование хоткеев

Есть пример кода?

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

40

Re: AHK: Конвертирование хоткеев

serzh82saratov пишет:

Надо в опции элемента добавлять "r1"

Как-то так?

Gui, 2:Add, Edit, r1 w120 hwndhmodkey1 gWriteIni, % Hotkey_HKToStr(modkey1)

41 (изменено: Alectric, 2016-07-03 09:31:35)

Re: AHK: Конвертирование хоткеев

Control,ExStyle,-0x4,,ahk_id %CtrlHWND%

Хотя, нет, не работает...

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

42

Re: AHK: Конвертирование хоткеев

serzh82saratov
А можно сделать параметр, который определял бы только кнопки модификаторы?

43

Re: AHK: Конвертирование хоткеев

serzh82saratov
Совсем запутался, не могу сохранения настроить. Сброс сохраняет, а заданный хоткей не сохраняет. В чем проблема?

modkey1 = !sc28
Gui, Add, Edit, hwndhmodkey1 r1 w222, % Hotkey_Set("modkey1", modkey1)
Gui, Add, Button, , Save
Gui, Add, Button, , Reset
Hotkey_Register(["modkey1",hmodkey1,"KMLRJD"])
Gui, Show
Return

ButtonSave:
	IniWrite, % modkey1, % PathIni, ModKey, modkey1
Return

ButtonReset:
	modkey1 := "sc26"
	Hotkey_Set("modkey1", modkey1)
	Return

44 (изменено: serzh82saratov, 2016-07-26 00:17:08)

Re: AHK: Конвертирование хоткеев

Давайте продолжим разговор касаемый библиотеки в её теме, там как раз про сохранения спрашивали.

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

45 (изменено: Sgy-x2, 2016-07-26 00:21:22)

Re: AHK: Конвертирование хоткеев

Ясно, спасибо. А я ведь пробовал так, только без кавычек.

ButtonSave: 
	Hotkey_IniWrite("modkey1", "ModKey", PathIni)
	Return
serzh82saratov пишет:

Давайте продолжим разговор касаемый библиотеки в её теме, там как раз про сохранения спрашивали.

Хорошо.