Что нового

Корректная обработка клавиш при смене раскладки

Dima1337

Осваивающий
Сообщения
186
Репутация
24
Доброго времени суток.
Такая проблема, я покупал свой ноутбук не в россии и потому у меня французская расскаладка клавиатуры основная. Однако пользуюсь и английской и русской. Вопрос в том что при установке клавиши "A" английской клавиатуры при переключении на французскую выдает тоже "A" вместо "Q". Как проверять раскладку клавиатуры?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
_WinAPI_GetKeyboardLayout()
 
Автор
Dima1337

Dima1337

Осваивающий
Сообщения
186
Репутация
24
А где можно справку почитать по нему? Уже пробовал но не получается туда французский вставить :-\
 
A

Alofa

Гость
OffTopic:
В Win7:
Панель управления --> Часы, язык и регион --> Язык и региональные стандарты --> (вкладка) Язык клавиатуры --> Изменить клавиатуру... --> (вкладка) Общие --> (Выбираете) Французский --> Удалить.
Затем здесь же:
Добавить --> Французский (франция) --> Клавиатура --> Французская --> Показать --> Ok.

Это не Autoit-ное решение, но думаю вам это пригодится.

... + Эта тема.
 
Автор
Dima1337

Dima1337

Осваивающий
Сообщения
186
Репутация
24
Наверное если я дам пример то будет на много понятнее...
Код:
$key = InputBox("test",'')

While 1
	Send($key)
	Sleep(3000)
WEnd


У кода французкой раскладки есть буквы "040С".
Как это запихнуть в:
Код:
While 1
	Switch _WinGetKeyboardLayout(WinGetHandle("[ACTIVE]"))
		Case 0409
			;
		Case 0419
			;
		Case 040С
			;
    EndSwitch
WEnd

Func _WinGetKeyboardLayout($hWnd)
    Local $aRet = DllCall("user32.dll", "long", "GetWindowThreadProcessId", "hwnd", $hWnd, "ptr", 0)
    $aRet = DllCall("user32.dll", "long", "GetKeyboardLayout", "long", $aRet[0])

    Return "0000" & Hex($aRet[0], 4)
EndFunc

Справки не нашел. А по огрызкам из чужих скриптов совсем ничего не собирается...
 
A

Alofa

Гость
Код:
;~ #RequireAdmin
#include <Array.au3>
#include <WinAPISys.au3>

Global $Flag, $Lang, $sText, $aData = _WinAPI_GetKeyboardLayoutList()

_ArrayDisplay($aData, 'Список включенных в ОС языков ввода.')

If IsArray($aData) Then
	For $i = 1 To $aData[0] ; Ищем нужный код "0x040C040C". По результатам отображается соответствующее окно.
		$Lang = BitAND($aData[$i], 0xFFFF)
		Switch $Lang
			Case 2060, 3084, 4108, 5132, 6156, 1036
				If Not StringInStr($aData[$i], '0x040C', 2) Then
					$sText = 'У Вас включена НЕправильная Французская раскладка!' & @CRLF & @CRLF & 'Хотите включить Правильную?'
					$Flag = 68
				Else
					$sText = 'У Вас включена Правильная Французская раскладка!'
					$Flag = 64
					ExitLoop
				EndIf
			Case Else
				$sText = 'У Вас не включен Французский!' & @CRLF & @CRLF & 'Хотите включить Его?'
				$Flag = 20
		EndSwitch
	Next
EndIf

Switch MsgBox($Flag, '', $sText)
	Case 6 ; Да
		_WinAPI_LoadKeyboardLayout(0x040C, BitOR($KLF_ACTIVATE, $KLF_REPLACELANG, $KLF_SETFORPROCESS))
		If _WinAPI_SetKeyboardLayout(WinGetHandle(AutoItWinGetTitle()), 0x040C, $INPUTLANGCHANGE_SYSCHARSET) Then MsgBox(64, '', 'Успех!')

#cs================= Это дополнение на случай если после выхода из ОС или перезагрузки все вернулось в первоначальное состояние. ====================
		Local $sPath = StringRegExpReplace(RegRead('HKCU\Software\Microsoft\Windows Search\ProcessedSearchRoots\0000', ''), '.+?\{(.+)\}\/?', '\1')

		If $sPath Then
			Local $KeyNs[1]
			$SectName2 = 'HKU\' & $sPath & '\Software\Microsoft\CTF\SortOrder\AssemblyItem\0x0000040c\{34745C63-B2F0-4784-8B67-5E12C8701A31}\00000000'
			
			RegWrite($SectName2, 'CLSID', 'REG_SZ', '{00000000-0000-0000-0000-000000000000}')
			RegWrite($SectName2, 'KeyboardLayout', 'REG_DWORD', '67896332')
			RegWrite($SectName2, 'Profile', 'REG_SZ', '{00000000-0000-0000-0000-000000000000}')
			
			$SectName1 = 'HKU\' & $sPath & '\Software\Microsoft\CTF\SortOrder\Language'
			$SectName2 = 'HKU\' & $sPath & '\Keyboard Layout\Preload'
			
			$i = 2
			While 1
				$Var = RegRead($SectName2, $i)
				If $Var Then
					ReDim $KeyNs[UBound($KeyNs) + 1]
					$KeyNs[$i - 2] = $Var
				Else
					$KeyNs[$i - 2] = '0000040c'
					ExitLoop
				EndIf
				$i += 1
			WEnd
			_ArraySort($KeyNs)
			RegWrite($SectName1, StringFormat('%08s', UBound($KeyNs)), 'REG_SZ', '0000040c')
			For $i = 0 To UBound($KeyNs) - 1
				RegWrite($SectName2, $i + 2, 'REG_SZ', $KeyNs[$i])
			Next
		EndIf
#ce==================================================================================================================================================
EndSwitch


Идентификаторы возвращаемые функцией "_WinAPI_GetKeyboardLayoutList()" имеют примерно следующий вид:
"0x04090C0C", где:
  • [0x] - префикс,
  • [0409] - раскладка клавиатуры (или одна из раскладок) активированная для данного языка,
  • [0C0C] - применяемый язык ввода текста.


Добавлено:
Сообщение автоматически объединено:

Ps: Прошу знающих людей проверить скрипт и высказать критику.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Верх