Моя старая утилита (маленькая утилита горячих клавиш для игры в покер онлайн), основанная на низкоуровневом перехватчике API SetWindowsHookEx, прекрасно работает с Win7, но перехват клавиатуры часто вылетает с Win 10.
В Msdn Iпрочитано:
Процедура подключения должна обработать сообщение за меньшее время, чем запись данных, указанная в значении LowLevelHooksTimeout в следующем разделе реестра:
HKEY_CURRENT_USER \ Панель управления \ Рабочий стол
Значение указывается в миллисекундах.Если процедура перехвата завершается, система передает сообщение следующему перехватчику. Однако в Windows 7 и более поздних версиях ловушка удаляется без вывода сообщений без вызова .Приложение не может узнать, снят ли хук.Примечание. Ловушки отладки не могут отследить этот тип низкоуровневых хуков клавиатуры.Если приложение должно использовать низкоуровневые хуки, оно должно запустить хуки в выделенном потоке , который передает работу рабочему потоку, а затем немедленно возвращает
Я делаю это, используя BackGroundWorker (со временем перехвата 1-2 миллисекунды !!), но в любом случае в Win 10 перехватчики перестают работать случайным образом и часто.
Я также могу прочитать:
В большинстве случаев, когда приложению необходимо использовать низкоуровневые хуки, оно должно контролировать необработанный ввод вместо .Это связано с тем, что необработанный ввод может асинхронно отслеживать сообщения мыши и клавиатуры, предназначенные для других потоков, более эффективно, чем перехватчики низкого уровня.Для получения дополнительной информации о необработанном вводе см. Необработанный ввод.
Хорошо, но есть проблема: с помощью необработанного ввода я могу получить нажатые клавиши, , но как заморозить нажатые клавиши ??При низком уровне я могу написать: e.Handled = True в событии KeyDown, но при использовании необработанного ввода я не вижу ничего похожего.