Как записывать нажатия клавиш, когда клавиатурное ведение журнала недоступно?

Первоначально установив приложение C++, используя подключаемый журнал MS для клавиатуры (WH_JOURNALRECORD), мы обнаруживаем, что оно не работает в Vista, если не запущено от имени администратора с включенным uiAccess. MSDN Вопрос - Журналы перехватываются на Vista?

Мы хотим записать последовательность клавиш пользователя дружественным способом, который будет повторен позднее. Пользователь нажимает кнопку записи, отображается диалоговое окно с кнопкой остановки и записанными клавишами.

Одним из преимуществ использования крюка журналирования было то, что вы получали только нажатия клавиш, которые что-то делали. Удержание клавиши "Shift" не показывало 100 клавиш "Shift", но сообщало об использовании, когда вы нажимали клавишу. Еще одним преимуществом было то, что вы могли установить фокус на область вне приложения, скажем, в другом окне приложения, и записать действие, когда пользователь взаимодействовал.

Помимо того, что клавиатура захватывает часть существующего приложения в виде отдельного исполняемого файла, который запускается от имени администратора с помощью uiAccess, я ищу другие идеи о том, как записывать нажатия клавиш, которые работают в Windows для 2K, 2K3, 2K8, XP, Vista.

Редактировать: я знаю, что есть проблема безопасности с простой записью чего-либо, очевидно, если бы вы могли сделать это без замечаний пользователей, у вас есть типичный регистратор нажатий клавиш для взлома. Soooooo.....

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

2 ответа

Решение

Мы обошли основные проблемы, используя вместо этого SetWindowsHook.

const HMODULE hDLL = ::GetModuleHandle(DLL_NAME);
::SetWindowsHookEx(WH_KEYBOARD_LL, myKeyboardProcCallback, hDLL, 0);

Теперь обратный вызов должен управлять информацией о нажатии клавиш и преобразовывать ее в пригодные для использования последовательности - т.е. не записывать несколько нажатий клавиш Ctrl, когда он нажимает клавишу Ctrl +.

Даже если бы вы могли, вы бы наверняка обнаружили, что Microsoft исправит эту ошибку в следующем патче. Изменения в Vista были преднамеренными, и есть четкий способ (uiAccess==true) делать то, что вы хотите.

Другие вопросы по тегам