如何在Delphi中使用键盘作为盲文键盘?

时间:2012-11-17 19:39:30

标签: delphi keyboard-events braille

我尝试过处理事件onKeyDownonKeyUp。当只按下两个键时,程序可以正常工作。

对于超过2个键的组合,如果已经按下了2个键(并且它们已经按下),则不会捕获另一个键的压力,因此组合FGH被视为对应于不同盲文符号的FG。

此外,当按下3个或更多个键时,捕获的onKeyDown个事件的数量并不总是相同。

3 个答案:

答案 0 :(得分:0)

使用GetKeyboardState,您可以检索每个键的完整状态。要捕获像盲文符号这样的多个按键,你必须以高序列调用它,例如来自具有非常小的间隔的TTimer,或者从继承自TThread的类。也有可能有两个或更多按钮被按下,按键不会在同一时间在所有按键上注册,所以你必须保持跟踪并且只采取符合标准的组合,例如存在的最长的。

答案 1 :(得分:0)

使用GetAsyncKeyState。 它不仅返回键的当前状态,还返回自上次调用以来是否按下了键。可以同时按下的键数量有限制。我认为该限制大约是8个密钥,但它可能在硬件,驱动程序和操作系统版本之间有所不同。

答案 2 :(得分:0)

你可以期待一些廉价键盘的麻烦! 在这里,您有一个简单的测试程序来测试键盘。 (不要忘记定义表单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.