Скан код PrintScreen...

Тема в разделе "WASM.BEGINNERS", создана пользователем Debris, 12 дек 2011.

  1. Debris

    Debris New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2011
    Сообщения:
    33
    Делаю обработчик прерывания клавиатуры 32-режим, порты, вроде всё работает, но одна клавиша не даёт покоя - PrintScreen:

    Make E012E07C - Break E0F07CE0F012
    Make E07C - Break E0F07C - если нажаты любой контрл или шифт
    Make 84 - Break F084 - если нажат любой альт
    Make E012E07C - автоповтор E07C - Break E0F07CE0F012
    Make E012E07C - была нажата любая клавиша - Break E0F07C

    Проблема в том , что я немогу однозначно определить код отпускания клавиши он может быть как E0F07CE0F012 так и E0F07C, при одном и том-же make коде.
    Существует возможность узнать у контроллера что он выдал все скан коды, что-бы не вводить жуткий алгоритм с тучей переменных содержащих маке код, для точного определения break. Почему тучу, потому-что клавиши: /; Insert; Home; Delete; End; PUp; PDn; стрелки, в сочетании с левым шифтом, правым шифтом, обоими шифтами и NumLock (кроме / ), имеют разные make и break коды, навскидку около 40 переменных. Алгоритм можно сильно упрастить игнорируя такие последовательности как E059 E012 и.д, но нада знать признак коца скан кода.
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Debris
    Вообще E0 E1 (для второго сета ещё и F0, означающий отпускание, тогда как в первом сете отпускание описывается выставлением верхнего бита основного кода) — просто модификаторы/префиксы. Поэтому понятно, что они не являются концом последовательности, возникающей при нажатии/отпускании. Что же до E0 12 и E0 59 — это просто (модифицированные) шифты. И их следует рассматривать, как отдельные нажатия. Соответственно код самой клавиши — это только 7C (или 37 для первого сета).
     
  3. Debris

    Debris New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2011
    Сообщения:
    33
    "E0 12 и E0 59 — это просто (модифицированные) шифты. И их следует рассматривать, как отдельные нажатия" - как раз этого я и хотел избежать.....
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Debris
    Зачем?
     
  5. Debris

    Debris New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2011
    Сообщения:
    33
    Ну например
    1 Жму шифт - обрабатую скан код, заношу в буфер номер нажатого шифта (у меня буфер регестрирует одновременно нажатые клавиши)
    2 жму допустим insert, начинаю считывать побайтно код, нарываюсь на модифицированный шифт, запоминаю его во флаге, считую скан код инсерта, заношу себе в буфер нажатых
    3 снимаю палец с шифта, считую скан, удаляю из буфера
    4 снимаю палец с инсерта, получаю код отмены , начинаю сканировать флаги (переменные), нахожу что был нажат шифт , и вытягиваю из очереди контроллера его модифицированный код (шифта).
    Но еслиб контролер говорил что он переслал все данные, алгоритм бы упростился, непришлось бы мне во флагах запоминать, что когдато был нажат какойлибо модификатор, я бы просто получал код make - inserta игнорируя все модификаторы, а потом получал его брейк код и очищал буфер контроллера пока не получу сигнал что очередь пуста.
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Debris
    Не вижу, каким образом. Ну предположим он бы сказал, что переданы все данные 1. Откуда тогда было бы известно, нажат в момент нажатия инсерта шифт или нет?
    Правильный алгоритм такой: хранить массив флагов для каждой клавиши (или по меньшей мере для правого и левого шифтов, контролов, альтов и стартов) и просто выставлять соответствующий флаг при каждом нажатии, а сбрасывать при каждом отпускании.

    1 хотя откуда ему знать, все это данные или пользователь ещё что-то нажмёт? Соответственно все приходящие коды с точки зрения программы правильно рассматривать, как непрерывный поток кодов без всяких начал и концов.
     
  7. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Debris, пропускай фэйк-шифты и не забывай, что Print Screen - это еще и SysReq.
     
  8. Debris

    Debris New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2011
    Сообщения:
    33
    Может я неправильно выразился но мне нужно знать просто что очередь пуста, я так понял такой возможно сти в контроллере нету....
    Для того чтобы знать нажата шифт или нет в моём случае, есть буфер номеров нажатых клавиш, который будет сканироватся после каждого клавиатурного прерывания и по таблицам (для каждого и суммы) модификаторов находится результат.
    в моей операционке Print screen - будет капсом , а SysReq небудет вообще), а также там небудет ниодной английской буквы....
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Debris
    Ну по одному байту за прерывание Вы будете получать. Естесственно, что нужно хранить несколько флагов для E0, E1 и F0 и начинать обрабатывать полный код клавиши тогда, когда получаете любой другой код. Разве в этом есть какие-то сложности?
     
  10. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    ...А "кэпс", видимо, будет принт скрином :) Зачем пользователя сбивать с толку, ведь его в школе учили использовать кэпслок для вполне определенной цели?

    Неправильный подход. Нужно накапливать байт-коды, пока не получится что-нибудь законченное. Предбуфер очень короткий. Фактически ты должен запоминать только модификаторы 0E0h и 0E1h, признак брэйк-кода 0F0h и ряд флагов. Кратко опишу, как это работает у меня. Обработчик генерирует два основных вида событий KEYDOWN и KEYUP (при наличии брэйк-кода), передавая виртуальный код клавиши, шифт-статус (флаги состояния клавиш LAlt, LCtrl, LShift, RAlt, RCtrl, RShift; клавиши Start я пока не отношу к этой группе) и лок-статус (флаги состояния индикаторов NumLock, ScrollLock, CapsLock). Дальнейшая трансляция выполняется уже "принимающей стороной".
     
  11. Debris

    Debris New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2011
    Сообщения:
    33
    Мне нужно обработать некоторые компинации клавишь до 1 байта - типа Alt+Ctrl+Del будет 158h, в моей таблице аски, чтоб поток без головной боли можно было направить по сети... поэтому преобразовать придётся сразу.
    ясн..., щас нормальные люди уснут и я займусь делом
     
  12. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Ну, виртуальные скан-коды я уже не делю на однобайтовые или двухбайтовые. Ты можешь еще в обработчике при получении Del смотреть на шифт-статус и если флаги LAlt|RAlt и LCtrl|RCtrl установлены, то передавать особый сканкод Ctrl-Alt-Del.

    Спокойной ночи.
     
  13. Debris

    Debris New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2011
    Сообщения:
    33
    l_inc
    Да не сложно, просто хочется сделать проще алгоритм по возможности, и так, абсолютно рабочий код переписую заново, лишь потому-что практически все интернет ссылки об обработке клавиатуры неудосужились написать о влиянни клавишь модификаторов на скан код рассширеных клавишь.