Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ActivateKeyboardLayout не работает

41K
01 февраля 2011 года
kisssko
108 / / 28.10.2010
Ситуация такова: есть в меру навороченная клава с колесом, как у мыши,
и есть самописная прога, которая глобально отслеживает нажатия клавиш.
Эмуляция вращения колеса мыши работает без проблем,
но вот раскладка по нажатию на колесо переключаться не хочет.
Пробовал ворианты ActivateKeyboardLayout((HKL)HKL_NEXT, 0); и
ActivateKeyboardLayout((HKL)HKL_NEXT, KLF_SETFORPROCESS);. Не помогло.
277
01 февраля 2011 года
arrjj
1.7K / / 26.01.2011
LoadKeyboardLayout пробывал? А что возвращает ActivateKeyboardLayout((HKL)HKL_NEXT, 0);?
535
01 февраля 2011 года
Нездешний
537 / / 17.01.2008
Сначала нужно вызвать LoadKeyboardLayout
[QUOTE=MSDN]The input locale identifier must have been loaded by a previous call to the LoadKeyboardLayout function[/QUOTE]
41K
01 февраля 2011 года
kisssko
108 / / 28.10.2010
Цитата: Нездешний
Сначала нужно вызвать LoadKeyboardLayout



Необязательно. Это если нужно дополнительные раскладки подгрузить.
А мне то нужны стандартные (рус/англ), которые уже настроенны в системе.

277
01 февраля 2011 года
arrjj
1.7K / / 26.01.2011
Что возвращается у тебя ActivateKeyboardLayout((HKL)HKL_NEXT, 0)? HKL текущей раскладки или 0?
41K
01 февраля 2011 года
kisssko
108 / / 28.10.2010
Цитата: arrjj
LoadKeyboardLayout пробывал? А что возвращает ActivateKeyboardLayout((HKL)HKL_NEXT, 0);?



Возвращает то, что и должен возвращать -- циклически два значения (хэндлы раскладок) по очереди, при каждом вызове.
Тут ещё выяснилось, что оно даже переключает раскладки.
Но вот переключает оно для себя. А мне надо для всех (или для приложения активного окна). Тоесть, мне нужен аналог нажатия правых CTRL+SHIFT (или левых ALT+SHIFT, смотря у кого как настроено).
При этом указание во втором параметре 0, либо KLF_SETFORPROCESS(0x00000100) ничего не меняет.

Хотя, я сразу не заметил, но в MSDN сказано:

Цитата:
This function only affects the layout for the current process or thread.



В таком случае как переключить раскладку глобально?

Как вариант остаётся только непосредственно эмулировать нажатия правых CTRL+SHIFT. Но это уже самый последний вариант, ибо изврат.

277
01 февраля 2011 года
arrjj
1.7K / / 26.01.2011
Ищеш хендл активного окна и посылаешь ему Crtl+Shift (или AltShift)
41K
01 февраля 2011 года
kisssko
108 / / 28.10.2010
Цитата: arrjj
Ищеш хендл активного окна и посылаешь ему Crtl+Shift (или AltShift)



И чем тогда этот способ лучше глобальной отправки нажатий (через keybd_event, или SendInput)?
Тем более, не факт, что нажатие комбинаций клавиш, переключающих раскладку,
обрабатывается именно приложением, а не ОС.

277
01 февраля 2011 года
arrjj
1.7K / / 26.01.2011
Цитата: kisssko
И чем тогда этот способ лучше глобальной отправки нажатий (через keybd_event, или SendInput)?
Тем более, не факт, что нажатие комбинаций клавиш, переключающих раскладку,
обрабатывается именно приложением, а не ОС.



Ага, чёт я пургу сморозил, сорь)

41K
04 февраля 2011 года
kisssko
108 / / 28.10.2010
Решение найдено!

Цитата:
PostMessage(GetForegroundWindow(), WM_INPUTLANGCHANGEREQUEST, 2, 0);


И никаких ActivateKeyboardLayout не надо.

584
26 июля 2012 года
brodotsky
33 / / 25.01.2004
И это не работает.
Судя по всему, GetForegroundWindow возвращает окно нашей программы, а не то окно, для которого мы хотим переключить раскладку.
Опять получается, что программа переключает раскладку для самой себя.
41K
03 августа 2012 года
kisssko
108 / / 28.10.2010
GetForegroundWindow возвращает хэндл активного окна (которое в фокусе), а не только окно вызывающего процесса.
А если программа переключает раскладку для самой себя - значит просто её окно в фокусе.

Это точно работает! Программа, использующая этот способ, в настоящий момент загружена и активно используется (у меня).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог