Время нажатия клавиатуры и мыши

Тема в разделе "WASM.BEGINNERS", создана пользователем Ruins007, 11 мар 2018.

  1. Ruins007

    Ruins007 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2017
    Сообщения:
    17
    Hello world,
    нужно фиксировать время нажатия кнопок в Windows, так чтобы потом из приложения можно было получить что-то на подобии:
    1. W + A + S + D: 1 ms ago
    2. Space: 3 ms ago
    3. Left Mouse Button: 12 ms ago
    Так как нужны все нажатия, то опрашивать в ручную только в своём потоке - нет смысла. Посмотрел, клавиатура и мышь работают через прерывания так, что вроде надо драйвер-фильтр писать. Но с этой областью знаком исключительно теоретический, прочитав "Внутреннее устройство Microsoft Windows". Поэтому нужны (интерфейсы клавиатуры?), как вообще взаимодействовать с устройствами ввода? То есть, я знаю, что надо сделать dll'ку и прописать её в services разделе реестра, общаться можно через CreateFIle и т.п. ( ну и конечно же C# отпадает...), а вот дальше прошу направить.

    И ещё, как реализовать замер времени? RDTSC - отпадает, так как зависит от частоты, которая как известно ныне - непостоянна. В стандартные системные вызовы вообще боюсь лезть, так как прерывания должны быть быстрыми, а тут микросекундные задержки на каждое прерывание - многовато. А если зайти с другой стороны, и клавиатура, и мышь опрашиваемые устройства и имеют частоту этого опроса, при этом за раз передаёт до 16 байт (вроде бы). А если мы и так знаем время, то нужно отслеживать лишь нажаты клавиши или нет, и каждый раз прибавлять к итератору единичку. Только вот опять вопрос в изменении частоты опроса и отключении ради энергосбережения.

    В общем я сам немножечко запутался, что посоветуете? или я вообще дурью маюсь и есть стандартные библиотеки дающие такую информацию?
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Ruins007,

    В нт нет смысла говорить про скорость каких либо событий, это не ось реального времени, в один момент из за загрузки системы задачей может быть сформирована очередь прерываний, которые затем быстро будут обработаны.
    Снятие временной статистики это профилировка приложения. Есть системный профайлер, отсчёты времени которого линейны и стабильны. Аппаратный счётчик(tsc) не стабилен, перед его использованием нужна калибровка - результат его работы относительный и снятие профайла происходит за большой период.
    Для вашей задачи никакие не нужны ядерные мониторы. Интерфейс оси асинхронный, нет никакого смысла измерять время доставки оконных сообщений. Нажатие кнопки приводит к цепочке событий, результат которой по таймингу не предсказуем и зависит от общей загрузки системы. На уровне асбтракций клавиатурный ввод принимает высокоэффективный поток сырого ввода. Он крутится в бесконечном цикле и транслирует драйверные запросы в интерфейс графической системы. Там всё основано на очередях событий. Нажав кнопку вы не можите знать через какое время данное событие будет доставлено, во первых это от самого приложения зависит.
     
  3. X-Shar

    X-Shar Active Member

    Публикаций:
    0
    Регистрация:
    24 фев 2017
    Сообщения:
    354
    Ruins007, если я правильно понял задачу, то:

    1) Как понимаю вам нужно что-то типо кейлоггера, решается эта задача легко, при помощи SetWindowsHookEx, которая устанавливает определяемую программой процедуру фильтра (hook) в цепочку фильтров (hook). Вы должны установить процедуру фильтра (hook) для того, чтобы контролировать в системе определенного рода типы событий.

    Можете загуглить, там ничего сложного нет, кстати писал простенький кейлоггер как-то. Если нужно могу ссылку на сорец дать.

    2)Про время:

    Рекомендую сделать свои временные метки, как это сделать вкратце:

    Можно использовать функции _strtime(), хидер time.h.

    Небольшой пример, как замерить время:

    Код (Text):
    1. _strtime( timeStart );
    2.  
    3. my_program
    4.  
    5. _strtime( timeEnd );
    Ну и понятно Result_Time = timeEnd - timeStart будет затраченное время на всё про всё.
     
  4. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    860
    WH_JOURNALRECORD
    EVENTMSG.time
     
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Thetrik,

    Ситемная очередь событий по какой то причине подвиснет и вы лишь спустя хз какое время получите данные про время помещения сообщения в очередь. Из за задержки эти данные будут совершенно бесполезны. Ну получите вы тайминг 20мс спустя секунду. И что с этим дальше делать.
     
  6. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    860
    Насколько я понял время получения не важно, ну придет оно хоть через 5 секунд. Важно именно время помещения в очередь.
    Ruins007, еще кстати через DirectInput можно получить, насколько мне известно, с дискретностью в 1мс.
     
  7. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
  8. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    860
    Indy_, где-то документировано это, я имею в виду тайминги в EVENTMSG.time? Тоже самое про DirectInput.
     
  9. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Thetrik,

    Не могу сказать. Врядле, конкретно по данной структуре и полю инфу найти можно. В тех же сурках нт или может на мсдн. Но это всего лишь локальное время, а не время профайлера. Толку от времени создания обьекта нет, если время на получение инфы про данный обьект рандомно.
     
  10. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    860
    Мне кажется это не нужно, про скорость фиксирования ничего в задаче нет.
     
  11. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Thetrik,

    А вы не думали какого чёрта гуй манипулирует кернел обьектами в юзермод, зачем туда отображаются ядерные таблицы трансляции ?

    Ядерная часть гуя максимально переносится в юм, это повышает профайл из за отсутствия межкольцевых переключений(железячной рутины) и исключает возможные падения системы.