Задача стояла программно Зажечь светодиод Scrol Lock не переключая саму функцию.
С трудом удалось, но возникла проблема, при работе других переключателей Caps lock,Num Lock они восстанавливают истинное значение и диода Scroll lock хотя их об этом и не просили.
Подскажите как решить проблему...
Использую для подсветки английской раскладки клавиатуры (параллельное переключение функции Scroll lock иногда мешает )
Здравствуйте, AVALAH, Вы писали:
AVA>Задача стояла программно Зажечь светодиод Scrol Lock не переключая саму функцию. AVA>С трудом удалось, но возникла проблема, при работе других переключателей Caps lock,Num Lock они восстанавливают истинное значение и диода Scroll lock хотя их об этом и не просили. AVA> Подскажите как решить проблему...
AVA>Использую для подсветки английской раскладки клавиатуры (параллельное переключение функции Scroll lock иногда мешает )
Знаю три способа: keybd_event, порт 0х60 (работает только для PS/2-клавиатур) и
IOCTL_KEYBOARD_SET_INDICATORS. Все три подвержены проблемам, которые Вы описали.
Думаю, надежное решение можно сделать только каким-нибудь очень глубоким хаком
где-нибудь в Raw Input Thread или даже написав драйвер. Например, посадить фильтр
над драйвером класса клавиатуры (kbdclass) и фейлить все чужие запросы индикаторам, а
свои разрешать. Для знающих людей делов на денек работы
Здравствуйте, okman, Вы писали:
O>Здравствуйте, AVALAH, Вы писали:
O>Например, посадить фильтр над драйвером класса клавиатуры (kbdclass) и фейлить все чужие запросы индикаторам, а свои разрешать.
Мне кажется, что загорание индикатора встроено в клавиатурный контроллер. И, несмотря на то, что управление индикатором извне возможно, вполне допустима ситуация, когда контроллер будет зажигать или гасить индикатор ничего не сообщая операционной системе.
Здравствуйте, Nikolay_Ch, Вы писали:
N_C>Мне кажется, что загорание индикатора встроено в клавиатурный контроллер.
Разве это что-то меняет ?
Управляет индикаторами система, она посылает драйверу класса соответствующий код,
он передает его вниз, драйверу клавиатуры (i8042prt, kbdhid или другому, в зависимости
от типа подключения клавиатуры), а уже тот сам разбирается, как зажигать индикатор.
Если посадить фильтр над kbdclass, будет полный контроль над этими процессами.
N_C>И, несмотря на то, что управление индикатором извне возможно, вполне допустима ситуация, когда контроллер будет зажигать или гасить индикатор ничего не сообщая операционной системе.
В каком случае такая ситуация возможна ?
Контроллер вдруг сам зажжет индикатор, но при этом операционке ничего "не скажет" ?
Здравствуйте, okman, Вы писали:
O>Управляет индикаторами система, она посылает драйверу класса соответствующий код, O>он передает его вниз, драйверу клавиатуры (i8042prt, kbdhid или другому, в зависимости O>от типа подключения клавиатуры), а уже тот сам разбирается, как зажигать индикатор.
Не совсем. Может быть такая ситуация, когда контроллер меняет состояние индикатора сам, когда нажимается кнопка — не зависимо от того, есть ли система или нет.
N_C>>И, несмотря на то, что управление индикатором извне возможно, вполне допустима ситуация, когда контроллер будет зажигать или гасить индикатор ничего не сообщая операционной системе. O>В каком случае такая ситуация возможна ? O>Контроллер вдруг сам зажжет индикатор, но при этом операционке ничего "не скажет"?
Не вдруг, а из-за чего-то. К примеру — у меня на клавиатуре лампочки зажигаются сомопроизвольно при розжиге настольной лампы дневного света. Почему это происходит — видимо от помех, но это происходит-же. И ОС не получает уведомления от контроллера, что лампочки включились.
Здравствуйте, Nikolay_Ch, Вы писали:
N_C>Не совсем. Может быть такая ситуация, когда контроллер меняет состояние индикатора сам, когда нажимается кнопка — не зависимо от того, есть ли система или нет.
Это легко проверяется. Вешаем хук на kbdclass, например (MJ Table Patch или PnP Filter — не
важно) и перехватываем запрос IOCTL_KEYBOARD_SET_INDICATORS, вырезая KEYBOARD_CAPS_LOCK_ON из
структуры KEYBOARD_INDICATOR_PARAMETERS, которая приходит во входном буфере, после чего
отправляем запрос дальше. Caps Lock после этого отрубается и ни на что не реагирует.
Проверено на USB и PS/2. Думаю, на других типах клавиатур будет такой же результат.
N_C>Не вдруг, а из-за чего-то. К примеру — у меня на клавиатуре лампочки зажигаются сомопроизвольно при розжиге настольной лампы дневного света. Почему это происходит — видимо от помех, но это происходит-же. И ОС не получает уведомления от контроллера, что лампочки включились.
С тем, что такое в принципе возможно, например из-за помех, я не спорю.
Просто это уже немного за рамками задачи, озвученной топикстартером.