Что нового

Как поменять раскладку в окне (rus/eng) в Windows 7 (32 бит)

pvnn

Осваивающий
Сообщения
305
Репутация
32
В XP переключать раскладку проблем не вызывает
А как можно переключить раскладку в Win 7

Вот пример, прекрасно работающий в XP и не работающий в 7

Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 343, 114, 192, 114)
$Input1 = GUICtrlCreateInput("", 16, 32, 313, 21)
$Button1 = GUICtrlCreateButton("Eng", 80, 72, 75, 25)
$Button2 = GUICtrlCreateButton("Rus", 168, 72, 75, 25)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			$ret=DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", "00000409", "int", 0)
			DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $Form1, "int", "0x50", "int", 1, "int", $ret[0])
			GUICtrlSetState ($Input1,$GUI_FOCUS)
		Case $Button2
			$ret=DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", "00000419", "int", 0)
			DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $Form1, "int", "0x50", "int", 1, "int", $ret[0])
			GUICtrlSetState ($Input1,$GUI_FOCUS)
	EndSwitch
WEnd
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
pvnn

Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>


$Form1 = GUICreate("Form1", 343, 114, 192, 114)
$Input1 = GUICtrlCreateInput("", 16, 32, 313, 21)
$Button1 = GUICtrlCreateButton("Eng", 80, 72, 75, 25)
$Button2 = GUICtrlCreateButton("Rus", 168, 72, 75, 25)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			$ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", "00000409", "int", 0)
			DllCall("user32.dll", "ptr", "SendMessage", "hwnd", GUICtrlGetHandle($Input1), "int", "0x50", "int", 1, "int", $ret[0])
			GUICtrlSetState($Input1, $GUI_FOCUS)
		Case $Button2
			$ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", "00000419", "int", 0)
			DllCall("user32.dll", "ptr", "SendMessage", "hwnd", GUICtrlGetHandle($Input1), "int", "0x50", "int", 1, "int", $ret[0])
			GUICtrlSetState($Input1, $GUI_FOCUS)
	EndSwitch
WEnd
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
WSWR а если нет в окне $Input1 = GUICtrlCreateInput("", 16, 32, 313, 21) как переключить раскладку?

Мне нужно переключить раскладку у окна, даже если на нем нет контролов
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
pvnn,
Код:
#include <GUIConstantsEx.au3>
#include <APIConstants.au3>;http://autoit-script.ru/index.php/topic,47.0.html

$hForm = GUICreate('Test', 343, 114)
$nInput = GUICtrlCreateInput('', 16, 32, 313, 21)
$nBtnEn = GUICtrlCreateButton('Eng', 80, 72, 75, 25)
$nBtnRu = GUICtrlCreateButton('Rus', 168, 72, 75, 25)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nBtnEn
			Local $aRet = DllCall('user32.dll', 'uint_ptr', 'LoadKeyboardLayoutW', 'wstr', '00000409', 'uint', BitOR($KLF_SETFORPROCESS, $KLF_ACTIVATE));0x00000101
			If @error Then ContinueLoop
			ConsoleWrite(Hex($aRet[0], 4) & @LF)
			GUICtrlSetState($nInput, $GUI_FOCUS)
		Case $nBtnRu
			Local $aRet = DllCall('user32.dll', 'uint_ptr', 'LoadKeyboardLayoutW', 'wstr', '00000419', 'uint', BitOR($KLF_SETFORPROCESS, $KLF_ACTIVATE))
			If @error Then ContinueLoop
			ConsoleWrite(Hex($aRet[0], 4) & @LF)
			GUICtrlSetState($nInput, $GUI_FOCUS)
	EndSwitch
WEnd
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Может быть это подойдёт?
Обход проблемы с HotKeySet/Accelerators при разных раскладках клавиатуры
Код:
;Вот эта строчка задаёт английскую раскладку клавиатуры для нашего приложения
_WinAPI_LoadKeyboardLayoutEx(0x0409)
;...
Func _WinAPI_LoadKeyboardLayoutEx($sLayoutID = 0x0409, $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
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
alex33 Обход проблемы с HotKeySet/Accelerators при разных раскладках клавиатуры
Работает только в XP. Для Win 7 к сожалению не подошел.


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

madmasles Спасибо большое! Ваш вариант прекрасно работает в двух операционных системах.


Тема решена. Всем кто откликнулся Большое СПАСИБО!
 
Верх