Я пишу кейлоггер / трекер мыши для использования в приложении для отображения тепла с открытым исходным кодом, в основном идентичным новейшему программному обеспечению Razer, но для использования с любым оборудованием / ОС (используя удивительный кроссплатформенный SDK Qt). Как вы можете себе представить, это включает перехват сообщений клавиатуры и мыши от ядра, когда приложение не является основным процессом.
Для Windows меня тянуло к GetAsyncKeyState, но на возвращаемом значении есть примечание из MSDN об этой функции, возвращающей ноль, если «поток переднего плана принадлежит другому процессу, а рабочий стол не разрешает перехват или запись журнала».
Несмотря ни на что, я написал метод для получения состояния клавиатуры (который запускает каждый заданный интервал времени с помощью методов Qt QTimer), и он просто работал:
//The following executes every 100th of a second:
for (int i = 0; i < 256; ++i)
{
keyboardArray[i] = GetAsyncKeyState(i);
}
Наблюдая за этим массивом в отладчике, я вижу, как меняются значения в массиве, когда я печатаю, даже когда приложение не является основным процессом. Таким образом, для моего компьютера, по крайней мере, эта функция работает при мониторинге состояний клавиш, когда основной поток не ориентирован на мое приложение.
Мой вопрос: в каких случаях Windows не разрешить хуки или запись в журнале? Другими словами, существуют ли какие-либо версии Windows и / или привилегии, которые пользователь может иметь / не иметь там, где этот метод может потерпеть неудачу? У меня действительно нет доступа к куче разных машин, чтобы проверить это.
Мои спецификации: Windows 7 Home Premium 64-битная, Intel i7 930 (2,8 ГГц, четырехъядерный гиперпоточный), 12 ГБ памяти DDR3 1333 МГц, 2x Nvidia 460, если что-то из этого помогает.
С уважением,
РЕДАКТИРОВАТЬ:
Ханс Пассант привел мне пример ситуаций, в которых реализация такого типа потерпит неудачу: в основном это приложения для Windows, которые включают Изоляция привилегий пользовательского интерфейса (МСНС). В основном, если приложение действительно важно для операционной системы (например, командная строка), этот тип перехвата сообщений не будет работать. Я даже проверил это, и это правда: мое приложение перестает обновлять массив клавиатуры, когда командная строка является основным потоком.
Это и то, что сказал LoPiTaL, предполагает, что только определенные приложения не позволят этому типу перехвата произойти. В основном я нацеливаю это приложение на геймеров, которые (как и я) хотели бы видеть нажатия клавиш и щелчки мышью для их игрового процесса, поэтому, возможно, меня не волнует эта проблема, но если я хочу расширить это для общего использования (включая людей, которые часто используют CMD), тогда кажется, что на самом деле нет способа перехватить ключевые сообщения для этих типов приложений с повышенными правами.
Это правда, или методы, подобные SetWindowsHookEx, могут перехватывать сообщения для приложений UIPI? Я пытался избежать реализации хуков напрямую, потому что это может рассматриваться как вирус на домашних компьютерах людей, а перехват и пересылка каждого входящего сообщения просто замедляет все, что в играх является довольно большой проблемой.
Задача ещё не решена.