我可以捕获Capslock / Shift键吗?

时间:2010-08-13 08:54:45

标签: delphi keyboard

我刚刚发现大写锁定和shift键(可能还有一些键)会影响连接到计算机的所有键盘。 (测试我编码的程序的危险之一,我只有两只手所以我花了很长时间才意识到这样的问题) 因此分离击键很好,但是移位/大写锁定会让一切都变得疯狂(当一个用户转为大写时,所有用户的输入也会被大写)

我可以在FormKeyPress中捕获Capslock和Shift按键吗? 其他任何地方的事情?
我可以保存Shift键吗? (所以我可以正确地将'shift'应用到相应的用户输入)

欢迎任何其他解决此问题的建议。

3 个答案:

答案 0 :(得分:7)

检查换档是否已关闭试试这个:

if GetKeyState(VK_SHIFT)<0 //tests if shiftkey is down
 then ShowMessage('shift key is down'');

并检测是否已启用大写锁定尝试此操作:

if Odd(GetKeyState(VK_CAPITAL)) //tests if caps lock is on
then showmessage('caps lock is on');

如果你想检查shift和capslock的状态:

      if Odd(GetKeyState(VK_CAPITAL)) then 
            if GetKeyState(VK_SHIFT)<0 then 
            showmessage('capslock is on and shift key is down too')
           else
          showmessage('capslock is on but shift key is NOT down');

getkeystate是一个windows api函数,你可以阅读更多关于它的here

答案 1 :(得分:2)

您可以在OnKeyDown事件

中捕获它们
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_SHIFT then
    ShowMessage('Shift Pressed');

  if Key = VK_CAPITAL then
    ShowMessage('Caps Lock Pressed');
end;

答案 2 :(得分:1)

if Key = VK_SHIFT then
  ShowMessage('Shift Pressed');

应该有:

if shift = [ssShift] then ... 

程序测试Shift: TShiftState按住SHIFT键, 不是key :word;检查其他序数字符

它对CAPSLOCK不起作用 - 我找不到代码。 只有:ssShiftssAltssCtrlssLeftssRightssMiddlessDouble,所以它似乎有在这种情况下使用:

if Odd(GetKeyState(VK_CAPITAL)) then ...
相关问题