Code:

unit Unit1;

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs;

 

type

TForm1 = class(TForm)

   procedure FormCreate(Sender: TObject);

private

   { Private declarations }

   procedure AppIdle(Sender: TObject; var Done: Boolean);

public

   { Public declarations }

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean);

begin

if GetAsyncKeyState(VK_SNAPSHOT) <> 0 then

   Form1.Caption := 'PrintScreen ia?aoa !';

Done := True;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

Application.OnIdle := AppIdle;

end;

end.

Code:

// используемые переменные

var

Dummy: integer = 0;

OldKbHook: HHook = 0;

 

implementation

 

function KbHook(code: Integer; wparam: Word; lparam: LongInt): LongInt; stdcall;

begin

if code < 0 then

   Result := CallNextHookEx(oldKbHook, code, wparam, lparam)

else

   Result := 1;

end;

 

// включение клавы

 

procedure TForm1.KeyBoardOn(Sender: TObject);

begin

if OldKbHook <> 0 then

begin

   UnHookWindowshookEx(OldKbHook);

   OldKbHook := 0;

end;

SystemParametersInfo(SPI_SETFASTTASKSWITCH, 0, 0, 0);

SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, 0, 0);

end;

 

// выключение клавы

 

procedure TForm1.KeyBoardOff(Sender: TObject);

begin

SystemParametersInfo(SPI_SETFASTTASKSWITCH, 1, @Dummy, 0);

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

OldKbHook := SetWindowsHookEx(WH_KEYBOARD, @KbHook, HInstance, 0);

end;

  

Code:

procedure TForm1.Button1Click(Sender: TObject);

begin

if GetKeyState(VK_SHIFT) < 0 then

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

else

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

end;

 

 

Как сделать так, чтобы при минимизации приложения в Tray его можно было вызвать определённой комбинацией клавиш, например Alt-Shift-F9 ?

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

 

Я хотел бы обнаружить более 2 клавиш, нажимая в форме.  Например, я хотел бы знать, если пользователь нажал время. В onkeydown должны, кажется, только чек на одну или две клавиши максимум, но верном  вы можете определить, какие клавиши нажаты.

 

Code:

var

i : integer;

begin

i := 0;

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

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

end.

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

// для Alt-Tab: SPI_SETFASTTASKSWITCH

 

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

 

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

 

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

Code:

SelectNext(screen.ActiveControl, True, True);

 

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

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

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

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