Что нового

Как сменить раскладку клавиатуры (не язык)

Dm666

Осваивающий
Сообщения
221
Репутация
48
Имеется windows 7, сама по себе на голландском.
В системе стоит 2 языка ввода, Русский и Английский США. В английском установлены 2 раскладки клавиатуры США и США интернациональная
США Интернациональная нужна для работы Punto Switcher. Если ее выпилить, то Punto перестает автоматически переключать языки. При этом США Интернациональная обладает одним противным свойством: символы кавычек набираются исключительно парами после двойного нажатия на кнопку. То есть, чтобы набрать символ ' надо дважды нажать кнопку кавычек чтобы получить '', а потом еще и BackSpace чтобы убрать лишнюю кавычку. Такое количество лишних телодвижений приводит в неконтролируемое бешенство :stars:
Поэтому при написании скриптов переключаю раскладку на просто США, в ней все нормально набирается.
Процесс хочется автоматизировать :smile:
Хочется средствами AutoIT научиться переключать раскладки. То есть переключаться между выделенными раскладками.

Думаю надо копать в сторону _WinAPI_SetKeyboard* но что-то не получается ничего внятного...
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
По Alt+Shift это не переключается?
Что если на кавычку повесить горячую клавишу ввода кавычки?
 
Автор
Dm666

Dm666

Осваивающий
Сообщения
221
Репутация
48
AltShift настроить-то можно, не вопрос. Просто идея была это все как-то автоматизировать. Чтобы в фоне висел скрипт и при активации окна Скайта проверял бы раскладку. Если International - то переключал бы в просто USA... Ну и хотелось бы чтобы не через Send, а как-нибудь более надежно.
AZJIO [?]
Что если на кавычку повесить горячую клавишу ввода кавычки?
А вот эта идея интересная :smile: Тоже вариант. Спасибо, бум пробовать!
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
_WinAPI_LoadKeyboardLayoutEx теперь в справке есть, "Устанавливает раскладку клавиатуры для указанного окна"
 
Автор
Dm666

Dm666

Осваивающий
Сообщения
221
Репутация
48
Она вроде только языки переключает Рус<>Англ. Раскладки не меняет. Либо я пользоваться не умею :-\
Ладно, будем копать дальше
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Поэтому я и спросил, по Alt+Shift переключается, чтобы выяснить оно или нет. Для меня это и есть раскладка клавиатуры.
Я добавил как на скрине, не работает, поэтому добавил новый США-международный просто третьим языком. Теперь функция будет на него переключать.
 
Автор
Dm666

Dm666

Осваивающий
Сообщения
221
Репутация
48
Нашел решение. Полез в настройки переключений, там можно и на каждую раскладку свою отдельную кнопку прикрутить. Раньше не обращал внимания на такую возможность.

Так вроде работает. Просто посылать в Scite Ctrl+Shift+9 и всё будет :ok:

AZJIO [?]
добавил новый США-международный просто третьим языком.
А можно скрин как это выглядит? У меня так не получается.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Я добавил азербайжанский язык, в него добавил дополнительный США и удалил внутри азербайжанский.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Как языки, так и раскладки можно переключить с помощью функции _WinAPI_SetKeyboardLayout(). Всю информацию по языкам/раскладкам несет второй параметр. Что бы узнать, какие раскладки у вас установлены в данный момент, используйте функцию _WinAPI_GetKeyboardLayoutList().
 
Автор
Dm666

Dm666

Осваивающий
Сообщения
221
Репутация
48
AZJIO [?]
Я добавил азербайжанский язык, в него добавил дополнительный США и удалил внутри азербайжанский.
Хитрый ход. :smile: Возьму на заметку.


Yashied [?]
Как языки, так и раскладки можно переключить с помощью функции _WinAPI_SetKeyboardLayout(). Всю информацию по языкам/раскладкам несет второй параметр. Что бы узнать, какие раскладки у вас установлены в данный момент, используйте функцию _WinAPI_GetKeyboardLayoutList().
Спасибо, все получилось. Так и пробовал с самого начала, проблема была в том, что по умолчанию _WinAPI_GetKeyboardLayoutList() возвращает десятичные значения, и их-то я и пытался скормить в _WinAPI_SetKeyboardLayout() :-[.
Перевел в Hex и все заработало

Код:
_WinAPI_SetKeyboardLayout($hWnd,0x0419); rus
_WinAPI_SetKeyboardLayout($hWnd,0x4090409); US
_WinAPI_SetKeyboardLayout($hWnd,0x0020409); US international


Yashied, AZJIO - благодарю за помощь :beer:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Dm666 сказал(а):
Перевел в Hex и все заработало.

А какая разница? Это ведь просто представление числа. _WinAPI_SetKeyboardLayout() работает с числовыми значениями и ей без разницы hex или не hex. В более ранних версиях WinAPIEx, да, эта функция требовала строковое представление.
 
Автор
Dm666

Dm666

Осваивающий
Сообщения
221
Репутация
48
Yashied [?]
А какая разница? Это ведь просто представление числа.
Вот примерно так я и думал, когда подставлял в _WinAPI_SetKeyboardLayout() десятичные значения. :smile:
Сейчас проврил еще раз, вот пример:
Код:
#Region ;************ Includes ************
#include <WinAPIEx.au3>
#include <Array.au3>
#EndRegion ;************ Includes ************

HotKeySet("{Esc}","_Exit")

Dim $p = 1000

Run("Notepad")
WinWaitActive("[CLASS:Notepad]")
$hWnd = WinGetHandle("[CLASS:Notepad]")

$aLayout = _WinAPI_GetKeyboardLayoutList()
For $i = 1 To $aLayout[0]
	_WinAPI_SetKeyboardLayout($hWnd,$aLayout[$i])
	Send(@CRLF & '->' & $aLayout[$i]&@CR)
	Send("Real layout "& _WinAPI_GetKeyboardLayout($hWnd)& @CRLF)
	Sleep($p)
Next

_WinAPI_SetKeyboardLayout($hWnd, 0x0020409) ; int
Send(@CRLF & '0x0020409 USA international'& @CR)
Send("Real layout "& _WinAPI_GetKeyboardLayout($hWnd)& @CRLF)
Sleep($p)

_WinAPI_SetKeyboardLayout($hWnd, 0x0419) ; ru
Send(@CRLF & '0x0419 RUS'& @CR)
Send("Real layout "& _WinAPI_GetKeyboardLayout($hWnd)& @CRLF)
Sleep($p)

_WinAPI_SetKeyboardLayout($hWnd, 0x4090409) ; us
Send(@CRLF & '0x4090409 USA'& @CR)
Send("Real layout "& _WinAPI_GetKeyboardLayout($hWnd)& @CRLF)
Sleep($p)

Func _Exit()
	Exit
EndFunc

У меня _WinAPI_GetKeyboardLayoutList() возвращает 3 значения:
67699721
-268368887
68748313

В цикле Real Layout все 3 раза один и тот же, в зависимости от дефолтной раскладки. При подстановке Hex значений Real Layout четко меняется.

Не исключено конечно что я просто что-то не так делаю, такое бывает довольно часто :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я сейчас не могу проверить. Вы можете показать мне, что возвращает функция Hex() для значений из массива? Возможно, что это проблема с Hex() для типа UINT_PTR, т.к. в 3.3.6.1 все нормально работало.

И еще попробуйте запустить скрипт в WOW64.
 
Автор
Dm666

Dm666

Осваивающий
Сообщения
221
Репутация
48
Yashied [?]
Вы можете показать мне, что возвращает функция Hex() для значений из массива?
Если я правильно понял вопрос....
Код:
Hex($aLayout[$i])
возвращает соответственно
0000000004090409
FFFFFFFFF0010409
0000000004190419
Все издевательства производились над Windows 7 Ultimate x64
AutoIt 3.3.8.0
WinAPIEx 3.8 / 3.3.8.0

Попробовал на виртуальной WinXP Pro x32 из-под VMWare, результаты схожие
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Проблема в Hex(), которая была изменена в 3.3.8.0.
 
Верх