Delphi中的OnKeyDown问题

时间:2010-08-06 09:51:37

标签: delphi case keydown

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

1 个答案:

答案 0 :(得分: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事件处理程序中有效)是检查是否ssShift in Shift,其中Shift是该事件的参数处理函数。

(顺便说一句,因为大写锁定开启的动作被Shift键抵消了(也就是说,当大写锁定开启时按Shift + A,“a”插入),测试大写时使用的检查

IsKeyOn(VK_CAPITAL) xor IsKeyDown(VK_SHIFT)

使用xor运算符。)