Могу ли я захватить нажатия клавиш Capslock / Shift?


Я только что обнаружил, что caps lock и shift (и, вероятно, еще несколько клавиш) влияют на все клавиатуры, подключенные к компьютеру. (одна из опасностей тестирования программы, которую я закодировал, у меня только две руки, поэтому мне потребовались годы, чтобы понять такую проблему) Таким образом, разделение нажатий клавиш прекрасно, но блокировка shift / caps сводит все с ума (когда один пользователь переходит к капитализации, все вводимые пользователем данные в этот момент также капитализируются)

Могу ли я захватить Capslock а сдвиг нажатия клавиш в FormKeyPress? В любом другом месте, если уж на то пошло?
Можно ли сохранить нажатие клавиши Shift? (таким образом, я могу правильно применить "сдвиг" к соответствующему пользовательскому вводу)

Любое другое предложение по решению этой проблемы также приветствуется.

3   4   2010-08-13 12:54:44

3 ответа:

Чтобы проверить, если сдвиг Лея вниз попробуйте следующее:

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

И чтобы определить, включен ли caps lock, попробуйте сделать следующее:

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, вы можете прочитать об этом подробнее здесь

Вы можете захватить их в 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;
if Key = VK_SHIFT then
  ShowMessage('Shift Pressed');

Должно было быть:

if shift = [ssShift] then ... 

Программа проверяет Shift: TShiftState удержание клавиши SHIFT, не key :word; проверяется на наличие других порядковых знаков

Это не работает для CAPSLOCK - я не смог найти код. Есть только: ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble, так что, похоже, придется использовать в этом случае:
if Odd(GetKeyState(VK_CAPITAL)) then ...