Главная страница
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.012 c
3-61427
Сабжер
2002-11-29 16:13
2002.12.19
Как в SQL очистить таблицу


3-61394
vsim
2002-12-03 09:34
2002.12.19
Блокировка в DBGrid


14-61809
denisac
2002-10-30 06:37
2002.12.19
Команда кодеров


3-61403
BorisUK
2002-11-21 12:04
2002.12.19
Опять Вопрос по EhLib.... ПРО СОРТИРОВКУ ЛОКАЛЬНО!!!!


1-61658
a3m
2002-12-07 17:17
2002.12.19
Граббёр