Я проследил эту чрезвычайно раздражающую ошибку еще до Windows XP, так что на самом деле это 17-летняя ошибка, которая до сих пор не исправлена (!).
Эта ошибка также обсуждается здесь, но поток заблокирован, и вы не можете обсуждать эту проблему дальше:
https://answers.microsoft.com/en-us/windows/forum/windows8_1-desktop/how-to-prevent-on-screen-keyboard-from-focus-on/2e6c7d6b-f59e-4b95-b37e-487ff33dbda3
Мне удалось создать простое исправление, загрузив osk.exe
в x64dbg, проанализировав, в чем проблема, и затем исправив код с помощью отладчика (см. Инструкции ниже).
Происходит то, что osk.exe
постоянно хранит последнее активное окно, чтобы сфокусировать это окно, когда мышь наводит курсор на OSK или пользователь активирует OSK. При этом все время сохраняется фокус на последнем активном окне, что гарантирует, что при вводе с помощью OSK ввод идет так, как должен.
Проблема в том, что osk.exe
перестает хранить активное окно, когда OSK свернут.
Это ошибка.
Теперь, когда вы восстанавливаете свернутый OSK, у него амнезия, и он запоминает только последнее активное окно до того, как оно было свернуто. Так что теперь оно будет фокусировать это старое окно вместо предыдущего реального активного окна.
"Исправление", которое я использовал, состояло в том, чтобы просто не допустить, чтобы OSK когда-либо заставляла фокусироваться на любом окне. Для этого исправления нужно только пропатчить один байт в osk.exe
, и именно поэтому я выбрал его. В противном случае любой другой патч был бы чрезвычайно сложным.
В x64dbg вы просто ищете все ссылки на SetForegroundWindow
. Есть только два вызова этого метода Win32. Первое упоминание - это патч. Перед вызовом push eax
есть инструкция SetForegroundWindow
. Просто замените push eax
на ret
, сохраните в osk.exe
и замените оригинальный osk.exe
на эту исправленную версию.
Задача решена.
Это не 100% решение, потому что удобство автоматической активации OSK потеряно, но все же лучше без первоначального раздражения. Вместо этого автоактивация может быть восстановлена с помощью AutoHotKey.
Оставьте сообщение здесь, и я опубликую сценарий, если кому-то понадобится. С помощью скрипта patch + AHK у вас есть полностью работающий OSK без раздражающей оригинальной ошибки.