Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Delphi. Π’Ρ€ΡŽΠΊΠΈ ΠΈ эффСкты». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 15

Автор Π’Π°Π»Π΅Ρ€ΠΈΠΉ Борисок

3.2. ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°

ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° являСтся основным срСдством для Π²Π²ΠΎΠ΄Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€, поэтому Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ стороной ΠΈ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Ρ‚Π°ΠΊ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΠ»ΠΈ Π½Π΅ Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ возмоТности Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π΅ΠΉ.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅

НачнСм с нСбольшого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ (листинг 3.16). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ основан Π½Π° использовании API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetKeyboardType.

...

Листинг 3.16.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅

procedure TForm1.FormCreate(Sender: TObject);

begin

//ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ Ρ‚ΠΈΠΏ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

case GetKeyboardType(0) of

1: txtType.Text := \'PC/XT ΠΈΠ»ΠΈ совмСстимая (83 клавиши)\

2: txtType.Text := \'Olivetti «ICO» (102 клавиши)\

3: txtType.Text := \'PC/AT (84 клавиши) ΠΈΠ»ΠΈ похоТая\

4: txtType.Text := \'Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ (101 ΠΈΠ»ΠΈ 102 клавиши)\

5: txtType.Text := \'Nokia 1050 ΠΈΠ»ΠΈ похоТая\

6: txtType.Text := \'Nokia 9140 ΠΈΠ»ΠΈ похоТая\

7: txtType.Text := \'японская\

end;

//ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΊΠΎΠ΄ Ρ‚ΠΈΠΏΠ° производитСля

txtSubtype.Text := IntToStr(GetKeyboardType(1));

//ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ количСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… клавиш

txtKeys.Text := IntToStr(GetKeyboardType(2));

end;

ΠŸΡ€ΠΈ создании Ρ„ΠΎΡ€ΠΌΡ‹ происходит Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ тСкстовых ΠΏΠΎΠ»Π΅ΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Ρ‚ΠΈΠΏΠ΅ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, ΠΊΠΎΠ΄Π΅ Ρ‚ΠΈΠΏΠ°, присвоСнном ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ, ΠΈ количСствС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… клавиш.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° опрСдСлСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ приводится Π½Π° рис. 3.2.

Рис. 3.2. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅

ΠžΠΏΡ€ΠΎΡ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

БущСствуСт достаточно удобная Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ событий ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ состояниС сразу Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… клавиш.

Π’ листингС 3.17 приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° события TimerlTimer, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π³ΠΎ, Π½Π°ΠΆΠ°Ρ‚Ρ‹ Π»ΠΈ клавиши ↑, β†“, ←, β†’, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π΅Π», Enter, Ctrl (ΠΏΡ€Π°Π²Ρ‹ΠΉ) ΠΈ Alt (ΠΏΡ€Π°Π²Ρ‹ΠΉ).

...

Листинг 3.17.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ состояния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… клавиш

procedure TForm1.Timer1Timer(Sender: TObject);

var

buttons: TKeyBoardstate;

begin

//ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ состояния клавиш

GetKeyboardState(buttons);

//ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠΌ состояния клавиш

//..ΠΏΡ€ΠΎΠ±Π΅Π»

if buttons[VK_SPACE] and 128 <> 0 then

SendMessage(cmbSpace.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbSpace.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..enter

if buttons[VK_RETURN] and 128 <> 0 then

SendMessage(cmbEnter.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbEnter.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..ΠΏΡ€Π°Π²Ρ‹ΠΉ Ctrl

if buttons[VK_RCONTROL] and 128 <> 0 then

SendMessage(cmbRCtrl.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbRCtrl.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..ΠΏΡ€Π°Π²Ρ‹ΠΉ Alt

if buttons[VK_RMENU] and 128 <> 0 then

SendMessage(cmbRAlt.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbRAlt.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..ΠΏΡ€Π°Π²Ρ‹ΠΉ Shift

if buttons[VK_RSHIFT] and 128 <> 0 then

SendMessage(cmbRShift.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbRShift.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..Π²Π²Π΅Ρ€Ρ…

if buttons[VK_UP] and 128 <> 0 then

SendMessage(cmbUp.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbUp.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..Π²Π½ΠΈΠ·

if buttons[VK_Down] and 128 <> 0 then

SendMessage(cmbDown.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbDown.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..Π²Π»Π΅Π²ΠΎ

if buttons[VK_LEFT] and 128 <> 0 then

SendMessage(cmbLeft.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbLeft.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..Π²ΠΏΡ€Π°Π²ΠΎ

if buttons[VK_RIGHT] and 128 <> 0 then

SendMessage(cmbRight.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbRight.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

end;

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ состояниС клавиш, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ GetKeyboardState, которая заполняСт массив buttons (Π½Π° самом Π΄Π΅Π»Π΅ Ρ‚ΠΈΠΏ TKeyBoardstate ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊ array [0. 255] of Byte) значСниями, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΌΠΈ, Π½Π°ΠΆΠ°Ρ‚Π° Π»ΠΈ клавиша. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ значСния Π² массивС buttons Ρ‚Ρ€Π°ΠΊΡ‚ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

β€’ Ссли установлСн ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π±ΠΈΡ‚ (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‡Π΅Π³ΠΎ ΠΈ дСлаСтся Π² листингС 3.17), Ρ‚ΠΎ клавиша Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π°ΠΆΠ°Ρ‚Π°;

β€’ Ссли установлСн младший Π±ΠΈΡ‚, Ρ‚ΠΎ функция, закрСплСнная Π·Π° этой клавишСй (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Caps Lock), Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π°.

Для индСксации массива ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ASCII-ΠΊΠΎΠ΄Ρ‹ символов, Π° Ρ‚Π°ΠΊΠΆΠ΅ константы, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π½Π΅ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ клавишам (обозначСния ΠΈ ΠΊΠΎΠ΄Ρ‹ для Ρ‚Π°ΠΊΠΈΡ… клавиш приводятся Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ 1).

КаТдой ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ клавишС (листинг 3.17) соотвСтствуСт ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅. Для ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ установки ΠΊΠ½ΠΎΠΏΠΊΠΈ Π² Π½Π°ΠΆΠ°Ρ‚ΠΎΠ΅ ΠΈΠ»ΠΈ Π½Π΅Π½Π°ΠΆΠ°Ρ‚ΠΎΠ΅ состояниС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ посылка сообщСния BMSETSTATE. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ опрСдСлСния состояния клавиш Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° рис. 3.3.

Рис. 3.3. БостояниС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… клавиш ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, Ρ‡Ρ‚ΠΎ рассмотрСнный способ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°ΠΆΠ΅ для опрСдСлСния нСисправных клавиш Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ это сдСлано Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Norton Utilities.

Π˜ΠΌΠΈΡ‚Π°Ρ†ΠΈΡ наТатия клавиш

БостояниС клавиш Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, Π΅Π³ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ. Рассмотрим ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ наТатия клавиш, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΡ€Π°ΠΉΠ½Π΅ прост благодаря Π½Π°Π»ΠΈΡ‡ΠΈΡŽ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ keybdevent, ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠΉ для ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°.

НазначСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ поясним Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ (листинг 3.18)....

Листинг 3.18.

ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ мСню ΠŸΡƒΡΠΊ

procedure TForm1.cmbStartClick(Sender: TObject);

begin

//Π˜ΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ клавиши Windows

keybd_event(VK_LWIN, 0, 0, 0);

//Π˜ΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ отпусканиС клавиши Windows

keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);

end;

Нас ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚, ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ keybdevent (Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π° Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для установки Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, относящСйся ΠΊ Π½Π°ΠΆΠ°Ρ‚ΠΈΡŽ клавиши). ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСдаСтся ΠΊΠΎΠ΄ Β«Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌΠΎΠΉΒ» ΠΈΠ»ΠΈ «отпускаСмой» клавиши. Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ ΠΏΡ€ΠΈ Β«Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈΒ» ΠΈ константС KEYEVENTF_KEYUP ΠΏΡ€ΠΈ «отпускании» клавиши.

...

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅!

ΠŸΡ€ΠΈ использовании keybd_event Π³Π»Π°Π²Π½ΠΎΠ΅ – Π½Π΅ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ Β«ΠΎΡ‚ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΒ» ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ Π½Π°ΠΆΠ°Ρ‚Ρ‹Π΅ клавиши (ΠΊΠ°ΠΊ это дСлаСтся Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… здСсь ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…). Π˜Π½Π°Ρ‡Π΅ Π΅ΡΡ‚ΡŒ риск изрядных Β«Π³ люков» ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°.

Аналогичный ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π² листингС 3.18 ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ наТатия клавиши Print Screen (снятия ΠΊΠΎΠΏΠΈΠΈ экрана) приводится Π² листингС 3.19.

...

Листинг 3.19.

БнятиС ΠΊΠΎΠΏΠΈΠΈ экрана

procedure TForm1.cmbPrintScreenClick(Sender: TObject);

begin

//НаТимаСм Print Screen

keybd_event(VK_SNAPSHOT, 0, 0, 0);

keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0);

end;

Π’ листингС 3.20 приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€ наТатия ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… клавиш (Windows+M для сворачивания всСх ΠΎΠΊΠΎΠ½).

...

Листинг 3.20.

Π‘Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ всСх ΠΎΠΊΠΎΠ½

procedure TForm1.cmbMinimizeAllClick(Sender: TObject);

begin

//НаТимаСм Windows+M

keybd_event(VK_LWIN, 0, 0, 0);

keybd_event(Byte(\'M\'), 0, 0, 0);

keybd_event(Byte(\'M\'), 0, KEYEVENTF_KEYUP, 0);

keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);

end;

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊ этой ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ клавиши Shift ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡŽ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ состояния ΠΎΠΊΠΎΠ½.

ПослСдний ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ клавиш для ускорСния быстрого доступа ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ. Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ Π² Π²ΠΈΠ΄Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ сочСтаний клавиш, ассоциированных с ярлыками, располоТСнными Π½Π° Π Π°Π±ΠΎΡ‡Π΅ΠΌ столС ΠΈΠ»ΠΈ находящимися Π² мСню ΠŸΡƒΡΠΊ. Допустим, Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сочСтаниС клавиш Ctrl+Alt+E для запуска Internet Explorer. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ наТатия этой ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ клавиш ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 3.21.

...

Листинг 3.21.

Быстрый запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

procedure TForm1.cmbEIxplorerClick(Sender: TObject);

begin

//НаТимаСм ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ Ctrl+Alt+E

keybd_event(VK_CONTROL, 0, 0, 0);

keybd_event(VK_MENU, 0, 0, 0);

keybd_event(Byte(\'E\'), 0, 0, 0);

keybd_event(Byte(\'E\'), 0, KEYEVENTF_KEYUP, 0);

keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);

keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);

end;

ПослСдний ΠΏΡ€ΠΈΠΌΠ΅Ρ€ особСнно ΠΏΠΎΠ»Π΅Π·Π΅Π½ для запуска сразу Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ (для этого ярлыкам этих ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ сочСтания клавиш).

Β«Π‘Π΅Π³ΡƒΡ‰ΠΈΠ΅ ΠΎΠ³Π½ΠΈΒ» Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅

Π’ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ рассмотрим довольно Π·Π°Π±Π°Π²Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ, основанный Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ клавиш Caps Lock, Num Lock ΠΈ ScroLL Lock. Как извСстно, этим клавишам ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Ρ€ΠΈ Π»Π°ΠΌΠΏΠΎΡ‡ΠΊΠΈ (ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€). Π‘ΡƒΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° состоит Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ/Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ упомянутых клавиш, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ автоматичСски сопровоТдаСтся Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ/Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π»Π°ΠΌΠΏΠΎΡ‡Π΅ΠΊ.

ΠŸΠ΅Ρ€Π΅Π΄ рассмотрСниСм основных ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ тСкст ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ PressKey, которая Π΄Π°Π»Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ практичСски Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡˆΠ°Π³Ρƒ (листинг 3.22). Она ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ клавиши с ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ.

...

Листинг 3.22.

НаТатиС ΠΎΠ΄Π½ΠΎΠΉ клавиши

procedure PressKey(keyCode: Byte);

begin

keybd_event(keyCode, 0, 0, 0 );

keybd_event(keyCode, 0, KEYEVENTF_KEYUP, 0 );

end;

Запуск ΠΈ остановка ΠΎΠ³Π½Π΅ΠΉ осущСствляСтся ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ (ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΊΠ½ΠΎΠΏΠΊΠΈ, Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ тСкстовоС ΠΏΠΎΠ»Π΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ вводится ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» ΠΌΠ΅ΠΆΠ΄Ρƒ смСной состояния ΠΎΠ³Π½Π΅ΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ со свойством Enabled, Ρ€Π°Π²Π½Ρ‹ΠΌ False) (листинг 3.23).

...

Листинг 3.23.

Запуск ΠΈ остановка ΠΎΠ³Π½Π΅ΠΉ

var

initCaps, initNum, initScroll: Boolean; //ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅

//состояния клавиш

curCaps, curNum, curScroll: Boolean; //Π’Π΅ΠΊΡƒΡ‰ΠΈΠ΅ состояния

//клавиш

procedure TForm1.cmbStartClick(Sender: TObject);

begin

if cmbStart.Caption = \'Π‘Ρ‚Π°Ρ€Ρ‚\' then

begin

//БохраняСм ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ состояния клавиш

initCaps := (GetKeyState(VK_CAPITAL) and 1) <> 0;

initNum := (GetKeyState(VK_NUMLOCK) and 1) <> 0;

initScroll := (GetKeyState(VK_SCROLL) and 1) <> 0;

//Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Caps Lock

if not initCaps then PressKey(VK_CAPITAL);