1

Тема: AHK: Посимвольное сравнение исходного и вводимого текстов

Здравствуйте. Помогите, пожалуйста, решить задачу. Собственно задача состоит в том, чтобы проверять правильность посимвольного ввода текста, сравнивая его с исходным и сигнализируя в случае ошибки. Эдакий примитивный клавиатурный тренажёр.

Как я вижу алгоритм? Записываем в массив посимвольно текст (в данном случае – из буфера обмена). Затем начинаем проверку вводимых символов поочерёдно для каждого элемента массива, начиная с первого. Если введённый символ совпадает, то счётчик увеличивается и происходит переход к следующему элементу массива. Если нажат BackSpace, то есть удален уже правильно введённый символ ранее, то происходит возврат к предыдущему элементу массива.

Если же введённый символ не совпадает с требуемым, то срабатывает звуковое оповещение, сигнализируя ошибку, и запускается подцикл, в котором считается количество введённых символов после ошибки и количество нажатий на BackSpace. Когда оно «уравновешивается», то должен происходить возврат в основной цикл. Более сложные варианты исправления ошибок, допустим, через Ctrl+ BackSpace или, тем более, с помощью клавиш управления курсором не рассматриваются, только одиночный забой.

Вот как я пытаюсь реализовать это:

SetBatchLines, -1 

F1::
StringReplace, Clipboard, Clipboard, `r`n, %A_Space%, All
Text := % Clipboard
Letters := []
Loop, parse, Text
	Letters[A_index] := A_LoopField
i := 1
Loop
{
	ToolTip, % Letters[i]
	Input, Key, L1 V, {BS}
		If InStr(ErrorLevel, "EndKey:")
		{
			i := i-1
			Sleep, 10
		}
		else if (Key == Letters[i])
		{
			i := i+1
			Sleep, 10
		}
		else
		{
			SoundPlay, %A_WinDir%\Media\ding.wav
			j := 1
			Sleep, 10
			Loop
			{
				if (j == 0)
					break
				else
				{
				Input, ErrorKey, L1 V, {BS}
					If InStr(ErrorLevel, "EndKey:")
					{
						j := j-1
						Sleep, 10
					}
					else 
					{
						SoundPlay, %A_WinDir%\Media\ding.wav
						j := j+1
						Sleep, 10
					}

				}

			}
		}			
}
return
 

Если вводить текст сравнительно медленно, то скрипт вроде бы справляется со своей задачей: правильно определяет соответствие вводимого и требуемого символов, корректно отсчитывает нажатия BackSpace. Но как только увеличивается скорость ввода – происходит сбой работы. Причём заметил, что проблема в работе скрипта есть двух типов (возможно, имеющих одну причину).

Первая – при правильном вводе слова не успевает фиксироваться введённый символ. Соответственно, при быстром наборе идёт оповещение, что в слове «привет» ошибка, допустим, на «и», хотя буква «и» точно была набрана правильно. Клавиатура с NKRO, поэтому вариант с перестановкой букв тоже как бы исключается.

Вторая проблема  – когда совершается ошибка (то есть введенный символ не соответствует требуемому), после этого по инерции вводится энное количество символов, которые требуется удалить, чтобы исправить ошибку. Так вот, при удалении всех последующих символов после ошибки и собственно самого ошибочного символа и возврате как бы в начальную точку происходит неверный подсчёт количества введённых после ошибки символов и количества нажатий  BackSpace (нажатий BackSpace всегда меньше получается почему-то). Следовательно,  символ исходного текста, который показывается в ToolTip,  после всей этой процедуры – некорректный.

Например, если в том же слове «привет» ошибиться и напечатать какое-нибудь «пртвет», а среагировать поздно, то при забое четырёх «неправильных» символов и возврате до «пр» вроде бы следующий символ для ввода – «и», но скрипт может показывать, что «р», или «п».

Влияет на правильность считывания количества нажатых клавиш скорость повтора вводимого символа? У меня по умолчанию в Windows стоит максимальная скорость повтора, а задержка перед началом повтора вводимого символа – короче. Чаще всего зажимаю именно BackSpace, если требуется удалить с конца не один-два символа. Пробовал уменьшать скорость повтора и увеличивать задержу перед началом повтора – тоже сбои. Да и не хотелось бы именно эти параметры изменять.

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

2

Re: AHK: Посимвольное сравнение исходного и вводимого текстов

Задача выделить и скопировать в буфер требуемый текст, затем проверить его через AHK по горячей клавише?

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

3

Re: AHK: Посимвольное сравнение исходного и вводимого текстов

__Михаил__ пишет:

Задача выделить и скопировать в буфер требуемый текст, затем проверить его через AHK по горячей клавише?

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