Форум: "WinAPI";
Текущий архив: 2002.12.19;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.12.19;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.008 c