Консультация онлайн # 161034

Раздел: Assembler
Автор вопроса: Rodbarid
Дата: 20.02.2009, 21:20 Консультация неактивна
Поступило ответов: 1
Здравствуйте. Я - начинающий, поэтому, вероятно, вопрос покажется наивным. Но. Подскажите пожалуйста код с комментариями: как получить текущую (активную) раскладку клавиатуры? Заранее благодарен.
Здравствуйте, Rodbarid!
Так понимаю, речь идет о программе под Windows. Заглядываем в MSDN и находим ответ:
Чтобы получить активную раскладку клавиатуры, спрашиваем
Код
  invoke GetKeyboardLayout, dwLayout

где dwLayout - идентификатор потока, для которого спрашиваем раскладку клавиатуры
Для текущего достаточно указать 0

Функция возвращает в младшем слове EAX (в AX) - идентификатор языка и
в старшем слове - handle устойства клавиатура
Нам нужно только AX. В приложении приведены некоторые из идентификаторов

Приложение:


Лысков Игорь Витальевич

Советник
21.02.2009, 00:17
Нет оценки ответа

Мини-форум консультации # 161034

неизвестный

177189

= общий =    20.02.2009, 23:54
Забыл добавить, что система MS-DOS
Лысков Игорь Витальевич

Советник

ID: 7438

177197

= общий =    21.02.2009, 01:30
Увидел существенное дополнение уже после того, как отправил ответ.
К сожалению, ИМХО, под ДОС-ом нет стандартного способа узнать раскладку клавиатуры.
Если надо контролировать раскладку, то могу предложить написать свой вектор
отработки 9-го вектора (в теле основной программы), с полной или частичной отработкой раскладок и управляющих клавиш.
Тогда уж точно Ваша программа будет в курсе текущей раскладки...
Или еще вариант навскидку: узнаем, где отработчик хранит признак раскладки (дизассемблируем, трассируем...)
Адрес отработчика мы знаем, вот и анализируем признак раскладки в коде отработчика...Такой вот хакерский способ...
Только вот вопрос: зачем Вам это надо? Почему нельзя просто анализировать получаемый код?
=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Зенченко Константин Николаевич

Старший модератор

ID: 31795

177438

= общий =    23.02.2009, 12:35
Лысков Игорь Витальевич & Rodbarid :
Вариант навскидку не проходит, только что просканировал область данных Bios-Dos(0000:0400-0000:0800 -адреса с запасом), думаю именно там и должно хранится это значение, если оно есть. При вооде строки и попытке переключится на другую раскладку различными комбинциями (shift-ctrl-alt)*(левый-правый) строка вводится как: код символа(EN)+скан код и т.д.. Сама область данных Bios-Dos практически не изменяется, за исключением буфера ввода Bios и указателей на начало и конец этого буфера.
Думаю за переключение раскладки клавиатуры отвечает та или инаная оболчка-программа и это значение хранится именно в ней.

Есть возможность получить только информацию о национальном формате (int 21h - 65h) или о кодовой странице (int 21h - 66h).
smile
=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile
Лысков Игорь Витальевич

Советник

ID: 7438

177441

= общий =    23.02.2009, 12:57

Думаю за переключение раскладки клавиатуры отвечает та или инаная оболчка-программа и это значение хранится именно в ней.


Совершенно верно. Именно это я и имел в виду.
=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
неизвестный

177977

= общий =    26.02.2009, 21:16
Огромное спасибо всем, кто ответил. Теперь я догадываюсь, что можно сделать. smile
Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.