Тот факт, что клавиатура все еще работает, является ошибкой. Но нет способа исправить это программно, о котором я знаю. Проблема в том, что клавиатура работает на основе соединения, а соединение с предыдущим приложением. Так что нет возможности поговорить с ним, пока у вас не будет связи.
Размер взлома, который вы упомянули, действительно следует избегать, потому что его далеко не 100%. Есть другие вещи, которые ломают это, такие как разделенный экран, изображение в режимах изображения, и наиболее вероятно новые складные телефоны. Также подключаем его к любому монитору. Это «обычная» практика только тех, кто не знает лучше и не тестирует свой код.
Вы можете принудительно установить фокус на вид в вашем окне, который принимает ввод текста. Это заставит связь. Но тогда, закрыв его, вы получите рывок, и это произойдет в тех случаях, когда это не проблема.
В конце концов, решение состоит в том, чтобы написать ваше приложение так, чтобы оно не заботилось о состоянии клавиатуры и не пыталось изменить поведение или внешний вид вашего приложения, когда клавиатура открывается / закрывается, ОС не предназначена для этого .
Полностью согласен с вами, что это должно поддерживаться ОС. Но я говорю это с 2010 года, когда я писал клавишные. Это еще не изменилось, я не ожидал бы этого в ближайшее время.
Вы попробовали WSADuplicateSocket
. Затем просто проверьте WSAPROTOCOL_INFO
видеть, является ли это на самом деле именованный канал...
Я думаю, что, возможно, вы могли бы попытаться вызвать GetNamedPipeInfo () на своем дескрипторе. Если вызов завершился успешно, вы знаете, что дескриптор является дескриптором канала, иначе это должен быть сокет.