Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.007 c
1-61559
Влад2
2002-12-05 22:43
2002.12.19
Команда DOS без окна?


1-61517
Cherepovets
2002-12-09 09:48
2002.12.19
CRC


1-61677
DVM
2002-12-08 17:43
2002.12.19
Действия с посторонними окнами


3-61491
$hade
2002-12-02 13:32
2002.12.19
IB 6.5 license


14-61770
STANT
2002-11-27 17:39
2002.12.19
Народ! Хватит трепаться!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский