0

Как программно измерять параметры нажатия клавиш клавиатуры?

Измерение параметров клавиатурного почерка

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

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

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

Программа измерения параметров нажатия клавиш клавиатуры представляет собой совокупность обработчиков событий KeyDown и KeyUp, которые возникают каждый раз, когда нажимается и отпускается клавиша соответственно. Вопрос заключается в том каким способом измерять время наступления этих событий? После некоторых экспериментов было принято решение использовать функцию Now(). Она измеряет количество секунд, прошедшее с начала суток. Точность измерения достаточно высока.

Вот тексты кода двух обработчиков событий KeyDown и KeyUp с использованием функцию Now() и фиксации моментов нажатия и отпускания клавиш при вводе символов логина.

procedure TFrmObuch.EditLoginKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
mTdn[m]:= Now();
end;

procedure TFrmObuch.EditLoginKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
mTup[m]:= Now();
m:=m+1
end;

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

Аналогичные обработчики событий нажатия клавиши KeyDown и отпускания клавиши KeyUp необходимо создать и для ввода символов пароля. Тексты кода этих обработчиков событий приведены ниже.

procedure TFrmObuch.EditPaswKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
mTdn[m]:= Now();
end;

procedure TFrmObuch.EditPaswKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
mTup[m]:= Now();
m:=m+1
end;

Для проверки правильности работы программы нами была создана отладочная версия. Интерфейс отладочной программы имеет вид.


Интерфейс программы

Текст программы показан ниже. В нем предусмотрено формирование динамических массивов, размерностью числа накопленных данных SetLength(mTpr,m). Вычисления времени удержания и паузы между нажатиями клавиш.

mTpr[i]:=mTup[i]-mTdn[i]; mTpz[i]:=mTdn[i+1]-mTup[i];

Результаты выводятся в компонент StringGrid для визуализации и анализа.

StringGridKlvPoc.Cells[i,1]:=FloatToStr((mTdn[i]-Tbg)*1000);
StringGridKlvPoc.Cells[i,2]:=FloatToStr((mTup[i]-Tbg)*1000);

Полный текст отладочной процедуры имеет вид.
procedure TFrmObuch.ButtonEndClick(Sender: TObject);
var
i: integer;
begin
m:=m-1;
SetLength(mTpr,m);
SetLength(mTpz,m);
for i := 0 to m-1 do
begin
mTpr[i]:=mTup[i]-mTdn[i];
mTpz[i]:=mTdn[i+1]-mTup[i];
end;
StringGridKlvPoc.ColCount:=m;
StringGridKlvPoc.ColWidths[0]:=150;
for i := 1 to m do
begin
StringGridKlvPoc.Cells[i,1]:=FloatToStr((mTdn[i]-Tbg)*1000);
StringGridKlvPoc.Cells[i,2]:=FloatToStr((mTup[i]-Tbg)*1000);
end;
end;

Результат работы программы показан ниже на рисунке.


Результат работы программы

Результаты вполне приемлемы. Быстродействие вполне приличное. Все хорошо, но…

Кто согласен с подходом одобряйте, кто нет, отзывайтесь. Будем рады услышать отзывы!

brasm

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

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