Тема: AHK: Замена хоткеев на сокращения для CAD программ
Здравствуйте, делал один заказ и решил поделиться кодом, т.к. посчитал его очень уж полезным для проектировщиков, заказчик не против опенсурса.
Скрипт позволяет, вместо использования хоткеев для выбора инструментов в CAD системах, набирать на клавиатуре сокращенные слова, которые будут выполнять роль хоткеев.
Подобная система встроена в autocad, но там она реализована в виде консоли, данный скрипт напоминает работу читов из игр GTA.
В файле conf.ini настраивается задержка между нажатиями клавиш(delay) в миллисекундах. maxSymbolsInPsevdonim указывает максимальное количество символов в сокращении, по умолчанию 3. То есть, если установлено 3, то ключевые слова могут быть такими: ОКР, О, ПЛ, ПЛЛ, Б, и т.д., но не могут быть такими: ПЛЛЛ, ВРПН, ООООООО, то есть, больше 3 символов в слове.
conf.ini
Файл настроек скрипта
[timers]
delay=500
[settings]
maxSymbolsInPsevdonim=3
Главный файл
#Include Psevdo_To_Hotkeys.ahk
#Include Vk_To_Symbol.ahk
#IfWinActive ahk_exe Allplan_2015.exe ; Заменить для соответствующей программы
psevdonim := ""
;main()
;{
Loop
{
for index, element in VkToSym
{
KeyWaiting(0, index)
}
Sleep, 50
}
;return
;}
;-------------------------------------------------------------------
;Функции
;-------------------------------------------------------------------
NextSymbol(counter)
{
IniRead, maxSymbolsInPsevdonim, conf.ini, settings, maxSymbolsInPsevdonim
IniRead, delay, conf.ini, timers, delay
global psevdonim
global VkToSym
maxLoops := delay / 50
currentLoops := 0
Sleep, 80
if (counter < maxSymbolsInPsevdonim)
{
while (currentLoops < maxLoops)
{
for index, element in VkToSym
{
KeyWaiting(counter, index)
}
Sleep, 50
currentLoops += 1
}
Sleep, 50
SendHotkey()
}
else
{
Sleep, 50
SendHotkey()
}
return
}
KeyWaiting(counter, index)
{
global psevdonim
global VkToSym
if (GetKeyState(VkToSym[index][1] , "P"))
{
counter += 1
psevdonim := psevdonim VkToSym[index][2]
NextSymbol(counter)
}
return
}
;Перевод псевдонима в хоткей
SendHotkey()
{
SetTimer, SendHotkey, Delete
global psevdonim
global PsevdoToHotkeys
targetSpecHotkey := ""
secondTargetSpecHotkey := ""
targetHotkey := ""
for index, element in PsevdoToHotkeys
{
if (psevdonim = PsevdoToHotkeys[index][1])
{
targetSpecHotkey := % PsevdoToHotkeys[index][2]
secondTargetSpecHotkey := % PsevdoToHotkeys[index][3]
targetHotkey := % PsevdoToHotkeys[index][4]
break
}
}
if ((targetSpecHotkey != "") || (targetHotkey != ""))
{
if (secondTargetSpecHotkey != "")
{
Send, {%targetSpecHotkey% Down}{%secondTargetSpecHotkey% Down}
Send, {%targetHotkey%}
Send, {%secondTargetSpecHotkey% Up}{%targetSpecHotkey% Up}
}
else
{
Send, {%targetSpecHotkey% Down}{%targetHotkey%}{%targetSpecHotkey% Up}
;MsgBox, %psevdonim%
}
}
Reset()
}
;Сброс параметров
Reset()
{
global psevdonim := ""
}
;-------------------------------------------------------------------
;Метки
;-------------------------------------------------------------------
;Кнопка паузы
NumpadMult::
Pause, toggle
return
;Кнопка экстренного завершения скрипта
NumpadAdd::
ExitApp
return
Файл Psevdo_To_Hotkeys.ahk
В данном файле находятся сами ключевые слова, а также хоткеи, которые они имитируют. У вложенных массивов первый индекс это само ключевое слово, второй индекс это первая клавиша хоткея, которая будет зажата, третий индекс это вторая клавиша, которая будет зажата, четвёртый индекс это клавиша, которая будет нажата. Например, в самом первом элементе массива при нажатии на клавиатуре клавиши Б, будет сымитировано нажатие Alt+Q. Третий элемент массива(индекс) можно оставить пустым. Надеюсь алгоритм добавления интуитивно понятен. Использовать именно скан коды не обязательно, виртуальные тоже подойдут.
PsevdoToHotkeys := []
;--------------------------------------------------
;Архитектура REGION BEGIN
;--------------------------------------------------
PsevdoToHotkeys[1] := ["Б", "Alt", "", "sc10"]
PsevdoToHotkeys[2] := ["Д", "Alt", "", "sc11"]
PsevdoToHotkeys[3] := ["КН", "Alt", "", "sc12"]
PsevdoToHotkeys[4] := ["КВ", "Alt", "", "sc13"]
PsevdoToHotkeys[5] := ["ОГ", "Alt", "", "sc14"]
PsevdoToHotkeys[6] := ["О", "Alt", "", "sc15"]
PsevdoToHotkeys[7] := ["ОУ", "Alt", "", "sc16"]
PsevdoToHotkeys[8] := ["ПЧ", "Alt", "", "sc17"]
PsevdoToHotkeys[9] := ["ПЛ", "Alt", "", "sc18"]
PsevdoToHotkeys[10] := ["ПЛК", "Alt", "", "sc19"]
PsevdoToHotkeys[11] := ["ПЛП", "Alt", "", "sc1E"]
PsevdoToHotkeys[12] := ["ПМ", "Alt", "", "sc1F"]
PsevdoToHotkeys[13] := ["СТ", "Alt", "", "sc20"]
PsevdoToHotkeys[14] := ["СТП", "Alt", "", "sc21"]
PsevdoToHotkeys[15] := ["ФС", "Alt", "", "sc22"]
;--------------------------------------------------
;Архитектура REGION END
;--------------------------------------------------
;--------------------------------------------------
;Вид REGION BEGIN
;--------------------------------------------------
PsevdoToHotkeys[16] := ["1", "Ctrl", "", "sc2"]
PsevdoToHotkeys[17] := ["2", "Ctrl", "", "sc3"]
PsevdoToHotkeys[18] := ["3", "Ctrl", "", "sc4"]
PsevdoToHotkeys[19] := ["4", "Ctrl", "", "sc5"]
PsevdoToHotkeys[20] := ["5", "Ctrl", "", "sc6"]
PsevdoToHotkeys[21] := ["6", "Ctrl", "", "sc7"]
PsevdoToHotkeys[22] := ["7", "Ctrl", "", "sc8"]
PsevdoToHotkeys[23] := ["8", "Ctrl", "", "sc9"]
PsevdoToHotkeys[24] := ["9", "Ctrl", "", "scA"]
PsevdoToHotkeys[25] := ["0", "Ctrl", "", "scB"]
;--------------------------------------------------
;Вид REGION END
;--------------------------------------------------
;--------------------------------------------------
;Редактирование REGION BEGIN
;--------------------------------------------------
PsevdoToHotkeys[26] := ["П", "Shift", "", "sc2"]
PsevdoToHotkeys[27] := ["К", "Shift", "", "sc3"]
PsevdoToHotkeys[28] := ["З", "Shift", "", "sc4"]
PsevdoToHotkeys[29] := ["ПВ", "Shift", "", "sc5"]
PsevdoToHotkeys[30] := ["ИТ", "Shift", "", "sc6"]
PsevdoToHotkeys[31] := ["ИФ", "Shift", "", "sc7"]
;--------------------------------------------------
;Редактирование REGION END
;--------------------------------------------------
;--------------------------------------------------
;Черчение REGION BEGIN
;--------------------------------------------------
PsevdoToHotkeys[32] := ["Л", "Shift", "", "sc10"]
PsevdoToHotkeys[33] := ["ЛЛ", "Shift", "", "sc11"]
PsevdoToHotkeys[34] := ["ОК", "Shift", "", "sc12"]
PsevdoToHotkeys[35] := ["ОО", "Shift", "", "sc13"]
PsevdoToHotkeys[36] := ["ПР", "Shift", "", "sc14"]
PsevdoToHotkeys[37] := ["СЛЛ", "Shift", "", "sc15"]
PsevdoToHotkeys[38] := ["ТТ", "Shift", "", "sc1E"]
PsevdoToHotkeys[39] := ["ТЧ", "Shift", "", "sc16"]
PsevdoToHotkeys[40] := ["УЗ", "Shift", "", "sc17"]
PsevdoToHotkeys[41] := ["ШТ", "Shift", "", "sc18"]
PsevdoToHotkeys[42] := ["ЭЛ", "Shift", "", "sc19"]
;--------------------------------------------------
;Черчение REGION END
;--------------------------------------------------
;--------------------------------------------------
;Управление REGION BEGIN
;--------------------------------------------------
PsevdoToHotkeys[43] := ["Н", "Ctrl", "Shift", "sc10"]
PsevdoToHotkeys[44] := ["НПИ", "Ctrl", "Shift", "sc11"]
PsevdoToHotkeys[45] := ["ОП", "Ctrl", "Shift", "sc12"]
PsevdoToHotkeys[46] := ["ОЖ", "Ctrl", "Shift", "sc13"]
;--------------------------------------------------
;Управление REGION END
;--------------------------------------------------
Файл Vk_To_Symbol.ahk
Данный файл нужен, чтобы скрипт распознавал символы, которые содержатся в ключевых словах. Надеюсь алгоритм добавления интуитивно понятен. Использовать именно виртуальные коды не обязательно, скан коды тоже подойдут.
VkToSym := []
VkToSym[1] := ["vk47", "П"]
VkToSym[2] := ["vk4B", "Л"]
VkToSym[3] := ["vk52", "К"]
VkToSym[4] := ["vkBC", "Б"]
VkToSym[5] := ["vk4C", "Д"]
VkToSym[6] := ["vk59", "Н"]
VkToSym[7] := ["vk44", "В"]
VkToSym[8] := ["vk4A", "О"]
VkToSym[9] := ["vk55", "Г"]
VkToSym[10] := ["vk45", "У"]
VkToSym[11] := ["vk58", "Ч"]
VkToSym[12] := ["vk56", "М"]
VkToSym[13] := ["vk43", "С"]
VkToSym[14] := ["vk4E", "Т"]
VkToSym[15] := ["vk41", "Ф"]
VkToSym[16] := ["vk50", "З"]
VkToSym[17] := ["vk42", "И"]
VkToSym[18] := ["vkBA", "Ж"]
VkToSym[19] := ["vk49", "Ш"]
VkToSym[20] := ["vkDE", "Э"]
VkToSym[21] := ["vk30", "0"]
VkToSym[22] := ["vk31", "1"]
VkToSym[23] := ["vk32", "2"]
VkToSym[24] := ["vk33", "3"]
VkToSym[25] := ["vk34", "4"]
VkToSym[26] := ["vk35", "5"]
VkToSym[27] := ["vk36", "6"]
VkToSym[28] := ["vk37", "7"]
VkToSym[29] := ["vk38", "8"]
VkToSym[30] := ["vk39", "9"]
Надеюсь не нарушил никаких правил, разделом, вроде, не ошибся.