Представьте себе такую ситуацию: глупый пользователь включает тачку, а тут... светомузыка, индикаторы состояния клавиш то включатся, то погаснут... а если ещё каждую секунду проходит 500 тактов!!! Шутка, конечно злостная, но воспроизводится весьма легко.

 

Всё основывается на следующем коде:

 

Code:

SelectNext(screen.ActiveControl, True, True);

 

Разместите приведенный код в обработчике одного из собитий. SelectNext - защищенный метод TWinControl со следующим прототипом:

  Как-то бухгалтер, который пользовался моей программой, заявил, что ему не удобно перескакивать пустые поля в форме кнопкой Tab, и что намного удобнее это делать обычным Enter-ом. Предлагаю посмотреть, как я решил эту проблемму.

 Совместимость: Все версии Delphi. Автор: Khaled Shagrouni

 Пример обработчика события:

Code:

procedure TForm1.Button1Click(Sender: TObject);

begin

if GetKeyState(VK_SHIFT) < 0 then

   ShowMessage('Кнопка Shift нажата')

else

   ShowMessage('Обычное нажатие кнопки');

end;

 

Получаем символ, соответствующий виртуальной клавише:

Code:

function GetCharFromVKey(vkey: Word): string;

var

keystate: TKeyboardState;

retcode: Integer;

begin

Win32Check(GetKeyboardState(keystate));

SetLength(Result, 2);

retcode := ToAscii(vkey,

   MapVirtualKey(vkey, 0),

   keystate, @Result[1],

   0);

case retcode of

   0: Result := '';

   1: SetLength(Result, 1);

   2: ;

   else

     Result := '';

end;

end;

 

{

Использование:

procedure TForm1.Edit1KeyDown

(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

ShowMessage(GetCharFromVKey(Key));

end;

}

 

В примере для глобального перехвата нажатия клавиши print screen регистрируется горячая клавиша (hot key).

В приведенном примере показано как определить нажата ли клавиша Shift при выборе строчки меню. Пример также содержит функции проверки состояния клавиш Alt, Ctrl.

 

 

Code:

var

i : integer;

begin

i := 0;

{запрещаем Ctrl-Alt-Del}

SystemParametersInfo( SPI_SCREENSAVERRUNNING, 1, @i, 0);

end.

// необходим unit WinProcs

// для Alt-Tab: SPI_SETFASTTASKSWITCH

 

В событиях, обрабатывающих нажатия клавишь в TForm, клавиша PrintScreen не обрабатывается. Однако проблему можно решить при помощи 'GetAsyncKeyState'. Функция GetAsyncKeyState определяет, когда клавиша была нажата или отпущена каждый раз, когда функция вызвана, а так же, когда клавиша была нажата после предыдущего вызова GetAsyncKeyState.

 Событие OnIdle в TApplication как раз подходит для вызова этой API функции:

Для этого необходимо написать процедуру-обработчик для Application.OnMessage:

 

Следующий пример демонстрирует проверку состояния клавиши Shift (нажата она или нет), в то время когда выделен пункт меню. А так же в примере содержатся функции, позволяющие определить состояние клавишь Alt, Ctrl, и shift: