1

Тема: 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"]

Надеюсь не нарушил никаких правил, разделом, вроде, не ошибся.

2

Re: AHK: Замена хоткеев на сокращения для CAD программ

Madmer пишет:

Скрипт позволяет, вместо использования хоткеев для выбора инструментов в CAD системах, набирать на клавиатуре сокращенные слова, которые будут выполнять роль хоткеев.

А hotstrings для этого не подойдут?

:*:ОКР:: ; русская раскладка
   MsgBox, Вы набрали ОКР
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Замена хоткеев на сокращения для CAD программ

teadrinker, нет, т.к., во-первых, возможен вариант, что пользователь опечатается, начнёт набирать другой хоткей, но, пока набирает, ему засчитает совершенно другой. Во-вторых, если будет 2 слова, О, и ОКР, то при наборе ОКР сработает О, чего быть не должно.

4

Re: AHK: Замена хоткеев на сокращения для CAD программ

Он у вас в постоянном цикле проверяет все клавиши?

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