Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как поменять раскладку клавиатуры через AutoIt на заданную?

Ответить
Настройки темы
[решено] Как поменять раскладку клавиатуры через AutoIt на заданную?

Старожил


Сообщения: 186
Благодарности: 4

Профиль | Отправить PM | Цитировать


Добрый день! Вариант send("!+") не подойдет, потому что нужно определить, какая раскладка у клавиатуры в данный момент, а потом высылать "!+" 1 или 0 раз.
Лучше же всего вообще обойтись без send.
Как взаимодействовать с языковой панелью у меня нет даже идеи)

Вообще задача такая:

Код: Выделить весь код
... ; запомнить, какой была ракладка до начала "махинаций"
$str1=inputbox("1","2", "") ; при вводе в этот инпутбокс сделать раскладку английской
$str2=inputbox("1","2", "") ; при вводе в этот инпутбокс сделать раскладку русской
... ; вернуть ракладку в первоначальное состояние

Отправлено: 09:47, 07-11-2009

 

Аватара для kaster

Старожил


Сообщения: 367
Благодарности: 91

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
Global $Rus = '00000419'; Раскладка русского языка
Global $Eng = '00000409'; Раскладка английского языка
Global $hWnd = WinGetHandle('AutoIt Help'); Находишь хендл своего окна
$def_lang = _WinAPI_GetKeyboardLayout($hWnd); Запоминаешь раскладку до "махинаций"
_WinAPI_SetKeyboardLayout($Rus, $hWnd); Ставишь язык на русским и делаешь что-то
_WinAPI_SetKeyboardLayout($Eng, $hWnd); Ставишь язык на английский и делаешь что-то
_WinAPI_SetKeyboardLayout($def_lang, $hWnd); Ставишь язык на начальный

Func _WinAPI_GetKeyboardLayout($hWnd)
	Local $Ret = DllCall('user32.dll', 'long', 'GetWindowThreadProcessId', 'hwnd', $hWnd, 'ptr', 0)
	If (@error) Or ($Ret[0] = 0) Then
		Return SetError(1, 0, 0)
	EndIf
	$Ret = DllCall('user32.dll', 'long', 'GetKeyboardLayout', 'long', $Ret[0])
	If (@error) Or ($Ret[0] = 0) Then
		Return SetError(1, 0, 0)
	EndIf
	Return '0000' & Hex($Ret[0], 4)
EndFunc   ;==>_WinAPI_GetKeyboardLayout

Func _WinAPI_SetKeyboardLayout($sLayout, $hWnd)
	If Not WinExists($hWnd) Then
		Return SetError(1, 0, 0)
	EndIf
	Local $Ret = DllCall('user32.dll', 'long', 'LoadKeyboardLayout', 'str', StringFormat('%08s', StringStripWS($sLayout, 8)), 'int', 0)
	If (@error) Or ($Ret[0] = 0) Then
		Return SetError(1, 0, 0)
	EndIf
	DllCall('user32.dll', 'ptr', 'SendMessage', 'hwnd', $hWnd, 'int', 0x0050, 'int', 1, 'int', $Ret[0])
	Return SetError(0, 0, 1)
EndFunc   ;==>_WinAPI_SetKeyboardLayout

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:49, 07-11-2009 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Yashied

Старожил


Сообщения: 206
Благодарности: 88

Профиль | Отправить PM | Цитировать


@kaster

В последней версии WinAPIEx.au3 уже используются не строковые значения для указания языка, а целочисленные - LCID константы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:31, 07-11-2009 | #3


Аватара для kaster

Старожил


Сообщения: 367
Благодарности: 91

Профиль | Отправить PM | Цитировать


Yashied, да, это я уде опосля понял нашел в твое либе эти функции. а то что привел выше это из оффорума. наглец даже не указал откуда взял

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru


Отправлено: 15:36, 07-11-2009 | #4


Старожил


Сообщения: 186
Благодарности: 4

Профиль | Отправить PM | Цитировать


А как быть, если я создаю inputbox, в нем по умолчанию язык станет русским. Как поменять на английский?
Если так:

Код: Выделить весь код
_WinAPI_SetKeyboardLayout($hWnd, $Eng) 
inputbox(1,1)
то невозможно правильно указать $hWnd. Если так:
Код: Выделить весь код
inputbox(1,1)
_WinAPI_SetKeyboardLayout($hWnd, $Eng)
то сначала исчезнет инпутбокс...

Попробовал поменять так:

читать дальше »
Код: Выделить весь код
#include <File.au3>
; Декларируем константы
Global $Rus = 0x0419 
Global $Eng = 0x0409 
Global $Chn = 0x0804
Global $InputBoxTitle = "InputBox"

; код файла, который запустим
$Code='#Include <WinAPIEx.au3>' & @CRLF & _
'Global $Rus = 0x0419' & @CRLF & _
'Global $Eng = 0x0409' & @CRLF & _
'Global $Chn = 0x0804 '& @CRLF & _
'Global $InputBoxTitle = "InputBox"'& @CRLF & _
'WinWait ($InputBoxTitle)'& @CRLF & _
'Global $hWnd = WinGetHandle($InputBoxTitle, "")'& @CRLF & _
'$def_lang = _WinAPI_GetKeyboardLayout($hWnd)'& @CRLF & _
'_WinAPI_SetKeyboardLayout($hWnd, $Eng)'
'WinSetTitle($hWnd,"","123321")' ; это чтобы знать, что $hWnd найден верно


$FilePath=@DesktopDir & "\ChangeLang.au3"
_FileCreate( $FilePath) ; создаем файл
FileWrite( $FilePath,$Code) ; пишем туда $code
ShellExecute($FilePath) ; запускаем его, по идее он должен дождаться окна с заголовком "InputBox" и поменять там язык на английский
inputbox($InputBoxTitle,1)
FileDelete ($FilePath) ; удаляем файл

но что-то не меняется, а ошибки не вижу.

Отправлено: 17:54, 08-11-2009 | #5


Аватара для beve

Старожил


Сообщения: 307
Благодарности: 137

Профиль | Отправить PM | Цитировать


Раньше я делал переключение расскладки клавиатуры, и заметил одно, что в таких окнах (если это окно на данный момент активно), как inputbox, или в окне Запуск программы (если нажать Пуск --> Выполнить), в Диспетчере задач windows и еще в некоторых, переключение расскладки с помощью такого способа (имеется ввиду способ описанный в примере kasterа или с помощью этого же способа, но использования библиотеки WinAPIEx.au3) не работает (Windows наверно думает что она умнее и поэтому расскладка клавиатуры в таких окнах не изменяется ), жалко что расскладку таким образом можно менять только в отдельном окне, хенд которого узнается, а не вобще, ибо если бы было что то наподобие как в windows меняется расскладка (shift+alt у меня), то было бы гораздо проще. А так поменял расскладку в каком то окне, запустил inputbox, а windows бах, и поставила какая до этого была установлена раскладка с помощью тех таки клавиш (shift+alt)... а другого способа наверное нет?.......

-------
Не в кількості знань полягає освіта, а в повному розумінні і вмілому використанні того, що знаєш.


Отправлено: 22:02, 08-11-2009 | #6


Аватара для kaster

Старожил


Сообщения: 367
Благодарности: 91

Профиль | Отправить PM | Цитировать


Т.к. в AutoIt нет многопоточности, могу посоветовать перед запуском InputBox запустить еще один скрипт, которые будет ждать окна с нужным заголовком, а после того, как дождется, поменяет там раскладку.
Примерно так.
Готовишь вспомогательный скрипт следующего содержания
Код: Выделить весь код
Global $Rus = '00000419'; Раскладка русского языка
Global $Eng = '00000409'; Раскладка английского языка
While 1
	If WinExists('InputBoxTitle', '') Then
		$hWnd = WinGetHandle('InputBoxTitle', '')
		;MsgBox(0, '', 'Got it')
		_WinAPI_SetKeyboardLayout($Rus, $hWnd)
		ExitLoop
	EndIf
	Sleep(100)
WEnd

Func _WinAPI_GetKeyboardLayout($hWnd)
	Local $Ret = DllCall('user32.dll', 'long', 'GetWindowThreadProcessId', 'hwnd', $hWnd, 'ptr', 0)
	If (@error) Or ($Ret[0] = 0) Then
		Return SetError(1, 0, 0)
	EndIf
	$Ret = DllCall('user32.dll', 'long', 'GetKeyboardLayout', 'long', $Ret[0])
	If (@error) Or ($Ret[0] = 0) Then
		Return SetError(1, 0, 0)
	EndIf
	Return '0000' & Hex($Ret[0], 4)
EndFunc   ;==>_WinAPI_GetKeyboardLayout

Func _WinAPI_SetKeyboardLayout($sLayout, $hWnd)
	If Not WinExists($hWnd) Then
		Return SetError(1, 0, 0)
	EndIf
	Local $Ret = DllCall('user32.dll', 'long', 'LoadKeyboardLayout', 'str', StringFormat('%08s', StringStripWS($sLayout, 8)), 'int', 0)
	If (@error) Or ($Ret[0] = 0) Then
		Return SetError(1, 0, 0)
	EndIf
	DllCall('user32.dll', 'ptr', 'SendMessage', 'hwnd', $hWnd, 'int', 0x0050, 'int', 1, 'int', $Ret[0])
	Return SetError(0, 0, 1)
EndFunc   ;==>_WinAPI_SetKeyboardLayout
Он будет непрерывно мониторить нужное тебе окно. Как только оно появится, немедленно поменяет в нем раскладку на нужную. Вот к примеру нужное
Код: Выделить весь код
InputBox('InputBoxTitle', 'Russian text')
Аналогично можешь ставить какую угодно раскладку, и совершенствовать скрипт для мониторинга под свои нужны. Это первое что пришло в голову

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru


Отправлено: 22:44, 08-11-2009 | #7


Аватара для Yashied

Старожил


Сообщения: 206
Благодарности: 88

Профиль | Отправить PM | Цитировать


Все намного проще. Для изменения раскладки для любого окна созданного в AutoIt (в том числе и InputBox()), нужно изменить раскладку для скрытого окна AutoIt.

Код: Выделить весь код
AutoItWinSetTitle('MyAutoItTitle')
_WinAPI_SetKeyboardLayout(WinGetHandle(AutoItWinGetTitle()), 0x0419)
InputBox(...)
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:06, 09-11-2009 | #8


Аватара для kaster

Старожил


Сообщения: 367
Благодарности: 91

Профиль | Отправить PM | Цитировать


все гениальное просто

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru


Отправлено: 16:21, 09-11-2009 | #9


Аватара для Yashied

Старожил


Сообщения: 206
Благодарности: 88

Профиль | Отправить PM | Цитировать


На самом деле это не есть хорошо. При смене раскладки клавиатуры системой посылаются сообщения WM_INPUTLANGCHANGE..., так вот, AutoIt окна, те что созданы с помощью GUICreate(), эти сообщения не обрабатывают. Только скрытое окно. В этом можно убедиться, применив _WinAPI_SetKeyboardLayout() к любому AutoIt-овскому окну, ничего не произойдет.

Отправлено: 17:04, 09-11-2009 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как поменять раскладку клавиатуры через AutoIt на заданную?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Debian/Ubuntu - [решено] Как поменять раскладку клавиатуры в Ubuntu Arassir Общий по Linux 5 16-03-2016 14:49
Интернет - [решено]IE 8.0 меняет раскладку клавиатуры в зависимости от открытой страницы. roadinfo Microsoft Windows Vista 6 24-03-2009 13:03
Невозможно переключить раскладку клавиатуры. Solker Лечение систем от вредоносных программ 5 19-06-2008 23:09
C/C++ - Как из С++ Билдера программно поменять раскладку? S1stem Программирование и базы данных 1 30-01-2008 00:35
как изменить раскладку клавиатуры с En на Ru? Guest Microsoft Windows 95/98/Me (архив) 11 14-01-2003 14:09




 
Переход