|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как поменять раскладку клавиатуры через AutoIt на заданную? |
|
|
[решено] Как поменять раскладку клавиатуры через AutoIt на заданную?
|
Старожил Сообщения: 186 |
Профиль | Отправить PM | Цитировать Добрый день! Вариант send("!+") не подойдет, потому что нужно определить, какая раскладка у клавиатуры в данный момент, а потом высылать "!+" 1 или 0 раз.
Лучше же всего вообще обойтись без send. Как взаимодействовать с языковой панелью у меня нет даже идеи) Вообще задача такая: |
|
Отправлено: 09:47, 07-11-2009 |
Старожил Сообщения: 367
|
Профиль | Отправить 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 |
------- Отправлено: 10:49, 07-11-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 206
|
Профиль | Отправить PM | Цитировать @kaster
В последней версии WinAPIEx.au3 уже используются не строковые значения для указания языка, а целочисленные - LCID константы. |
Отправлено: 15:31, 07-11-2009 | #3 |
Старожил Сообщения: 367
|
Профиль | Отправить PM | Цитировать Yashied, да, это я уде опосля понял нашел в твое либе эти функции. а то что привел выше это из оффорума. наглец даже не указал откуда взял
|
------- Отправлено: 15:36, 07-11-2009 | #4 |
Старожил Сообщения: 186
|
Профиль | Отправить PM | Цитировать А как быть, если я создаю inputbox, в нем по умолчанию язык станет русским. Как поменять на английский?
Если так: то невозможно правильно указать $hWnd. Если так: то сначала исчезнет инпутбокс... Попробовал поменять так: но что-то не меняется, а ошибки не вижу. |
|
Отправлено: 17:54, 08-11-2009 | #5 |
Старожил Сообщения: 307
|
Профиль | Отправить PM | Цитировать Раньше я делал переключение расскладки клавиатуры, и заметил одно, что в таких окнах (если это окно на данный момент активно), как inputbox, или в окне Запуск программы (если нажать Пуск --> Выполнить), в Диспетчере задач windows и еще в некоторых, переключение расскладки с помощью такого способа (имеется ввиду способ описанный в примере kasterа или с помощью этого же способа, но использования библиотеки WinAPIEx.au3) не работает (Windows наверно думает что она умнее и поэтому расскладка клавиатуры в таких окнах не изменяется ), жалко что расскладку таким образом можно менять только в отдельном окне, хенд которого узнается, а не вобще, ибо если бы было что то наподобие как в windows меняется расскладка (shift+alt у меня), то было бы гораздо проще. А так поменял расскладку в каком то окне, запустил inputbox, а windows бах, и поставила какая до этого была установлена раскладка с помощью тех таки клавиш (shift+alt)... а другого способа наверное нет?.......
|
------- Отправлено: 22:02, 08-11-2009 | #6 |
Старожил Сообщения: 367
|
Профиль | Отправить 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 Аналогично можешь ставить какую угодно раскладку, и совершенствовать скрипт для мониторинга под свои нужны. Это первое что пришло в голову |
------- Отправлено: 22:44, 08-11-2009 | #7 |
Старожил Сообщения: 206
|
Профиль | Отправить PM | Цитировать |
Отправлено: 16:06, 09-11-2009 | #8 |
Старожил Сообщения: 367
|
Профиль | Отправить PM | Цитировать все гениальное просто
|
------- Отправлено: 16:21, 09-11-2009 | #9 |
Старожил Сообщения: 206
|
Профиль | Отправить PM | Цитировать На самом деле это не есть хорошо. При смене раскладки клавиатуры системой посылаются сообщения WM_INPUTLANGCHANGE..., так вот, AutoIt окна, те что созданы с помощью GUICreate(), эти сообщения не обрабатывают. Только скрытое окно. В этом можно убедиться, применив _WinAPI_SetKeyboardLayout() к любому AutoIt-овскому окну, ничего не произойдет.
|
Отправлено: 17:04, 09-11-2009 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|