Главная страница
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.017 c
1-61541
Sergy
2002-12-09 15:17
2002.12.19
Как редактировать файлы связи с бд (*.udl)


3-61410
SiJack
2002-11-29 09:33
2002.12.19
Referential Integrity


3-61505
РВА
2002-12-02 17:40
2002.12.19
Ehlib использование


1-61591
skiph
2002-12-05 10:45
2002.12.19
Thread


1-61598
vilfred
2002-12-09 19:36
2002.12.19
один массив побить на десять