2

我正在与德尔福合作。我想跟踪按下了哪个键。我正在使用 TForm 的 KeyDown 事件。它工作正常,但问题是,如果我按小写字母,虽然它给了我那个字母的大写字母。如何识别按下的键是小写还是大写?

4

1 回答 1

14

如果要跟踪字母数字键,则应使用KeyPress. 尝试这个:

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  ShowMessage(Key);
end;

问题KeyDown在于它响应按下的键,当然,如果你想在键盘上输入“K”或“k”,你按下同一个按钮,对吧?所以如果你想坚持KeyDown,那么你需要单独检查Caps Lock键是否打开,或者Shift键是否被按下。要测试切换键(例如 Caps Lock)是否打开,或者是否按下常规键,您可以使用

function IsKeyDown(const VK: integer): boolean;
begin
  IsKeyDown := GetKeyState(VK) and $8000 <> 0;
end;

function IsKeyOn(const VK: Integer): boolean;
begin
  IsKeyOn := GetKeyState(VK) and 1 = 1;
end;

要检查 Caps Lock 键是否打开,请使用IsKeyOn(VK_CAPITAL)。要检查是否按下了 shift 键,请使用IsKeyDown(VK_SHIFT)

检查 shift 键是否被按下的另一种方法(仅在OnKeyDown事件处理程序中有效)是检查 if ssShift in Shift,其中Shift是该事件处理程序函数的参数。

(顺便说一下,因为大写锁定的动作被Shift键抵消了(也就是说,如果你在大写锁定打开时按下Shift+A,就会插入一个“a”),测试时要使用的检查首都是

IsKeyOn(VK_CAPITAL) xor IsKeyDown(VK_SHIFT)

使用 xor 运算符。)

于 2010-08-06T09:59:15.337 回答