Обновить
0
Влад@zombie47

Пользователь

Отправить сообщение

Исправил косяк. Не я а Клод.

Что не работало и почему:

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

hwnd := WinActive("A")
if !hwnd
    return

; Берём сфокусированный контрол внутри окна (например поле ввода в диалоге)
focusedHwnd := ControlGetFocus("A")
if focusedHwnd
    hwnd := focusedHwnd

threadId := DllCall("GetWindowThreadProcessId", "Ptr", hwnd, "UInt*", 0, "UInt")
hkl      := DllCall("GetKeyboardLayout", "UInt", threadId, "UPtr")
langId   := hkl & 0xFFFF
target   := (langId = RU) ? EN : RU
targetHKL := DllCall("LoadKeyboardLayout", "Str", Format("{:08X}", target), "UInt", 0, "UPtr")
if !targetHKL
    targetHKL := (target << 16) | target

; Для обычных окон
DllCall("PostMessage", "Ptr", hwnd, "UInt", 0x50, "Ptr", 0, "Ptr", targetHKL)

; Для системных/привилегированных окон (Win+R, диалоги открытия файлов и т.д.)
DllCall("ActivateKeyboardLayout", "UPtr", targetHKL, "UInt", 0)

}

Вот конкретно его исправления:

Конкретно добавил 3 вещи:

1. Получение сфокусированного контрола внутри окна:

autohotkey

focusedHwnd := ControlGetFocus("A")
if focusedHwnd
    hwnd := focusedHwnd

2. Загрузка настоящего HKL через системную функцию вместо ручного сдвига битов:

autohotkey

targetHKL := DllCall("LoadKeyboardLayout", "Str", Format("{:08X}", target), "UInt", 0, "UPtr")
if !targetHKL
    targetHKL := (target << 16) | target

3. Системный вызов переключения раскладки в дополнение к PostMessage:

autohotkey

DllCall("ActivateKeyboardLayout", "UPtr", targetHKL, "UInt", 0)

Самое главное из этих трёх — именно пункт 3, он решает проблему с Win+R и диалогами. Остальные два — улучшения надёжности.

Блин еще один косяк. Когда жму Save as где нибудь в каком нибудь приложении и нужно ввести название файла тоже не меняется раскладка с этим скриптом.

Нашел косяк. Keil Uvision 5.36.0.0
в приложении смена языка работает, но если жмем CTL+F открываем окно поиска, и там не работает переключение языка через клаву вообще теперь. Только мышкой в трее.

Спасибо огромное автору! У меня вообще по жесткачу было. Я просто комп не выключаю вообще месяцами. Я подумал клава плохая, купил дорогую, проблема не ушла))). Думаю ну может я нажимаю быстро слишком и тупит. Реестр правил не помогло, Иногда по 10 раз нажимал пытался переключить. Сколько ты нервов сберег людям!)

Вот появились NFT и думаю не буду старым консервативным дедом. Надо следить за трендами. Говорю себе разберись в чем прикол NFT. Почитал повникал, не понял, и так пару раз. Вроде понял, но все же не понял. Притом что в криптовалютах как раз более менее все понятно. И вот тут выходит эта статья которая говорит, что я все правильно понял) Ну или покрайней мере просто мое мнение совпадает с мнением автора статьи.

Мдауж вот это уровень. Уровень тот к которому я наверно хочу придти) Ну знание всего и вся, разводка плат, досканально электронику, программирование под винду, программирование мк) Да еще и такой уровень инженерии. Новаторство по сути.
Тоже планировал написать на хабре статью первую, там конечно детский лепет по сравнению с этим.

тут нужна команда, этому учит образование в сша работать в команде и не учит образование в РФ.

Это видимо особенность нашего образования, когда не учат уверенности. Нет я не боюсь начинать заниматься чем либо совсем. Возможно я не так ставлю цели. У меня нет цели сделать игру, так как я понимаю нужно много усилий приложить. Например первая цель у меня была научиться понять как делать рубку деревьев, подбор предметов в инвентарь как в диабло2. Ну так как у меня не было цели сделать анимацию персонажа то я просто взял готовый, так как я знаю как это работает и мне это не интересно, мне интересен именно код и результат. С нуля сделать инвентарь как в диабло 2 тяжко поэтому я нашел скачал, и начал разбираться в коде, мне нужно было увеличить размер и еще что то. И вот я там мучался переписывал, рубил деревья вставлял звук, устранял баги. Игры как таковой не было, персонаж просто двигался по 2д карте, ходил спереди или сзади дерева, рубил его, и собирал предметы в инвентарь. Ну как я понял принцип как это делается цель впринципе достигнута и интерес пропал.
А вторую не так давно делал уже в 3д, мне было интересно понять насколько сложно сделать симулятор угона авто, притом что я знаю как запускать тачки по электрике без ключа) Ну тачку я могу сам сделать в 3д но зачем, если есть хорошие готовые, поэтому я качнул, сделал чтоб двери открывались, потом сделал чтоб не открывались пока не разбиты стекла. Потом при клике на стекла сделал чтоб подменялась моделька на битое стекло, и если стекло разбито то дверь можно было открыть и сесть в тачку. Все дальше я не смог придумать как в игровой манере сделать запуск авто проводами приблежено к реальности.Ну или стало лень. Ну так как в реальности надо проводами сначала врубить зажигание, это подать массу на один провод а там их 120, все разноцветные. потом подать плюс на два провода чтоб покрутить стартером, ну и да еще мозг поменять надо на свой) Была идея чтоб человек не туда подает массу или питание у него сгорал предохранитель, и потом ищи какой пред сгорел)) короче симулятор так симулятор )

Блин ну норм 4 месяца)))) у меня терпения не хватает, делаю какие то механики отдельно и забрасываю)

Информация

В рейтинге
7 120-й
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Дата рождения
Зарегистрирован
Активность