Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.19;
Скачать: CL | DM;

Вниз

Keyboard Hook   Найти похожие ветки 

 
Dimedrol ©   (2002-11-05 17:22) [0]

Коллеги, делаю субж. Все ОК.
Каптурю нажатия клавиш в системе, по 2-м параметрам
получаю всю инфу о нажатых клавишах.

Вопрос скорее организационный... ;-)

Как правильно распознавать,
что, вот, например, где-то нажато
"Ctrl+Shift+K" или еще что-то ?

Скорее интересует то, где и конкретно что,
какие биты смотреть для напр. клавиши "Ctrl" или еще для какой-то...
В "WIN32.HLP" все как-то сжато и сумбурно.

Что то я немного путаюсь в этой приходящей информации.


 
Cobalt ©   (2002-11-06 00:00) [1]

"there is a keyboard message (WM_KEYUP or WM_KEYDOWN) to be processed."
"For more information about the lParam parameter, see Keystroke Message Flags."
см. Также Windows.pas (витруальные коды клавиш - VK_XXX)
при получении события нажатия/отжатия Alt/Ctrl/Shift - устанавливай у СЕБЯ соотв. флаги(запоминай это).


 
Vasily Terekhov   (2002-11-06 12:41) [2]

Если я правильно понял, то проблемы возникают при разборе lParam и wParam после перехвата Keystroke в хуке?

Это вспомогательное:
type
HL32 = record
Lo, Hi: Word;
end;
function Hi32(X: LongWord): Word;
begin
Result := HL32(X).Hi;
end;
function Lo32(X: LongWord): Word;
begin
Result := HL32(X).Lo;
end;

Тогда следующее правило:
1. wParam = Ord(<буква,цифра>) (какая клавиша сгенерировала Keystroke. Для виртуальных клавишь можно VK_... т.к. VK_DOWN, VK_DELETE ...)
2. Hi32(lParam) and KF_REPEAT = 0 (если не хочешь, чтобы генерились повторные нажатия при удержании клавиши)
3. Hi32(lParam) and KF_UP = 0 (брать только нажатия клавиш, отжатия отсекать)
4. Hi32(lParam) and KF_ALTDOWN <> 0 (Alt прижат)
5. Hi(GetKeyState(VK_SHIFT)) <> 0 (Shift прижат)
6. Hi(GetKeyState(VK_CONTROL)) <> 0 (Control прижат)

Замечание:
Если использовать:
Lo(GetKeyState(VK_SHIFT)) <> 0
Lo(GetKeyState(VK_CONTROL)) <> 0
то можно Shift и Ctrl использовать как переключатели, наподобие CapsLock и ScrollLock

7. Hi(GetKeyState(VK_LWIN)) <> 0 (Левая Windows прижата)

И т.д и т.п. :))

т.о. если надо определить была ли нажата комбинация Ctrl+Del надо проверить:

if (Code >= 0) and // параметр из процедуры перехвата
(Hi32(lParam) and KF_REPEAT = 0) and
(Hi32(lParam) and KF_UP = 0) and
(Hi(GetKeyState(VK_CONTROL)) <> 0) and
(wParam = VK_DELETE) then
begin
...
end;

Если будут вопросы, или прислать пример, мыль...
Василий.



Страницы: 1 вся ветка

Текущий архив: 2002.12.19;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.072 c
14-61813
sen
2002-11-29 08:24
2002.12.19
Авторский след в программе


3-61468
EternalMaverick
2002-12-02 10:59
2002.12.19
Добавление ролей в Interbase roles


1-61638
Slavik99
2002-12-07 12:30
2002.12.19
Установка покетов в Delphi 5


3-61421
sen
2002-11-29 14:39
2002.12.19
Активизация запросов


14-61791
AL2002
2002-11-28 15:29
2002.12.19
Люди, у меня уже крыша едет...