Смена текущей раскладки клавиатуры

Обсуждение программ nnCron и nnCron LITE

Смена текущей раскладки клавиатуры

Postby bigcrush » Wed, 04 Apr 2007, 11:33

Каким образом можно программно сменить текущую раскладку клавиатуры? Пробывал ActivateKeyboardLayout, как написано в MSDN, но раскладка не меняется. Не понятно какой процесс/поток является текущим, когда выполняется задание. Такое впечатление, что раскладка меняется не для того процесса, окно, которого активно.
bigcrush
 
Posts: 24
Joined: Wed, 02 Mar 2005, 11:19

Postby Yury Zhukov » Wed, 04 Apr 2007, 12:01

Правильное впечатление, читайте MSDN
The ActivateKeyboardLayout function sets the input locale identifier (formerly called the keyboard layout handle) for the calling thread or the current process.
Это делается через внедрение в процесс своей DLL через хук.
Yury Zhukov
 
Posts: 243
Joined: Thu, 16 Jun 2005, 09:22
Location: Москва

Postby VoidVolker » Wed, 04 Apr 2007, 22:59

Если надо печатать в окнах - то SEND-STRING идеально для этого подходит - про раскладку можно забыть.
Code: Select all
\ Жмет нампад-цифру
: xnkdu DUP specKeyDN specKeyUP ;   ( x+96 -- )

\ Жмет нампад-цифру по ANSCII коду цифры по адресу addr
: ankdu  C@ 48 + xnkdu ;   ( addr -- )

\ Печатает одиночный символ
: SEND-SMB   { \ a -- }   ( код-символа -- )
18 specKeyDN
96 xnkdu  N>S  SWAP TO a  0 DO  a I + ankdu  LOOP
18 specKeyUP
;

\ Печатает кавычки
: SND-QUOTE 18 specKeyDN 96 xnkdu 96 xnkdu 99 xnkdu 100 xnkdu  18 specKeyUP ;

\ Берет со стека строку символов и отправляет эти символы активному окну независимо от раскладки клавиатуры
\ Здесь используется одна не очень широко известная возможность винды:
\ зажав альт и набирая на нампаде код символа - активное окно получит этот символ,
\ как если бы на клавиатуре была нажата соответствующая кнопка :)
\ Является универсальным за счет использования локальных переменных, длина строки не ограничена
: SEND-STRING { a u -- }
u 0 DO  a I + C@ SEND-SMB  LOOP
;
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Postby ANR Daemon » Sat, 14 Apr 2007, 15:14

Нифига не понял... Положим, мне надо отправить в окно кнопку F3
Как будет выглядеть код?
ANR Daemon
 
Posts: 234
Joined: Mon, 26 Feb 2007, 22:59

Postby VoidVolker » Tue, 17 Apr 2007, 11:16

Положим, мне надо отправить в окно кнопку F3
Как будет выглядеть код?

Будет нажата кнопка F3:
Code: Select all
S" {F3}" SEND-KEYS

Будет нажата кнопка F, затем 3, т.е. если раскладка русская - то напечатается А3
Code: Select all
S" F3" SEND-KEYS

Будет напечатано F3 независимо от раскладки:
Code: Select all
S" F3" SEND-STRING

А вообще раскладка легко меняется простым эмулированием нажатий клавиш:
Code: Select all
S" @^" SEND-KEYS
альт+шифт
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Postby VoidVolker » Tue, 17 Apr 2007, 11:23

И вообще, че голову морочить раскладкой клавиатуры, когда надо было только кнопку нажать.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Postby ANR Daemon » Sat, 05 May 2007, 10:37

Да я не морочил, просто задал вопрос по ходу обсуждения.
Спасибо, если мне "это" понадобится - буду иметь в виду (пока написал немного другую программу, делающую нечто большее, чем просто нажатие F3).
ANR Daemon
 
Posts: 234
Joined: Mon, 26 Feb 2007, 22:59

Re: Смена текущей раскладки клавиатуры

Postby Cyberik » Tue, 08 Mar 2011, 13:21

\ Берет со стека строку символов и отправляет эти символы активному окну независимо от раскладки клавиатуры
\ Здесь используется одна не очень широко известная возможность винды:
\ зажав альт и набирая на нампаде код символа - активное окно получит этот символ,
\ как если бы на клавиатуре была нажата соответствующая кнопка :)


Очень полезная программка, сам столкнулся в ее надобности.
Хочу только для точности кое чего исправить, Билл Гейтц и его Майкрософт к этой фитче не имеют никакого отношения.
Это особеность PC XT/AT компьютеров и выше, соответственно она работает не только под
windows, но и под dos, unix, *nix, freebsd, и тп.
Еще раз спасибо полезная процедура, приятно что еще кто-то помнит о старых особеностьях компьютеров и используют их когда они полезны.
Cyberik
 
Posts: 5
Joined: Mon, 07 Mar 2011, 14:57

Re: Смена текущей раскладки клавиатуры

Postby VoidVolker » Fri, 08 Jul 2011, 06:55

Кстати, еще стоит попробовать SendInput - оно работает через юникод, поэтому тоже не зависит от раскладки.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Смена текущей раскладки клавиатуры

Postby Wyz » Fri, 08 Jul 2011, 07:39

Code: Select all
0x50 CONSTANT WM_INPUTLANGCHANGEREQUEST
0x419 0 WM_INPUTLANGCHANGEREQUEST GetForegroundWindow SendMessageA

Русский - 0x419, английский - 0x409.
http://msdn.microsoft.com/en-us/library/dd318693(v=vs.85).aspx
Wyz
 
Posts: 389
Joined: Tue, 11 Dec 2007, 01:42

Re: Смена текущей раскладки клавиатуры

Postby Malice » Sun, 10 Jul 2011, 17:09

Если необходимо просто "пролистать" раскладку, можно так:
Code: Select all
0x50 CONSTANT WM_INPUTLANGCHANGEREQUEST
0x0004 CONSTANT INPUTLANGCHANGE_BACKWARD
0x0002 CONSTANT INPUTLANGCHANGE_FORWARD
\ Переключить на предыдущую в системе раскладку | Switch to prev keyboard layout
0 INPUTLANGCHANGE_BACKWARD WM_INPUTLANGCHANGEREQUEST GetForegroundWindow SendMessageA DROP
\ Переключить на следующую в системе раскладку | Switch to next keyboard layout
0 INPUTLANGCHANGE_FORWARD WM_INPUTLANGCHANGEREQUEST GetForegroundWindow SendMessageA DROP

Параметры отсюда: http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Проверил, работает. Можно использовать вместо lswitch.exe – правда, при этом сохраняется работа индикатора на клавиатуре.
P.S.: Wyz, спасибо, твой пост очень помог!
P.P.S.: Интересно, а как узнать текущую раскладку? Ужасно не хочется перекапывать MSDN..
Malice
 
Posts: 5
Joined: Sun, 10 Jul 2011, 16:54
Location: Lipetsk

Re: Смена текущей раскладки клавиатуры

Postby VoidVolker » Sun, 10 Jul 2011, 18:35

А в чем проблема собственно? У меня вот например по капслоку тупо Альт+шифт и раскладка меняется без проблем:
Code: Select all
#( Раскладка
WatchHotKey: "{0x14}"
SingleInstance
: WAIT-KUP   \ ( VK -- )  \ Ждать поднятия кнопки с кодом VK
  BEGIN DUP KEY-PRESSED? WHILE
  50 PAUSE
  REPEAT DROP ;
Action:
VK_SHIFT KEY-PRESSED?
  IF
    0x14 WAIT-KUP
    VK_SHIFT WAIT-KUP
    CapsLock
  ELSE
    0x14 WAIT-KUP
    VK_CAPITAL KEY-TOGGLED?
    IF  CapsLock  THEN
    Alt( Shift )Alt
    \ RUS?
    \ IF
      \ Caps LedOff
    \ ELSE
      \ Caps LedOn
    \ THEN
  THEN
)#
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Смена текущей раскладки клавиатуры

Postby Malice » Sun, 10 Jul 2011, 18:54

VoidVolker wrote:А в чем проблема собственно? У меня вот например по капслоку тупо Альт+шифт и раскладка меняется без проблем:

А если изначально сочетание назначено на CTRL+SHIFT или ctfmon.exe не запущен? Всё же не хочется зависеть от клавиш, как-то мне не очень надёжным кажется использовать посылку комбинации.
Malice
 
Posts: 5
Joined: Sun, 10 Jul 2011, 16:54
Location: Lipetsk

Re: Смена текущей раскладки клавиатуры

Postby Wyz » Sun, 10 Jul 2011, 18:55

Для гуевых окон - GetKeyboardLayout.
Для гуя и консоли можно ставить хук и ловить HSHELL_LANGUAGE, но у меня определение периодически клинит в консоли (переключалка капслоком с индикацией) и приходится перезапускать ctfmon.
Чисто для консоли вроде бы есть ConsolepGetLangId, но я в прошлый раз кажется ниасилил...
Wyz
 
Posts: 389
Joined: Tue, 11 Dec 2007, 01:42

Re: Смена текущей раскладки клавиатуры

Postby Malice » Mon, 11 Jul 2011, 23:47

Wyz wrote:Для гуевых окон - GetKeyboardLayout.

Code: Select all
WINAPI: GetKeyboardLayout USER32.DLL
USER-VALUE tmpY
0 GetKeyboardLayout TO tmpY
MSG: "%tmpY%"

Всегда даёт одно и то же число, 67699721 (4090409h) вне зависимости от языка. Что я делаю не так? Числу 0x409 вроде бы соответствует United States...

По предыдущему коду. Иногда по какой-то причине капс-лок (если назначить переключение на это клавишу) всё же включается. Ищу причины. И способы заблокировать совсем.
Malice
 
Posts: 5
Joined: Sun, 10 Jul 2011, 16:54
Location: Lipetsk

Next

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 3 guests