Hello world, нужно фиксировать время нажатия кнопок в Windows, так чтобы потом из приложения можно было получить что-то на подобии: W + A + S + D: 1 ms ago Space: 3 ms ago Left Mouse Button: 12 ms ago Так как нужны все нажатия, то опрашивать в ручную только в своём потоке - нет смысла. Посмотрел, клавиатура и мышь работают через прерывания так, что вроде надо драйвер-фильтр писать. Но с этой областью знаком исключительно теоретический, прочитав "Внутреннее устройство Microsoft Windows". Поэтому нужны (интерфейсы клавиатуры?), как вообще взаимодействовать с устройствами ввода? То есть, я знаю, что надо сделать dll'ку и прописать её в services разделе реестра, общаться можно через CreateFIle и т.п. ( ну и конечно же C# отпадает...), а вот дальше прошу направить. И ещё, как реализовать замер времени? RDTSC - отпадает, так как зависит от частоты, которая как известно ныне - непостоянна. В стандартные системные вызовы вообще боюсь лезть, так как прерывания должны быть быстрыми, а тут микросекундные задержки на каждое прерывание - многовато. А если зайти с другой стороны, и клавиатура, и мышь опрашиваемые устройства и имеют частоту этого опроса, при этом за раз передаёт до 16 байт (вроде бы). А если мы и так знаем время, то нужно отслеживать лишь нажаты клавиши или нет, и каждый раз прибавлять к итератору единичку. Только вот опять вопрос в изменении частоты опроса и отключении ради энергосбережения. В общем я сам немножечко запутался, что посоветуете? или я вообще дурью маюсь и есть стандартные библиотеки дающие такую информацию?
Ruins007, В нт нет смысла говорить про скорость каких либо событий, это не ось реального времени, в один момент из за загрузки системы задачей может быть сформирована очередь прерываний, которые затем быстро будут обработаны. Снятие временной статистики это профилировка приложения. Есть системный профайлер, отсчёты времени которого линейны и стабильны. Аппаратный счётчик(tsc) не стабилен, перед его использованием нужна калибровка - результат его работы относительный и снятие профайла происходит за большой период. Для вашей задачи никакие не нужны ядерные мониторы. Интерфейс оси асинхронный, нет никакого смысла измерять время доставки оконных сообщений. Нажатие кнопки приводит к цепочке событий, результат которой по таймингу не предсказуем и зависит от общей загрузки системы. На уровне асбтракций клавиатурный ввод принимает высокоэффективный поток сырого ввода. Он крутится в бесконечном цикле и транслирует драйверные запросы в интерфейс графической системы. Там всё основано на очередях событий. Нажав кнопку вы не можите знать через какое время данное событие будет доставлено, во первых это от самого приложения зависит.
Ruins007, если я правильно понял задачу, то: 1) Как понимаю вам нужно что-то типо кейлоггера, решается эта задача легко, при помощи SetWindowsHookEx, которая устанавливает определяемую программой процедуру фильтра (hook) в цепочку фильтров (hook). Вы должны установить процедуру фильтра (hook) для того, чтобы контролировать в системе определенного рода типы событий. Можете загуглить, там ничего сложного нет, кстати писал простенький кейлоггер как-то. Если нужно могу ссылку на сорец дать. 2)Про время: Рекомендую сделать свои временные метки, как это сделать вкратце: Можно использовать функции _strtime(), хидер time.h. Небольшой пример, как замерить время: Код (Text): _strtime( timeStart ); my_program _strtime( timeEnd ); Ну и понятно Result_Time = timeEnd - timeStart будет затраченное время на всё про всё.
Thetrik, Ситемная очередь событий по какой то причине подвиснет и вы лишь спустя хз какое время получите данные про время помещения сообщения в очередь. Из за задержки эти данные будут совершенно бесполезны. Ну получите вы тайминг 20мс спустя секунду. И что с этим дальше делать.
Насколько я понял время получения не важно, ну придет оно хоть через 5 секунд. Важно именно время помещения в очередь. Ruins007, еще кстати через DirectInput можно получить, насколько мне известно, с дискретностью в 1мс.
Thetrik, Бессмысленно всё это. Эти системы работают на иных принципах. Там есчо есть куча скрытых параметров, не зная которые тесты выполнить невозможно. Вот например аналогичный вопрос https://wasm.in/threads/vyzov-koda-iz-dochernego-processa.32544/page-2#post-397350
Indy_, где-то документировано это, я имею в виду тайминги в EVENTMSG.time? Тоже самое про DirectInput.
Thetrik, Не могу сказать. Врядле, конкретно по данной структуре и полю инфу найти можно. В тех же сурках нт или может на мсдн. Но это всего лишь локальное время, а не время профайлера. Толку от времени создания обьекта нет, если время на получение инфы про данный обьект рандомно.
Thetrik, А вы не думали какого чёрта гуй манипулирует кернел обьектами в юзермод, зачем туда отображаются ядерные таблицы трансляции ? Ядерная часть гуя максимально переносится в юм, это повышает профайл из за отсутствия межкольцевых переключений(железячной рутины) и исключает возможные падения системы.