0

Как учесть переключение регистра при обработке событий от клавиатуры?

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

Предыдущая статья описывает программу измерения времени удержания и времени паузы между отпусканием одной клавиши и нажатием другой, которая работает только на одном, заранее выбранном регистре. Известно, что для переключения регистра используется клавиша Shift, для которой также появляются события KeyDown и KeyUp.

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

Проведем эксперимент для существующей программы, когда будет нажата клавиша Shift затем клавиша с первой буквой будет нажата и отпущена и далее отпущена клавиша Shift.

Просмотрев фиксируемые в обработчиках событий измерения в отладчике, имеем следующую картину, как показано на  рисунках.


Результаты вычисления времени удержания и времени паузы

Из рисунка видно, второе значение времени удержания клавиши и первое значение времени паузы между нажатиями сильно искажены. Это обусловлено тем, что второй элемент массива mTdn – соответствующий нажатию первой буквы — равен нулю. Тогда время удержания, вычисляемое по известной формуле будет равно(с учетом перевода в микросекунды) очень большим:
Tpr= mTup[1] — mTdn[1] =(43715,399844-0)Е6 = 4,372Е11

Аналогично для времени паузы между нажатиями клавиш. Tps= mTdn[2] — mTup[1] =( 0-43715,399844)Е6 = -4,372Е11

Этот феномен объясняется тем, что фиксируется время не каждой нажатой и отпущенной клавиши, а время двух последовательно следуемых одинаковых события(нажата клавиша Shift и нажата следующая буква) и других двух последовательно следуемых одинаковых события(отпущена клавиша буквы и отпущена клавиша Shift), что нарушает синхронность фиксации времени отдельной клавиши. На следующем рисунке видно, что при нажатии клавиши Shift одноименные обработчики событий вызываются дважды(зеленый фон), вместо одного раза. То есть обработка события осуществляется не корректно.


Феномен не синхронного вызова обработчиков

Для исключения искажений в измерениях можно перехватывать нажатие клавиши Shift и выходить из обработчика события. Это можно сделать дополнив код обработчика события следующим оператором if (Key=VK_SHIFT) then exit;

Проверим на практике. Снова выполним тот же эксперимент и зафиксируем результаты обработки события.


Результаты вычисления времени удержания и времени паузы

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

Если увидели не точности, прошу прокомментировать.

brasm

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *