Что нового

Как изменить раскладку по умолчанию с помощью AutoIt?

Suppir

Продвинутый
Сообщения
967
Репутация
62
Есть функция, позволяющая узнать раскладку по умолчанию:

Код:
Func GetDefaultLayout()
	If @KBLayout = 00000419 Or @KBLayout = 0419 Then Return 1
	If @KBLayout = 00000409 Or @KBLayout = 0409 Or @KBLayout = 0809  Or @KBLayout = 00000809 Then Return 0
EndFunc



А вот как поменять раскладку по умолчанию на русский язык?

Подозреваю, что для этого нужно поменять что-то в реестре.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: В поле ввода русский текст вставляется козябрами, а английский нормально

Suppir [?]
В буфере обмена у меня есть определенный текст
Как он туда попадает? Попробуй вручную скопировать текст с русскими символами и послать Send("+{INS}") (отдельным скриптом).
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
CreatoR

дело в том, что его невозможно скопировать вручную. Получаю с помощью WinGetText().

Я разобрался в чем дело. При вызове функции WinGetText() необходимо, чтобы раскладка по умолчанию стояла русская. Тогда проблем не возникает. Вот только как быстро поменять раскладку на русскую (а потом обратно)?

Как менять текущую раскладку я знаю, но нужно менять именно раскладку по умолчанию.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Suppir [?]
дело в том, что его невозможно скопировать вручную. Получаю с помощью WinGetText().
Я имел в виду чтобы ты скопировал любой текст с любого места, пусть даже с блокнота, но с русскими символами, так, ради проверки.

Я разобрался в чем дело. При вызове функции WinGetText() необходимо, чтобы раскладка по умолчанию стояла русская. Тогда проблем не возникает. Вот только как быстро поменять раскладку на русскую (а потом обратно)?
Я уверен что достаточно сменить раскладку исходящего (текущего) приложения:

Код:
_WinAPI_LoadKeyboardLayout(0x0409)

$sText = WinGetText("title")

Func _WinAPI_LoadKeyboardLayout($sLayoutID, $hWnd = 0)
	Local Const $WM_INPUTLANGCHANGEREQUEST = 0x50
	Local $aRet = DllCall("user32.dll", "long", "LoadKeyboardLayoutW", "wstr", Hex($sLayoutID, 8), "int", 0)
	
	If Not @error And $aRet[0] Then
		If $hWnd = 0 Then
			$hWnd = WinGetHandle(AutoItWinGetTitle())
		EndIf
		
		DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $aRet[0])
		Return 1
	EndIf
	
	Return SetError(1)
EndFunc
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
CreatoR

Да нет, недостаточно. Необходима именно раскладка по умолчанию. Причем, если я просто изменю раскладку по умолчанию, то все равно вставляются козябры. Необходимо перезапустить скрипт, и только тогда он начинает работать нормально.

Т.е. необходимо, чтобы перед запуском скрипта стояла русская раскладка по умолчанию. Наверное, AutoIt при запуске из реестра читает какие-то данные.


madmasles

Ваш метод меняет актуальную раскладку клавиатуры (синхронизирует с раскладкой по умолчанию). Я в нескольких скрипта успешно использовал этот метод. Однако в данном случае скрипт не работает ни при каких условиях кроме следующего:
- в момент запуска скрипта должна стоять русская раскладка по умолчанию

Скорее всего, при запуска скрипта AutoIt считывает некоторые данные из реестра (в том числе и раскладку по умолчанию) и больше их не проверяет.


66149023.png



Изменение текущей раскладки ничего не дает.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Suppir [?]
необходимо, чтобы перед запуском скрипта стояла русская раскладка по умолчанию.
Аесли сменить раскладку у окна Словарь?

Не помешало бы выложить программу и скрипт воспроизведения проблемы.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
CreatoR
- от изменения раскладки в момент вставки в словарь ничего не меняется;
- обе программы по несколько гигабайт - выложить не получится, к сожалению.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
madmasles

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


p.s. интересно понять принцип - почему же вставляются козябры, хотя в блокнот или в word текст вставляется нормально.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Suppir [?]
а как программно сменить раскладку по умолчанию?
Вроде в этой ветке HKEY_CURRENT_USER\Keyboard Layout\Preload ключ "1" отвечает. Но не знаю, работают ли изменения без перезагрузки.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
CreatoR
техподдержка говорит, что это "Windows виновато" (как всегда).

madmasles
спасибо, попробую!
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Удалось решить эту задачу!!!

Я понял, что проблема заключается при вставке в буфер значения. Вместо
ClipPut("line")

я использовал

_ClipBoard_SetData($line, $CF_TEXT)

И все заработало. Дело в том, что при использовании ClipPut() кроме собственно переменной в буфер пишутся какие-то метаданные (о раскладке клавиатуры и т.п.). А с помощью _ClipBoard_SetData пишется исключительно $line в формате "простой текст" (и никаких метаданных). Это сработало :smile:
 
Верх