Я не уверен, что всегда виноват крюк клавиатуры. Кажется, мы все согласны с тем, что в идеальных или средних условиях все должно быть отзывчивым. Но в течение всего срока службы от запуска до выключения крючок также должен выдерживать некоторые наихудшие сценарии. В моей компании мы написали несколько клавиатурных хуков, они настолько легковесны и асинхронны, насколько это возможно, но иногда они по-прежнему отключаются.
Как пользователь, я каждый день набираю несколько десятков тысяч символов. В лучшем случае я перезагружаюсь раз в месяц, а иногда я пропускаю обновление Windows. С такими опциями, как приостановка и спящий режим, я не думаю, что я один. Как разработчик, я должен убедиться, что ловушка продолжает работать от начала до конца, независимо от того, что происходит с системой.
Обычно моя система очень отзывчива. Но могут быть короткие, исключительные моменты, когда он стоит на коленях до такой степени, что даже Windows Aero отключается. Прямо сейчас это очень быстро. Но если я нажму кнопку «Показать рабочий стол», мышь остановится хотя бы на секунду, пока все мои 65 открытых окон свернуты. Что если я нажму клавишу во время одного из этих моментов?
Если Windows может заморозить мышь на одну секунду, если Windows может даже отключить Aero в течение короткого момента большой нагрузки, почему нельзя позволить клавиатуре пережить подобное исключительное время перегрузки? Вместо этого, из-за одного исключительного момента, Windows отключается, незаметно влияя на оставшийся вычислительный процесс до выключения системы. В течение 200 мс, влияющих только на одно нажатие клавиши из тысяч, которые мы нажимаем каждый день, всего за долю секунды я, пользователь, должен перезагрузить систему, потому что, как я понимаю, это единственный способ вернуть макрос клавиатуры или любую другую утилиту Я зависим от моей продуктивной работы.
Даже если было гарантировано предотвратить вышеперечисленное (что, как представляется, наихудший опыт подсказывает, что это не так), я не уверен, что все можно легко сделать в отдельном потоке. Например, предположим, что пользователь устанавливает горячую клавишу для запуска приложения. Не может ли быть причины для запуска приложения из текущего контекста (приоритетное окно, привилегии и т. Д.)? И разве не было бы разумно, чтобы пользователь действительно ожидал и принял задержку, потому что он знает, что, используя клавиатуру, он просто запустил что-то, что занимает больше времени? Я не знаю, является ли пример технически обоснованным, но я хотел показать, как иногда вещи, которые в противном случае могут быть неприемлемыми, могут быть приемлемыми в результате известного события.
Перехваты клавиатуры могут быть очень полезны для многих вещей, от макросов до исправления ошибок и запуска, и такое поведение, представленное в Windows 7, ставит хорошие и плохие, приемлемые и неприемлемые, средние и исключительные значения в той же корзине. Это вредит как пользователям, так как качественные зацепы клавиатуры могут быть убиты, так и разработчикам. Только представьте, что это за кошмар поддержки, когда у вас нет официального решения для вашего приложения, работающего нормально в нормальных условиях, но которое может быть случайно убито при каких-то тяжелых (или других необъяснимых) обстоятельствах.
В заключение, кто-нибудь знает, какой статус у Windows 8, что-нибудь изменилось?