Что нового

Переключение раскладки для IE8

avmir

Новичок
Сообщения
28
Репутация
1
День добрый!
Господа, пожалуйста, помогите разобраться новичку.

Есть простенький код

Код:
#include <IE.au3>
#Include <WinAPI.au3>
#Include <WinAPIEx.au3>

Opt("WinTitleMatchMode", 2)

_IECreate ("http://www.yandex.ru", 0, 1, 1, 1)
$IEHandle = WinGetHandle("Windows Internet Explorer", "Яндекс")
_WinAPI_SetKeyboardLayout ($IEHandle, 0x0419)


Казалось бы, что он должен создать окно IE, в первой вкладке открыть ссылку "www.yandex.ru" и переключить в этом окне раскладку на русскую (по умолчанию раскладка Английская).
НО, не тут то было...

Может быть вся загвоздка в том, что у каждой вкладки IE8 своя раскладка клавиатуры?
Подскажите, как это обойти?
 

AZJIO

Меценат
Меценат
Сообщения
2,891
Репутация
1,195
avmir
проверь с этим готовым скриптом

Код:
#include <IE.au3>
Opt("WinTitleMatchMode", 2)
_IECreate ("http://www.yandex.ru", 0, 1, 1, 1)

$win_handle = WinGetHandle("Windows Internet Explorer", "Яндекс")
_SetKeyboardLayout("00000419", $win_handle)

; переключение раскладки клавиатуры
Func _SetKeyboardLayout($sLayoutID, $hWnd)
    Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)
    DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWnd, "int", 0x50, "int", 1, "int", $ret[0])
EndFunc



а это оригинальный пример:

Код:
Run ("notepad.exe")
WinWaitActive ("Безымянный - Блокнот")
$win_handle = WinGetHandle ("Безымянный - Блокнот")

;~ переключение в английскую раскладку
_SetKeyboardLayout("00000409", $win_handle)
Send ("English")

;~ переключение в русскую раскладку
_SetKeyboardLayout("00000419", $win_handle)
Send (@CRLF & "Русский")
    Sleep (200)

WinClose ("Безымянный - Блокнот")
WinWaitActive ("Блокнот", "Текст в файле Безымянный был изменен.")
$win_handle = WinGetHandle ("Блокнот", "Текст в файле Безымянный был изменен.")
    Sleep (200)

;~ выбор кнопки нет вызовом ALT+н (буква Н - русская)
Send ("!{н}")

Func _SetKeyboardLayout($sLayoutID, $hWnd)
    Local $WM_INPUTLANGCHANGEREQUEST = 0x50
    Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)
    DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWnd, _
                                                "int", $WM_INPUTLANGCHANGEREQUEST, _
                                                "int", 1, _
                                                "int", $ret[0])
EndFunc
 
Автор
A

avmir

Новичок
Сообщения
28
Репутация
1
AZJIO, предложенный Вами вариант сработал. Спасибо!
Но, не можете ли Вы мне разжевать, чем отличается функция из библиотеки WinAPIEx.au3

Код:
Func _WinAPI_SetKeyboardLayout($hWnd, $iLanguage)

	If Not _WinAPI_IsWindow($hWnd) Then
		Return SetError(1, 0, 0)
	EndIf

	Local $Ret = DllCall('user32.dll', 'long', 'LoadKeyboardLayout', 'str', '0000' & Hex($iLanguage, 4), 'int', 0)

	If (@error) Or (Not $Ret[0]) Then
		Return SetError(1, 0, 0)
	EndIf
	DllCall('user32.dll', 'ptr', 'SendMessage', 'hwnd', $hWnd, 'uint', 0x0050, 'int', 1, 'int', $Ret[0])
	Return SetError(0, 0, 1)
EndFunc   ;==>_WinAPI_SetKeyboardLayout


и предложенная Вами функция

Код:
; переключение раскладки клавиатуры
Func _SetKeyboardLayout($sLayoutID, $hWnd)
    Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)
    DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWnd, "int", 0x50, "int", 1, "int", $ret[0])
EndFunc


в плане вызова DllCall. Почему же первая не работает?

И еще, вопрос не по теме - существует ли функция для открытия вкладок в IE? Если нет, то как это сделать?
 

AZJIO

Меценат
Меценат
Сообщения
2,891
Репутация
1,195
avmir [?]
в плане вызова DllCall. Почему же первая не работает?
Может Yashied обратит внимание, UDF его. В требованиях указано SP2, может из-за версий.
А я просто скопировал один из трёх вариантов переключения раскладки, самый простой и надёжный. Пример был выложен `p r o x y на ru-board'e
 

Yashied

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

Код:
#include <IE.au3>
#Include <WinAPI.au3>
#Include <WinAPIEx.au3>

Opt("WinTitleMatchMode", 2)

_IECreate ("http://www.yandex.ru", 0, 1, 1, 1)
$IEHandle = WinGetHandle("Windows Internet Explorer", "Яндекс")
_WinAPI_SetKeyboardLayout ($IEHandle, 0x0419)


Казалось бы, что он должен создать окно IE, в первой вкладке открыть ссылку "www.yandex.ru" и переключить в этом окне раскладку на русскую (по умолчанию раскладка Английская).
НО, не тут то было...

В IE7 и во всех других браузерах у меня этот код прекрасно работает, а в IE8 - нет. Более того, в IE8 я не могу переключить раскладку даже вручную...



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

Разобрался, все прекрасно заработало (см. скриншот).




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

avmir сказал(а):
Но, не можете ли Вы мне разжевать, чем отличается функция из библиотеки WinAPIEx.au3

Отличается только заголовком, может быть именно в этом проблема? У меня прекрасно работает и то, и другое.
 
Автор
A

avmir

Новичок
Сообщения
28
Репутация
1
Спасибо за подсказку :smile:

Но вот в чем вопрос, предложенная товарищем AZJIO функция прекрасно сработала и без поддержки текстовых служб (чекбоксик указанный Вами был пустой) :-[
а она, на мой взгляд, практически не оличается от Вашей (где же я ошибаюсь... не отличается, но сработала)
 
Верх