В KbFilter_ServiceCallback из примера DDK kbfiltr.c состояние клавиши определяется проверкой на чётность члена структуры KEYBOARD_INPUT_DATA Flags. Если число чётное, то клавиша нажата, а если не чётное, то произошло её отпускание. В IsrRoutine же Flags не меняется и остаётся всегда чётным. Вот я и спрашиваю: как в IsrRoutine определить, что клавиша нажата или отпущена?
Тогда, скажите мне пожалуйста, как сделать нормальное залипание клавиш на PS/2 клавиатуре? Или на этом форуме кроме Сетевое программирование никто ничего не знает? Что бы я не спросил -всё молчёк(
Llirik,можешь поделиться изысканиями в этой теме?Ты перехватываешь нажатие клавиш в IsrRoutine какого драйвера?
Вот конкретный мини-пример моей проблемы Код (Text): KKbFilter_ServiceCallback proc pDeviceObject:PDEVICE_OBJECT, InputDataStart:PKEYBOARD_INPUT_DATA, InputDataEnd:PKEYBOARD_INPUT_DATA, InputDataConsumed:PULONG mov eax, InputDataStart assume eax:ptr KEYBOARD_INPUT_DATA .if [eax].MakeCode == 36h .if [eax].Flags == 1 .if zl1 == 0 inc zl1 ret .else dec zl1 .endif .endif .endif push InputDataConsumed mov eax, pDeviceObject push InputDataEnd assume eax:ptr DEVICE_OBJECT mov ecx, [eax].DeviceExtension assume eax:nothing assume ecx:ptr FiDO_DEVICE_EXTENSION push InputDataStart push [ecx].UPPER_CONNECT_DATA.ClassDeviceObject call [ecx].UPPER_CONNECT_DATA.ClassService assume ecx:nothing ret KKbFilter_ServiceCallback endp Почему с USB-клавой этот код залипания правого Shift`а действует, а с PS/2 нет? не найдя ответа я и полез в IsrRoutine, но там я не смог понять, как определить, что клавиша нажата или отпущена( как быть?
я сделал залипание и в IsrRoutine Код (Text): KbFilter_IsrHook proc pDeviceObject:PDEVICE_OBJECT, CurrentInput:PKEYBOARD_INPUT_DATA, CurrentOutput:DWORD, StatusByte:UCHAR, DataByte:PUCHAR, ContinueProcessing:PBOOLEAN, ScanState:PKEYBOARD_SCAN_STATE aeju: cmp calllocku, 0 jnz aeju lock inc calllocku mov zl1u, 0 mov mkk, 0 mov nkk, 0 push ebx push edi push esi xor edx,edx xor ecx, ecx mov ebx, CurrentInput assume ebx:ptr KEYBOARD_INPUT_DATA ............................................. функция залипания .............................................. mov eax, pDeviceObject assume eax:ptr DEVICE_OBJECT mov ecx, [eax].DeviceExtension assume eax:nothing assume ecx:ptr FiDO_DEVICE_EXTENSION mov esi, ContinueProcessing .if [ecx].IsrRoutine != 0 push ScanState push esi push DataByte push DWORD PTR StatusByte push CurrentOutput push CurrentInput push [ecx].UpperContext call [ecx].IsrRoutine test al, al je fff cmp BYTE PTR [esi], 0 je fff .endif mov BYTE PTR [esi], 1 fff: pop esi pop edi pop ebx lock dec calllocku ret KbFilter_IsrHook endp , но когда моя функция не пускает дальше клавишу с флагом 02, то есть прыгает сразу на fff, то уследующей нажатой клавиши почему-то меняется флаг. скажем нажал я клавишу с флагом 02, а получаю клавишу с флагом 00 или наоборот. Что за бред?
С той проблемой с залипанием в KKbFilter_ServiceCallback я давно уже разобрался. Оказывается если драйвер не посылает Callback дальше, то надо записывать в InputDataConsumed количество обработанных структур KEYBOARD_INPUT_DATA, иначе драйвер порта будет повторно слать этот же Callback. Но у меня возникла другая проблема с залипанием конкретно Shift`ов и Ctrl`ов. Залипание, которое я привёл в примере работает без проблем, но я написал дополнительную функцию и теперь моё залипание может работать как стандартное залипание Виндоус, но при включённом Num Lock это залипание почему-то как-то перестаёт работать, хотя фильтр Four-F`а показывает, что функции в моём драйвере работают так как надо. Залипание всех остальных клавиш вроде бы работает и при включённом Num Lock В чём может причина и как это исправить?