PostMessage (WM_INPUTLANGCHANGEREQUEST) не работает для системных/привилегированных окон — диалоги открытия файлов, Win+R, окна поиска. Окно получает сообщение но игнорирует его.
Два исправления:
1. ControlGetFocus — вместо отправки сообщения на окно-контейнер, берём hwnd конкретного сфокусированного контрола (поля ввода) внутри окна. Для многих диалогов это уже помогает.
2. ActivateKeyboardLayout — системный вызов WinAPI, который переключает раскладку напрямую на уровне системы, в обход PostMessage. Работает там где PostMessage игнорируется.
Важно: скрипт нужно запускать от имени администратора, иначе ActivateKeyboardLayout не сработает для привилегированных окон.
Нашел косяк. Keil Uvision 5.36.0.0 в приложении смена языка работает, но если жмем CTL+F открываем окно поиска, и там не работает переключение языка через клаву вообще теперь. Только мышкой в трее.
Спасибо огромное автору! У меня вообще по жесткачу было. Я просто комп не выключаю вообще месяцами. Я подумал клава плохая, купил дорогую, проблема не ушла))). Думаю ну может я нажимаю быстро слишком и тупит. Реестр правил не помогло, Иногда по 10 раз нажимал пытался переключить. Сколько ты нервов сберег людям!)
Вот появились NFT и думаю не буду старым консервативным дедом. Надо следить за трендами. Говорю себе разберись в чем прикол NFT. Почитал повникал, не понял, и так пару раз. Вроде понял, но все же не понял. Притом что в криптовалютах как раз более менее все понятно. И вот тут выходит эта статья которая говорит, что я все правильно понял) Ну или покрайней мере просто мое мнение совпадает с мнением автора статьи.
Мдауж вот это уровень. Уровень тот к которому я наверно хочу придти) Ну знание всего и вся, разводка плат, досканально электронику, программирование под винду, программирование мк) Да еще и такой уровень инженерии. Новаторство по сути. Тоже планировал написать на хабре статью первую, там конечно детский лепет по сравнению с этим.
Это видимо особенность нашего образования, когда не учат уверенности. Нет я не боюсь начинать заниматься чем либо совсем. Возможно я не так ставлю цели. У меня нет цели сделать игру, так как я понимаю нужно много усилий приложить. Например первая цель у меня была научиться понять как делать рубку деревьев, подбор предметов в инвентарь как в диабло2. Ну так как у меня не было цели сделать анимацию персонажа то я просто взял готовый, так как я знаю как это работает и мне это не интересно, мне интересен именно код и результат. С нуля сделать инвентарь как в диабло 2 тяжко поэтому я нашел скачал, и начал разбираться в коде, мне нужно было увеличить размер и еще что то. И вот я там мучался переписывал, рубил деревья вставлял звук, устранял баги. Игры как таковой не было, персонаж просто двигался по 2д карте, ходил спереди или сзади дерева, рубил его, и собирал предметы в инвентарь. Ну как я понял принцип как это делается цель впринципе достигнута и интерес пропал. А вторую не так давно делал уже в 3д, мне было интересно понять насколько сложно сделать симулятор угона авто, притом что я знаю как запускать тачки по электрике без ключа) Ну тачку я могу сам сделать в 3д но зачем, если есть хорошие готовые, поэтому я качнул, сделал чтоб двери открывались, потом сделал чтоб не открывались пока не разбиты стекла. Потом при клике на стекла сделал чтоб подменялась моделька на битое стекло, и если стекло разбито то дверь можно было открыть и сесть в тачку. Все дальше я не смог придумать как в игровой манере сделать запуск авто проводами приблежено к реальности.Ну или стало лень. Ну так как в реальности надо проводами сначала врубить зажигание, это подать массу на один провод а там их 120, все разноцветные. потом подать плюс на два провода чтоб покрутить стартером, ну и да еще мозг поменять надо на свой) Была идея чтоб человек не туда подает массу или питание у него сгорал предохранитель, и потом ищи какой пред сгорел)) короче симулятор так симулятор )
Исправил косяк. Не я а Клод.
Что не работало и почему:
PostMessage (WM_INPUTLANGCHANGEREQUEST)не работает для системных/привилегированных окон — диалоги открытия файлов, Win+R, окна поиска. Окно получает сообщение но игнорирует его.Два исправления:
1.
ControlGetFocus— вместо отправки сообщения на окно-контейнер, берёмhwndконкретного сфокусированного контрола (поля ввода) внутри окна. Для многих диалогов это уже помогает.2.
ActivateKeyboardLayout— системный вызов WinAPI, который переключает раскладку напрямую на уровне системы, в обходPostMessage. Работает там гдеPostMessageигнорируется.Важно: скрипт нужно запускать от имени администратора, иначе
ActivateKeyboardLayoutне сработает для привилегированных окон.Вот целиком скрипт переписанный:
#Requires AutoHotkey v2.0 #SingleInstance Force
~*LAlt::TrySwitch() ~*RAlt::TrySwitch() ~*LShift::TrySwitch() ~*RShift::TrySwitch()
TrySwitch() { static lastTick := 0 if !(GetKeyState(“Alt”, “P”) && GetKeyState(“Shift”, “P”)) return now := A_TickCount if (now - lastTick < 150) return lastTick := now ToggleRuEn() }
ToggleRuEn() { static RU := 0x0419 static EN := 0x0409
}
Вот конкретно его исправления:
Конкретно добавил 3 вещи:
1. Получение сфокусированного контрола внутри окна:
autohotkey
2. Загрузка настоящего HKL через системную функцию вместо ручного сдвига битов:
autohotkey
3. Системный вызов переключения раскладки в дополнение к PostMessage:
autohotkey
Самое главное из этих трёх — именно пункт 3, он решает проблему с Win+R и диалогами. Остальные два — улучшения надёжности.
Блин еще один косяк. Когда жму Save as где нибудь в каком нибудь приложении и нужно ввести название файла тоже не меняется раскладка с этим скриптом.
Нашел косяк. Keil Uvision 5.36.0.0
в приложении смена языка работает, но если жмем CTL+F открываем окно поиска, и там не работает переключение языка через клаву вообще теперь. Только мышкой в трее.
Спасибо огромное автору! У меня вообще по жесткачу было. Я просто комп не выключаю вообще месяцами. Я подумал клава плохая, купил дорогую, проблема не ушла))). Думаю ну может я нажимаю быстро слишком и тупит. Реестр правил не помогло, Иногда по 10 раз нажимал пытался переключить. Сколько ты нервов сберег людям!)
Вот появились NFT и думаю не буду старым консервативным дедом. Надо следить за трендами. Говорю себе разберись в чем прикол NFT. Почитал повникал, не понял, и так пару раз. Вроде понял, но все же не понял. Притом что в криптовалютах как раз более менее все понятно. И вот тут выходит эта статья которая говорит, что я все правильно понял) Ну или покрайней мере просто мое мнение совпадает с мнением автора статьи.
Мдауж вот это уровень. Уровень тот к которому я наверно хочу придти) Ну знание всего и вся, разводка плат, досканально электронику, программирование под винду, программирование мк) Да еще и такой уровень инженерии. Новаторство по сути.
Тоже планировал написать на хабре статью первую, там конечно детский лепет по сравнению с этим.
тут нужна команда, этому учит образование в сша работать в команде и не учит образование в РФ.
Это видимо особенность нашего образования, когда не учат уверенности. Нет я не боюсь начинать заниматься чем либо совсем. Возможно я не так ставлю цели. У меня нет цели сделать игру, так как я понимаю нужно много усилий приложить. Например первая цель у меня была научиться понять как делать рубку деревьев, подбор предметов в инвентарь как в диабло2. Ну так как у меня не было цели сделать анимацию персонажа то я просто взял готовый, так как я знаю как это работает и мне это не интересно, мне интересен именно код и результат. С нуля сделать инвентарь как в диабло 2 тяжко поэтому я нашел скачал, и начал разбираться в коде, мне нужно было увеличить размер и еще что то. И вот я там мучался переписывал, рубил деревья вставлял звук, устранял баги. Игры как таковой не было, персонаж просто двигался по 2д карте, ходил спереди или сзади дерева, рубил его, и собирал предметы в инвентарь. Ну как я понял принцип как это делается цель впринципе достигнута и интерес пропал.
А вторую не так давно делал уже в 3д, мне было интересно понять насколько сложно сделать симулятор угона авто, притом что я знаю как запускать тачки по электрике без ключа) Ну тачку я могу сам сделать в 3д но зачем, если есть хорошие готовые, поэтому я качнул, сделал чтоб двери открывались, потом сделал чтоб не открывались пока не разбиты стекла. Потом при клике на стекла сделал чтоб подменялась моделька на битое стекло, и если стекло разбито то дверь можно было открыть и сесть в тачку. Все дальше я не смог придумать как в игровой манере сделать запуск авто проводами приблежено к реальности.Ну или стало лень. Ну так как в реальности надо проводами сначала врубить зажигание, это подать массу на один провод а там их 120, все разноцветные. потом подать плюс на два провода чтоб покрутить стартером, ну и да еще мозг поменять надо на свой) Была идея чтоб человек не туда подает массу или питание у него сгорал предохранитель, и потом ищи какой пред сгорел)) короче симулятор так симулятор )
Блин ну норм 4 месяца)))) у меня терпения не хватает, делаю какие то механики отдельно и забрасываю)