Как использовать клавиатуру в качестве клавиатуры Брайля в Delphi?

Я пытался работать над событиями onKeyDown а также onKeyUp, Программа отлично работает, когда нажаты только две клавиши.

Для комбинаций из более чем 2 клавиш, если 2 клавиши уже нажаты (и поэтому они нажаты), нажатие другой клавиши не фиксируется, и поэтому комбинация FGH рассматривается как FG, соответствующая другому символу Брайля.

Кроме того, когда 3 или более клавиш нажаты вместе, числа onKeyDown пойманные события не всегда одинаковы.

3 ответа

Вы можете ожидать неприятностей с дешевыми клавиатурами! Здесь у вас есть простая тестовая программа для тестирования вашей клавиатуры. (Не забудьте определить формы OnKeyDown и OnKeyUp.)

type
  TForm8 = class(TForm)
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form8: TForm8;

implementation

{$R *.dfm}

procedure TForm8.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  State   :TKeyboardState;
  n       :integer;
  s       :string;
begin
  GetKeyboardState(State);
  s := '';
  for n := Low(byte) to High(byte) do
    if State[n] and 128 <> 0 then
      s := s + 'VK(' + IntToStr(n) + ') ';
  Caption :=  s;
end;

procedure TForm8.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  State   :TKeyboardState;
  n       :integer;
  s       :string;
begin
  GetKeyboardState(State);
  s := '';
  for n := Low(byte) to High(byte) do
    if State[n] and 128 <> 0 then
      s := s + 'VK(' + IntToStr(n) + ') ';
  Caption :=  s;
end;

end.

С GetKeyboardState вы можете получить полный массив состояния каждого ключа. Чтобы поймать несколько нажатий клавиш, таких как символы Брайля, вы должны вызывать его в высокой последовательности, например, из TTimer с очень маленьким интервалом или из класса, унаследованного от TThread. Также есть вероятность, что при нажатии двух или более кнопок нажатие не будет регистрироваться на всех клавишах в одно и то же время, поэтому вам придется отслеживать и выбирать только те комбинации, которые соответствуют критерию, например, существовавший ранее. длинный.

Используйте GetAsyncKeyState. Он не только возвращает текущее состояние клавиш, но и то, была ли клавиша нажата с момента последнего вызова. Существует ограничение на количество клавиш, которые могут быть нажаты одновременно. Я думаю, что ограничение составляет около 8 ключей, но оно может отличаться в зависимости от аппаратного обеспечения, драйверов и версии ОС.

Другие вопросы по тегам