我尝试处理事件onKeyDown
和onKeyUp
. 当只按下两个键时,该程序可以完美运行。
对于超过 2 个键的组合,如果 2 个键已经被按下(因此它们被按下),则不会捕捉到另一个键的压力,因此组合 FGH 被视为对应于不同盲文符号的 FG。
此外,当同时按下 3 个或更多键时,onKeyDown
捕获的事件数量并不总是相同。
我尝试处理事件onKeyDown
和onKeyUp
. 当只按下两个键时,该程序可以完美运行。
对于超过 2 个键的组合,如果 2 个键已经被按下(因此它们被按下),则不会捕捉到另一个键的压力,因此组合 FGH 被视为对应于不同盲文符号的 FG。
此外,当同时按下 3 个或更多键时,onKeyDown
捕获的事件数量并不总是相同。
廉价键盘可能会带来一些麻烦!在这里,您有一个简单的测试程序来测试您的键盘。(不要忘记定义表单 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.
使用GetAsyncKeyState。它不仅返回键的当前状态,还返回自上次调用以来是否按下了键。可以同时按下的键的数量是有限制的。我认为这个限制大约是 8 个键,但硬件、驱动程序和操作系统版本之间可能会有所不同。
使用GetKeyboardState,您可以检索每个键的状态的完整数组。要捕获像盲文符号这样的多个按键,您必须以高序列调用它,例如从具有非常小的 Interval 的 TTimer 或从 TThread 继承的类中调用它。也有机会按下两个或更多按钮,按键不会同时在所有键上注册,因此您必须跟踪并仅采用符合标准的组合,例如存在最长。